fortissimo-html
Version:
Fortissimo HTML - Flexible, Forgiving, Formatting HTML Parser
73 lines (70 loc) • 2.78 kB
JavaScript
;
/* This file is meant to be stringified and used as ES5-compatible JavaScript. */
Object.defineProperty(exports, "__esModule", { value: true });
exports.addCopyListener = exports.getCopyScript = exports.copyScriptAsIIFE = void 0;
// tslint:disable prefer-const
// tslint:disable no-var-keyword
const wsReplacements = {
'·': ' ',
'↵\n': '\n',
'↧\f': '\f',
'␍\r': '\r',
'␍↵\r\n': '\r\n',
'•': '\xA0'
};
exports.copyScriptAsIIFE = `(function() {
var wsReplacements = ${JSON.stringify(wsReplacements)};
${restoreWhitespaceStrict.toString()}
${restoreWhitespace.toString()}
(${addCopyListener.toString()})();
})();
`.replace(/cov_\w+\.\w(\[\d+\])+\+\+[;,]/g, ''); // Remove code-coverage changes that might get embedded in the code.
function getCopyScript(prefix = 'fh-') {
return exports.copyScriptAsIIFE.replace("'fh-'", "'" + prefix + "'");
}
exports.getCopyScript = getCopyScript;
function restoreWhitespaceStrict(s) {
return s.replace(/[^ \n\r\t\f\xA0]/g, function (ch) { return ch === '·' ? ' ' : ch === '•' ? '\xA0' : ''; });
}
function restoreWhitespace(s) {
return s.replace(/·|↵\n|↧\f|␍\r|␍↵\r\n|•|↵|↧|␍|�/g, function (ws) {
return wsReplacements[ws] || '';
});
}
function addCopyListener(prefix) {
prefix = prefix || 'fh-';
var doc = document.querySelector('.' + prefix + 'html');
if (!doc)
return;
doc.addEventListener('copy', function (event) {
var selection = document.getSelection();
var newSelection;
var copied = false;
if (selection.anchorNode && selection.getRangeAt) {
try {
var nodes = selection.getRangeAt(0).cloneContents().childNodes;
var parts = [];
/* nodes isn't a "real" array - no forEach! */
for (var i = 0; i < nodes.length; ++i) {
var node = nodes[i];
if (node.classList && (node.classList.contains(prefix + 'invalid') ||
node.classList.contains(prefix + 'whitespace')))
parts.push(restoreWhitespaceStrict(node.innerText));
else if (node.localName === 'span')
parts.push(node.innerText);
else
parts.push(node.nodeValue);
}
newSelection = parts.join('');
copied = true;
}
catch (err) { }
}
if (!copied)
newSelection = restoreWhitespace(selection.toString());
event.clipboardData.setData('text/plain', newSelection);
event.preventDefault();
});
}
exports.addCopyListener = addCopyListener;
//# sourceMappingURL=copy-script.js.map