User:Torana/typography.js

// typography fix // dynamically turns the substitute characters " and ' into the typographically correct ones (primes or “curly” quotes and apostrophes) when reading. // Author: Terry Ngai; Source: https://greasyfork.org/de/scripts/28804-smart-quotes

(function { var textnodes, node, s;

textnodes = document.evaluate( "//body//text[not(ancestor::pre) and not(ancestor::textarea) and not(ancestor::code) and not(ancestor::input) and not(ancestor::script)]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

for (var i = 0; i < textnodes.snapshotLength; i++) { node = textnodes.snapshotItem(i); s = node.textContent; s = s.replace(/'''/g, "‴"); s = s.replace(/(\W|^)"(\S)/g, "$1“$2");     s = s.replace(/(\u201c[^"]*)"([^"]*$|[^\u201c"]*\u201c)/g, "$1”$2");      s = s.replace(/([^0-9])"/g, "$1”"); s = s.replace(/''/g, "″"); s = s.replace(/(\W|^)'(\S)/g, "$1‘$2"); s = s.replace(/([a-z])'([a-z])/gi, "$1’$2"); s = s.replace(/((\u2018[^']*)|[a-z])'([^0-9]|$)/gi, "$1’$3"); s = s.replace(/(\u2018)([0-9]{2}[^\u2019]*)(\u2018([^0-9]|$)|$|\u2019[a-z])/gi, "’$2$3"); s = s.replace(/(\B|^)\u2018(?=([^\u2019]*\u2019\b)*([^\u2019\u2018]*\W[\u2019\u2018]\b|[^\u2019\u2018]*$))/gi, "$1’"); s = s.replace(/'/g, "′"); node.data = s; }

});

//