Handle paragraph breaks in the share extension preview text
This commit is contained in:
@ -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();
|
||||
|
||||
Reference in New Issue
Block a user