diff --git a/assets/js/ragadjust.js b/assets/js/ragadjust.js new file mode 100644 index 0000000..5fb0c35 --- /dev/null +++ b/assets/js/ragadjust.js @@ -0,0 +1,126 @@ +// based on Nathan Ford's Ragadjust +// https://github.com/nathanford/ragadjust +// "Use it however you like. I'll add a GPL I think as soon as I can." licence + +// Forked by Yann Trividic and Nicolas Taffin +// https://github.com/yanntrividic/ragadjustfr + +// TODO: +// Make the tool language independant by supporting the lang attribute +// cleanup the code a bit (maybe get rid of the dictionary thing?) + +// Elements in those lists have to be unique in order for the exceptions to work +// French prepositions +arts = ["un", "une", "le", "la", "les", "du", "de", "des", "au", "aux"]; +dets = ["ce", "ces", "cet", "cette", "mes", "tes", "ses", "mon", "ton", "ma", "ta", "son", "sa", "notre", "votre", "leur", "nos", "vos", "leurs"]; +prons = ["je", "tu", "il", "elle", "on", "nous", "vous", "ils", "elles"]; +conjs = ["mais", "où", "et", "donc", "or", "ni", "car", "ou", "que"]; +short = ["à", "y", "en", "de", "sur", "par"]; +preps = ["après", "avant", "avec", "chez", "concernant", "contre", "dans", "depuis", "derrière", "dès", "durant", "entre", "hormis", "jusqu’à", "jusque", "loin", "malgré", "moyennant", "outre", "parmi", "pour", "près", "sans", "selon", "sous", "suivant", "touchant", "très", "vers"]; + +// English prepositions +// preps = /(\s|^|>)((aboard|about|above|across|after|against|along|amid|among|anti|around|before|behind|below|beneath|beside|besides|between|beyond|concerning|considering|despite|down|during|except|excepting|excluding|following|from|inside|into|like|minus|near|onto|opposite|outside|over|past|plus|regarding|round|save|since|than|that|this|through|toward|towards|under|underneath|unlike|until|upon|versus|with|within|without)\s)+/gi, + +case_sensitivity = true; + +make_case_sensitive = function(l) { + title_case = []; + l.forEach(function (item, i) { + var word = l[i]; + word = word[0].toUpperCase() + word.slice(1); + title_case.push(word); + }); + return l.concat(title_case); +} + +get_regex_from_array_of_words = function(l, exceptions) { + exceptions.forEach(function (item, i) { + if (l.indexOf(item) != -1) { + l.splice(l.indexOf(item), 1); + } + }); + reg = case_sensitivity ? make_case_sensitive(l).join("|") : l.join("|") + //console.log(reg) + return reg +} + +build_regex_from_words = function(l, exceptions) { + return new RegExp("(\\s|^|>| | )(((" + get_regex_from_array_of_words(l, exceptions) + ")(\\s))+)" , 'gi'); +} + +ragadjust = function(s, method, exceptions = [], content = null) { + + console.log("ragadjust elements", s, "following those methods:", method) + + if(content) { + doc = content; + } else { + doc = document; + } + + if (doc.querySelectorAll) { + + var eles = doc.querySelectorAll(s), + elescount = eles.length, + + dictionary = { // Is used to perform the same operations over each of those words + "articles": build_regex_from_words(arts, exceptions), + "determiners": build_regex_from_words(dets, exceptions), + "pronouns": build_regex_from_words(prons, exceptions), + "conjunctions": build_regex_from_words(conjs, exceptions), + "short_prepositions": build_regex_from_words(short, exceptions), + "prepositions": build_regex_from_words(preps, exceptions), + } + + smallwords = /(\s|^)(([a-zA-ZÀ-ž-_(]{1,2}('|’)*[a-zA-ZÀ-ž-_,;]{0,1}?\s)+)/gi, // words with 3 or less characters + + dashes = /([-–—])\s/gi, + + emphasis = /(<(strong|em|b|i)>)(([^\s]+\s*){2,3})?(<\/(strong|em|b|i)>)/gi; + + while (elescount-- > 0) { + + var ele = eles[elescount], + elehtml = ele.innerHTML; + + for (const [key, value] of Object.entries(dictionary)) { + + if (method.indexOf(key) != -1 || method.indexOf('all') != -1) + elehtml = elehtml.replace(value, function(contents, p1, p2) { + return p1 + p2.replace(/\s/gi, ' '); + }); + } + + if (method.indexOf('small-words') != -1 || method.indexOf('all') != -1) + + // replace small words + elehtml = elehtml.replace(smallwords, function(contents, p1, p2) { + return contents.replace(/\s/gi, ' '); + }); + + if (method.indexOf('dashes') != -1 || method.indexOf('all') != -1) + + // replace small words + elehtml = elehtml.replace(dashes, function(contents) { + return contents.replace(/\s/gi, ' '); + }); + + if (method.indexOf('emphasis') != -1 || method.indexOf('all') != -1) + + // emphasized text + elehtml = elehtml.replace(emphasis, function(contents, p1, p2, p3, p4, p5) { + return p1 + p3.replace(/\s/gi, ' ') + p5; + }); + + // doesn't work :( + // if (method.indexOf('orphans') || method.indexOf('all')) + + // // no single words on there own last line + // elehtml = elehtml.replace(orphans, function(contents) { + // return contents.replace(/(\s|^ )/, ' ') + // }); + + ele.innerHTML = elehtml; + } + } +}; diff --git a/assets/js/script.js b/assets/js/script.js index 54bc0ed..3485639 100644 --- a/assets/js/script.js +++ b/assets/js/script.js @@ -146,6 +146,7 @@ function fixFootNotes() { } document.addEventListener("DOMContentLoaded", () => { + ragadjust("h1, h2, h3, h4, h5", ["all"]); window.window.scrollTo({ top: 0, }); diff --git a/site/snippets/header.php b/site/snippets/header.php index c03d4d7..45ab356 100644 --- a/site/snippets/header.php +++ b/site/snippets/header.php @@ -10,6 +10,7 @@ $entryTopPos = $entryTopPos ?? 20; +