diff --git a/apple/Sources/ShareExtension/ShareExtension.js b/apple/Sources/ShareExtension/ShareExtension.js index acff8657f..4581ece82 100644 --- a/apple/Sources/ShareExtension/ShareExtension.js +++ b/apple/Sources/ShareExtension/ShareExtension.js @@ -1,6 +1,6 @@ var ShareExtension = function() {}; -function iconURL() { +const iconURL = () => { try { const previewImage = document.querySelector("meta[property='og:image'], meta[name='twitter:image']").content if (previewImage) { return previewImage } @@ -10,53 +10,89 @@ function iconURL() { return undefined } +const getQuoteText = (containerNode) => { + const nonParagraphTagsRegEx = + /^(a|b|basefont|bdo|big|em|font|i|s|small|span|strike|strong|su[bp]|tt|u|code|mark)$/i + + let textResult = '' + let newParagraph = false + + const getTextNodes = (node) => { + let isPre = false + const nodeElement = (node instanceof HTMLElement) ? node : node.parentElement + if (nodeElement) { + isPre = (window.getComputedStyle(nodeElement).whiteSpace.startsWith('pre')) + } + + if (node.nodeType == 3) { + const text = isPre ? node.nodeValue : node.nodeValue.replace(/\n/g, '') + textResult += text + } else if (node != containerNode) { + if (!nonParagraphTagsRegEx.test(node.tagName)) { + textResult += '\n\n' + } + } + + const children = node.childNodes + children.forEach(function (child){ + getTextNodes(child) + }); + } + + getTextNodes(containerNode) + + return textResult.trim() +} + +const markHighlightSelection = () => { + // First remove any previous markers, this would only normally happen during debugging + try { + const markers = window.document.querySelectorAll( + `span[data-omnivore-highlight-start="true"], + span[data-omnivore-highlight-end="true"]` + ) + + for (let i = 0; i < markers.length; i++) { + markers[i].remove(); + } + } catch (error) { + console.log('remove marker error: ', error) + // This should be OK + } + try { + const sel = window.getSelection() + if (sel.rangeCount) { + const range = sel.getRangeAt(0) + const endMarker = document.createElement("span") + const startMarker = document.createElement("span") + endMarker.setAttribute("data-omnivore-highlight-end", "true") + startMarker.setAttribute("data-omnivore-highlight-start", "true") + + var container = document.createElement("div") + for (var i = 0, len = sel.rangeCount; i < len; ++i) { + container.appendChild(sel.getRangeAt(i).cloneContents()) + } + + const endRange = range.cloneRange() + endRange.collapse(false) + endRange.insertNode(endMarker) + + range.insertNode(startMarker) + + return { + highlightHTML: container.innerHTML, + highlightText: getQuoteText(container) + } + } + } catch(error) { + console.log("get text error", error) + } + return null +} + ShareExtension.prototype = { - markHighlightSelection: () => { - // First remove any previous markers, this would only normally happen during debugging - try { - const markers = window.document.querySelectorAll( - `span[data-omnivore-highlight-start="true"], - span[data-omnivore-highlight-end="true"]` - ) - - for (let i = 0; i < markers.length; i++) { - markers[i].remove(); - } - } catch { - // This should be OK - } - try { - const sel = window.getSelection(); - if (sel.rangeCount) { - const range = sel.getRangeAt(0) - const endMarker = document.createElement("span") - const startMarker = document.createElement("span") - endMarker.setAttribute("data-omnivore-highlight-end", "true") - startMarker.setAttribute("data-omnivore-highlight-start", "true") - - var container = document.createElement("div"); - for (var i = 0, len = sel.rangeCount; i < len; ++i) { - container.appendChild(sel.getRangeAt(i).cloneContents()); - } - - const endRange = range.cloneRange() - endRange.collapse(false) - endRange.insertNode(endMarker) - - range.insertNode(startMarker) - - return { - highlightHTML: container.innerHTML, - highlightText: container.innerText - } - } - } catch(error) { - console.log("ERROR", error) - } - return null - }, run: function(arguments) { - const highlightData = this.markHighlightSelection() + const highlightData = markHighlightSelection() arguments.completionFunction({ 'url': window.location.href, @@ -65,8 +101,8 @@ ShareExtension.prototype = { 'contentType': document.contentType, 'originalHTML': new XMLSerializer().serializeToString(document), ...highlightData - }); + }) } -}; +} var ExtensionPreprocessingJS = new ShareExtension();