Files: ace618ff270ef2a33d54baecce5f928e9e352507 / lib / context-menu-and-spellcheck.js
4485 bytesRaw
1 | var {remote, shell, clipboard, ipcRenderer} = require('electron') |
2 | var {SpellCheckHandler, ContextMenuListener, ContextMenuBuilder} = require('electron-spellchecker') |
3 | var {MenuItem, Menu} = remote |
4 | var ref = require('ssb-ref') |
5 | |
6 | var navigateHandler = null |
7 | module.exports = setupContextMenuAndSpellCheck |
8 | |
9 | function setupContextMenuAndSpellCheck (config, navigate) { |
10 | navigateHandler = navigate |
11 | window.spellCheckHandler = new SpellCheckHandler() |
12 | window.spellCheckHandler.attachToInput() |
13 | |
14 | // Start off as US English, America #1 (lol) |
15 | window.spellCheckHandler.switchLanguage('en-US') |
16 | |
17 | var contextMenuBuilder = new ContextMenuBuilder(window.spellCheckHandler, null, true) |
18 | |
19 | contextMenuBuilder.buildMenuForLink = function (menuInfo) { |
20 | var menu = new Menu() |
21 | var isEmailAddress = menuInfo.linkURL.startsWith('mailto:') |
22 | var isFile = menuInfo.linkURL.startsWith('file:') |
23 | var extractedRef = ref.extract(menuInfo.linkURL) |
24 | |
25 | if (!isFile) { |
26 | var copyLink = new MenuItem({ |
27 | label: isEmailAddress ? this.stringTable.copyMail() : this.stringTable.copyLinkUrl(), |
28 | click: () => { |
29 | // Omit the mailto: portion of the link; we just want the address |
30 | clipboard.writeText(isEmailAddress ? menuInfo.linkText : menuInfo.linkURL) |
31 | } |
32 | }) |
33 | |
34 | var openLink = new MenuItem({ |
35 | label: this.stringTable.openLinkUrl(), |
36 | click: () => { |
37 | shell.openExternal(menuInfo.linkURL) |
38 | } |
39 | }) |
40 | |
41 | menu.append(copyLink) |
42 | menu.append(openLink) |
43 | } |
44 | |
45 | if (extractedRef) { |
46 | if (navigateHandler) { |
47 | menu.append(new MenuItem({ |
48 | label: 'Find Link References', |
49 | click: function () { |
50 | navigateHandler('?' + extractedRef) |
51 | } |
52 | })) |
53 | this.addSeparator(menu) |
54 | } |
55 | var copyRef = new MenuItem({ |
56 | label: `Copy Link Ref (${extractedRef.slice(0, 10)}...)`, |
57 | click: () => { |
58 | // Omit the mailto: portion of the link; we just want the address |
59 | clipboard.writeText(extractedRef) |
60 | } |
61 | }) |
62 | menu.append(copyRef) |
63 | |
64 | if (ref.isBlob(extractedRef) && menuInfo.hasImageContents) { |
65 | var copyEmbed = new MenuItem({ |
66 | label: `Copy Embed Markdown`, |
67 | click: () => { |
68 | // Omit the mailto: portion of the link; we just want the address |
69 | clipboard.writeText(`![${menuInfo.titleText}](${extractedRef})`) |
70 | } |
71 | }) |
72 | menu.append(copyEmbed) |
73 | } |
74 | } |
75 | |
76 | if (this.isSrcUrlValid(menuInfo)) { |
77 | if (!isFile) this.addSeparator(menu) |
78 | this.addImageItems(menu, menuInfo) |
79 | } |
80 | |
81 | this.addInspectElement(menu, menuInfo) |
82 | this.processMenu(menu, menuInfo) |
83 | |
84 | return menu |
85 | } |
86 | |
87 | module.exports.menu = new ContextMenuListener((info) => { |
88 | contextMenuBuilder.buildMenuForElement(info).then((menu) => { |
89 | var element = document.elementFromPoint(info.x, info.y) |
90 | while (element && !element.msg) { |
91 | element = element.parentNode |
92 | } |
93 | |
94 | menu.append(new MenuItem({ |
95 | label: 'Inspect Server Process', |
96 | click: function () { |
97 | ipcRenderer.send('open-background-devtools') |
98 | } |
99 | })) |
100 | |
101 | menu.append(new MenuItem({ |
102 | type: 'separator' |
103 | })) |
104 | |
105 | menu.append(new MenuItem({ |
106 | label: 'Reload', |
107 | click: function (item, focusedWindow) { |
108 | if (focusedWindow) { |
109 | focusedWindow.reload() |
110 | } |
111 | } |
112 | })) |
113 | |
114 | if (element && element.msg) { |
115 | menu.append(new MenuItem({ |
116 | type: 'separator' |
117 | })) |
118 | menu.append(new MenuItem({ |
119 | label: 'Copy Message ID', |
120 | click: function () { |
121 | clipboard.writeText(element.msg.key) |
122 | } |
123 | })) |
124 | if (element.msg.value.content && element.msg.value.content.text) { |
125 | menu.append(new MenuItem({ |
126 | label: 'Copy Message Text', |
127 | click: function () { |
128 | clipboard.writeText(element.msg.value.content.text) |
129 | } |
130 | })) |
131 | } |
132 | menu.append(new MenuItem({ |
133 | label: 'Copy External Link', |
134 | click: function () { |
135 | const key = element.msg.key |
136 | const gateway = config.gateway || |
137 | 'https://viewer.scuttlebot.io' |
138 | const url = `${gateway}/${encodeURIComponent(key)}` |
139 | clipboard.writeText(url) |
140 | } |
141 | })) |
142 | } |
143 | menu.popup(remote.getCurrentWindow()) |
144 | }).catch((err) => { |
145 | throw err |
146 | }) |
147 | }) |
148 | } |
149 |
Built with git-ssb-web