Overview
Comment: | [fx] WebExt: secure function createNode() |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | fx |
Files: | files | file ages | folders |
SHA3-256: |
57f14062ba2245361f09717fc342b105 |
User & Date: | olr on 2017-09-27 11:45:38 |
Other Links: | manifest | tags |
Context
2017-09-27
| ||
12:05 | [fx] WebExt: don’t create menu button if textarea is not visible check-in: 5fc11add34 user: olr tags: trunk, fx | |
11:45 | [fx] WebExt: secure function createNode() check-in: 57f14062ba user: olr tags: trunk, fx | |
11:26 | [fx] WebExt: adaptation to Chrome: conj initialisation (again) check-in: da4865ce6b user: olr tags: trunk, fx | |
Changes
Modified gc_lang/fr/webext/content_scripts/init.js from [70b0a5f3fd] to [46a029346c].
︙ | ︙ | |||
19 20 21 22 23 24 25 | let bChrome = false; if (typeof(browser) !== "object") { var browser = chrome; bChrome = true; } | < < < < < < < < < < < < < < | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | let bChrome = false; if (typeof(browser) !== "object") { var browser = chrome; bChrome = true; } /* function loadImage (sContainerClass, sImagePath) { let xRequest = new XMLHttpRequest(); xRequest.open('GET', browser.extension.getURL("")+sImagePath, false); xRequest.responseType = "arraybuffer"; xRequest.send(); let blobTxt = new Blob([xRequest.response], {type: 'image/png'}); |
︙ | ︙ | |||
97 98 99 100 101 102 103 104 105 106 107 108 109 110 | }, createGCPanel: function () { if (this.oGCPanel === null) { this.oGCPanel = new GrammalecteGrammarChecker("grammalecte_gc_panel", "Grammalecte", 500, 700); this.oGCPanel.insertIntoPage(); } } } /* Connexion to the background */ | > > > > > > > > > > > > > > | 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | }, createGCPanel: function () { if (this.oGCPanel === null) { this.oGCPanel = new GrammalecteGrammarChecker("grammalecte_gc_panel", "Grammalecte", 500, 700); this.oGCPanel.insertIntoPage(); } }, createNode: function (sType, oAttr, oDataset=null) { try { let xNode = document.createElement(sType); Object.assign(xNode, oAttr); if (oDataset) { Object.assign(xNode.dataset, oDataset); } return xNode; } catch (e) { showError(e); } } } /* Connexion to the background */ |
︙ | ︙ |
Modified gc_lang/fr/webext/content_scripts/menu.js from [51ff434365] to [2740b076e9].
1 2 3 4 5 6 7 8 9 | // JavaScript "use strict"; class GrammalecteMenu { constructor (nMenu, xTextArea) { this.sMenuId = "grammalecte_menu" + nMenu; | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | // JavaScript "use strict"; class GrammalecteMenu { constructor (nMenu, xTextArea) { this.sMenuId = "grammalecte_menu" + nMenu; this.xButton = oGrammalecte.createNode("div", {className: "grammalecte_menu_main_button", textContent: " "}); this.xButton.onclick = () => { this.switchMenu(); }; this.xMenu = this._createMenu(xTextArea); this._insertAfter(this.xButton, xTextArea); this._insertAfter(this.xMenu, xTextArea); } _insertAfter (xNewNode, xReferenceNode) { xReferenceNode.parentNode.insertBefore(xNewNode, xReferenceNode.nextSibling); } _createMenu (xTextArea) { try { let xMenu = oGrammalecte.createNode("div", {id: this.sMenuId, className: "grammalecte_menu"}); // Text formatter let xTFButton = oGrammalecte.createNode("div", {className: "grammalecte_menu_item", textContent: "Formateur de texte"}); xTFButton.onclick = () => { this.switchMenu(); oGrammalecte.createTFPanel(); oGrammalecte.oTFPanel.start(xTextArea); oGrammalecte.oTFPanel.show(); }; // lexicographe let xLxgButton = oGrammalecte.createNode("div", {className: "grammalecte_menu_item", textContent: "Lexicographe"}); xLxgButton.onclick = () => { this.switchMenu(); oGrammalecte.createLxgPanel(); oGrammalecte.oLxgPanel.clear(); oGrammalecte.oLxgPanel.show(); oGrammalecte.oLxgPanel.startWaitIcon(); xGrammalectePort.postMessage({ sCommand: "getListOfTokens", dParam: {sText: xTextArea.value}, dInfo: {sTextAreaId: xTextArea.id} }); }; // Grammar checker let xGCButton = oGrammalecte.createNode("div", {className: "grammalecte_menu_item", textContent: "Correction grammaticale"}); xGCButton.onclick = () => { this.switchMenu(); oGrammalecte.createGCPanel(); oGrammalecte.oGCPanel.start(xTextArea); oGrammalecte.oGCPanel.show(); oGrammalecte.oGCPanel.startWaitIcon(); xGrammalectePort.postMessage({ sCommand: "parseAndSpellcheck", dParam: {sText: xTextArea.value, sCountry: "FR", bDebug: false, bContext: false}, dInfo: {sTextAreaId: xTextArea.id} }); }; // Conjugation tool let xConjButton = oGrammalecte.createNode("div", {className: "grammalecte_menu_item_block", textContent: "Conjugueur"}); let xConjButtonTab = oGrammalecte.createNode("div", {className: "grammalecte_menu_button", textContent: "Onglet"}); xConjButtonTab.onclick = () => { this.switchMenu(); xGrammalectePort.postMessage({sCommand: "openConjugueurTab", dParam: null, dInfo: null}); }; let xConjButtonWin = oGrammalecte.createNode("div", {className: "grammalecte_menu_button", textContent: "Fenêtre"}); xConjButtonWin.onclick = () => { this.switchMenu(); xGrammalectePort.postMessage({sCommand: "openConjugueurWindow", dParam: null, dInfo: null}); }; xConjButton.appendChild(xConjButtonTab); xConjButton.appendChild(xConjButtonWin); // Create xMenu.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_menu_header", textContent: "GRAMMALECTE"})); xMenu.appendChild(xTFButton); xMenu.appendChild(xLxgButton); xMenu.appendChild(xGCButton); xMenu.appendChild(xConjButton); //xMenu.appendChild(oGrammalecte.createNode("img", {scr: browser.extension.getURL("img/logo-16.png")})); // can’t work, due to content-script policy: https://bugzilla.mozilla.org/show_bug.cgi?id=1267027 xMenu.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_menu_footer"})); return xMenu; } catch (e) { showError(e); } } |
︙ | ︙ |
Modified gc_lang/fr/webext/content_scripts/panel.js from [48d95d0550] to [d29d130a09].
1 2 3 4 5 6 7 8 9 10 11 12 13 | // JavaScript // Panel creator "use strict"; class GrammalectePanel { constructor (sId, sTitle, nWidth, nHeight, bFlexible=true) { this.sId = sId; this.nWidth = nWidth; this.nHeight = nHeight; this.bFlexible = bFlexible; | | | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | // JavaScript // Panel creator "use strict"; class GrammalectePanel { constructor (sId, sTitle, nWidth, nHeight, bFlexible=true) { this.sId = sId; this.nWidth = nWidth; this.nHeight = nHeight; this.bFlexible = bFlexible; this.xPanelBar = oGrammalecte.createNode("div", {className: "grammalecte_panel_bar"}); this.xPanelContent = oGrammalecte.createNode("div", {className: "grammalecte_panel_content"}); this.xWaitIcon = this._createWaitIcon(); this.xPanel = this._createPanel(sTitle); this.center(); } _createPanel (sTitle) { try { let xPanel = oGrammalecte.createNode("div", {id: this.sId, className: "grammalecte_panel"}); this.xPanelBar.appendChild(this._createButtons()); let xTitle = oGrammalecte.createNode("div", {className: "grammalecte_panel_title"}); xTitle.appendChild(this._createLogo()); xTitle.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_panel_label", textContent: sTitle})); this.xPanelBar.appendChild(xTitle); xPanel.appendChild(this.xPanelBar); xPanel.appendChild(this.xPanelContent); return xPanel; } catch (e) { showError(e); } } _createLogo () { let xImg = document.createElement("img"); xImg.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAC8UlEQVQ4jX3TbUgTcRwH8P89ddu5u9tt082aZmpFEU4tFz0QGTUwCi0heniR9MSUIKRaD0RvIlKigsooo+iNFa0XJYuwIjEK19OcDtPElsG0ktyp591t7u7+vUh7MPX3+vf5/n8/+P0BmKJIPUUVlh2rdVVeesWlzEybqg+bFOsoylnqPmNavGFfknV2Omu2Lvja3vxAURKJib3opHizu8riLK6gjRyuKgmoSoMRFENRUqfXTzvBGK62LC2uoFkOl4RhjQ8+qWt7dPNE3sbdp+2LXbsGe9qb4rIo/BfwFy6nWQ4ThWGNDzbcfu29dMDh2nHU7CypYNLmzTda0/L5cNuzmDQi/A4Y27k6eQxLI79wS/11D0AAMNvs6XT6ojVJjJEgTbMy2BT77xBMp09KcpaWV1uc41jQoi0NdUHfjeOO9WWn7AVF7s7n986SithPJGeupBh2PCSP/xxqxAp3eq6wuUV7Wc6MSZIEhA8vHjbfOe/OcW3zmAuKy+nUzAyD2bow8ODaEROFq8AyZ5WBYdEZXGqGxZ61HJV+9HYCJRbTNA0QBA40HWunaKN5dKg/DBKxeCIe09Th/m4MJwiMSZmLEzMQAABQRuNqgu8NYX3doTcMpvCkLbtQZ2AJkrPOZG1zlnY13T+Hy9EehY90h57eqcorcZ/lctZuMzAsOjLEqwNv66/6vZcPYRBC+C3cGaBxhSet2av1BpYgTTY7k5y2JPT41slIR6Axv8R9nnOs+4Pf+2r992uOxGVJwgAAAEINfgt3BGgsESWtWas1iGDyl+CT/u7WpvxNFRc4x7qtBoZFhSFejb7z1fq9NYfjsiT+cwcQavBruCOgU4SIGo18amuoq3Js3FNlynVtH385+s53ze+t8cRkURx3yMTTRBAEQVAUXbFlf3XystJKA2NExeFBdWASDAAA+MQACCEEmqbJ0b6PMC7JwhDU8YFHV5u9NZ64LErT/oW/63tPV6uJwmKoOND78u7Fg5NhAAD4CVbzY9cwrWQrAAAAAElFTkSuQmCC"; return xImg; } _createButtons () { let xButtonLine = oGrammalecte.createNode("div", {className: "grammalecte_panel_commands"}); xButtonLine.appendChild(this.xWaitIcon); if (this.sId === "grammalecte_gc_panel") { xButtonLine.appendChild(this._createCopyButton()); } xButtonLine.appendChild(this._createMoveButton("stickToTop", "¯", "Coller en haut")); xButtonLine.appendChild(this._createMoveButton("stickToLeft", "«", "Coller à gauche")); xButtonLine.appendChild(this._createMoveButton("center", "•", "Centrer")); xButtonLine.appendChild(this._createMoveButton("stickToRight", "»", "Coller à droite")); xButtonLine.appendChild(this._createMoveButton("stickToBottom", "_", "Coller en bas")); xButtonLine.appendChild(this._createCloseButton()); return xButtonLine; } _createWaitIcon () { let xWaitIcon = oGrammalecte.createNode("div", {className: "grammalecte_spinner"}); xWaitIcon.appendChild(oGrammalecte.createNode("div", {className: "bounce1"})); xWaitIcon.appendChild(oGrammalecte.createNode("div", {className: "bounce2"})); return xWaitIcon; } _createCopyButton () { let xButton = oGrammalecte.createNode("div", {id: "grammalecte_clipboard_button", className: "grammalecte_copy_button", textContent: "∑", title: "Copier dans le presse-papiers"}); xButton.onclick = function () { this.copyTextToClipboard(); }.bind(this); return xButton; } _createMoveButton (sAction, sLabel, sTitle) { let xButton = oGrammalecte.createNode("div", {className: "grammalecte_move_button", textContent: sLabel, title: sTitle}); xButton.onclick = function () { this[sAction](); }.bind(this); return xButton; } _createCloseButton () { let xButton = oGrammalecte.createNode("div", {className: "grammalecte_close_button", textContent: "×", title: "Fermer la fenêtre"}); xButton.onclick = function () { this.hide(); }.bind(this); // better than writing “let that = this;” before the function? return xButton; } insertIntoPage () { document.body.appendChild(this.xPanel); } |
︙ | ︙ |
Modified gc_lang/fr/webext/content_scripts/panel_gc.js from [0ba0b636f6] to [f13377ba0e].
︙ | ︙ | |||
42 43 44 45 46 47 48 | grammalecte_error{Id} : [paragraph number]-[error_number] grammalecte_sugg{Id} : [paragraph number]-[error_number]--[suggestion_number] */ constructor (...args) { super(...args); this.aIgnoredErrors = new Set(); | | | | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | grammalecte_error{Id} : [paragraph number]-[error_number] grammalecte_sugg{Id} : [paragraph number]-[error_number]--[suggestion_number] */ constructor (...args) { super(...args); this.aIgnoredErrors = new Set(); this.xContentNode = oGrammalecte.createNode("div", {id: "grammalecte_gc_panel_content"}); this.xParagraphList = oGrammalecte.createNode("div", {id: "grammalecte_paragraph_list"}); this.xContentNode.appendChild(this.xParagraphList); this.xPanelContent.addEventListener("click", onGrammalecteGCPanelClick, false); this.oTooltip = new GrammalecteTooltip(this.xContentNode); this.xPanelContent.appendChild(this.xContentNode); this.oTAC = new GrammalecteTextAreaControl(); } |
︙ | ︙ | |||
74 75 76 77 78 79 80 | this.xPanel.style.display = "none"; this.oTAC.clear(); } addParagraphResult (oResult) { try { if (oResult && (oResult.sParagraph.trim() !== "" || oResult.aGrammErr.length > 0 || oResult.aSpellErr.length > 0)) { | | | | | | | 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | this.xPanel.style.display = "none"; this.oTAC.clear(); } addParagraphResult (oResult) { try { if (oResult && (oResult.sParagraph.trim() !== "" || oResult.aGrammErr.length > 0 || oResult.aSpellErr.length > 0)) { let xNodeDiv = oGrammalecte.createNode("div", {className: "grammalecte_paragraph_block"}); // actions let xActionsBar = oGrammalecte.createNode("div", {className: "grammalecte_paragraph_actions"}); xActionsBar.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_check" + oResult.iParaNum, className: "grammalecte_paragraph_button grammalecte_green", textContent: "Réanalyser"}, {para_num: oResult.iParaNum})); xActionsBar.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_hide" + oResult.iParaNum, className: "grammalecte_paragraph_button grammalecte_red", textContent: "×", style: "font-weight: bold;"})); // paragraph let xParagraph = oGrammalecte.createNode("p", {id: "grammalecte_paragraph"+oResult.iParaNum, className: "grammalecte_paragraph", lang: "fr", contentEditable: "true"}, {para_num: oResult.iParaNum}); xParagraph.setAttribute("spellcheck", "false"); // doesn’t seem possible to use “spellcheck” as a common attribute. xParagraph.addEventListener("keyup", function (xEvent) { this.oTAC.setParagraph(parseInt(xEvent.target.dataset.para_num), this.purgeText(xEvent.target.textContent)); this.oTAC.write(); }.bind(this) , true); this._tagParagraph(xParagraph, oResult.sParagraph, oResult.iParaNum, oResult.aGrammErr, oResult.aSpellErr); |
︙ | ︙ | |||
233 234 235 236 237 238 239 | } addSummary () { // todo } addMessage (sMessage) { | | | 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | } addSummary () { // todo } addMessage (sMessage) { let xNode = oGrammalecte.createNode("div", {className: "grammalecte_gc_panel_message", textContent: sMessage}); this.xParagraphList.appendChild(xNode); } _copyToClipboard (sText) { // recipe from https://github.com/mdn/webextensions-examples/blob/master/context-menu-copy-link-with-types/clipboard-helper.js function setClipboardData (xEvent) { document.removeEventListener("copy", setClipboardData, true); |
︙ | ︙ | |||
275 276 277 278 279 280 281 | } class GrammalecteTooltip { constructor (xContentNode) { this.sErrorId = null; | | | | | | | | | | | | 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 | } class GrammalecteTooltip { constructor (xContentNode) { this.sErrorId = null; this.xTooltip = oGrammalecte.createNode("div", {id: "grammalecte_tooltip"}); this.xTooltipArrow = oGrammalecte.createNode("img", { id: "grammalecte_tooltip_arrow", src: " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwAAADsABataJCQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNzNun2MAAAAnSURBVChTY/j//z8cq/kW/wdhZDEMSXRFWCVhGKwAmwQyHngFxf8B5fOGYfeFpYoAAAAASUVORK5CYII=", alt: "^", }); this.xTooltipSuggBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_block"}); let xMessageBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_message_block"}); xMessageBlock.appendChild(oGrammalecte.createNode("p", {id: "grammalecte_tooltip_rule_id"})); xMessageBlock.appendChild(oGrammalecte.createNode("p", {id: "grammalecte_tooltip_message", textContent: "Erreur."})); let xActions = xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_actions"})); xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_ignore", textContent: "Ignorer"})); xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_url", textContent: "Voulez-vous en savoir plus ?…"}, {url: ""})); xMessageBlock.appendChild(xActions); this.xTooltip.appendChild(xMessageBlock); this.xTooltip.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_title", textContent: "SUGGESTIONS :"})); this.xTooltip.appendChild(this.xTooltipSuggBlock); xContentNode.appendChild(this.xTooltip); xContentNode.appendChild(this.xTooltipArrow); } show (sNodeErrorId) { // err try { |
︙ | ︙ |
Modified gc_lang/fr/webext/content_scripts/panel_lxg.js from [dcf9b1545d] to [eb959206ea].
1 2 3 4 5 6 7 8 9 | // JavaScript "use strict"; class GrammalecteLexicographer extends GrammalectePanel { constructor (...args) { super(...args); this._nCount = 0; | | | | | | | | | | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | // JavaScript "use strict"; class GrammalecteLexicographer extends GrammalectePanel { constructor (...args) { super(...args); this._nCount = 0; this._xContentNode = oGrammalecte.createNode("div", {id: "grammalecte_lxg_panel_content"}); this.xPanelContent.appendChild(this._xContentNode); } clear () { this._nCount = 0; while (this._xContentNode.firstChild) { this._xContentNode.removeChild(this._xContentNode.firstChild); } } addSeparator (sText) { if (this._xContentNode.textContent !== "") { this._xContentNode.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_lxg_separator", textContent: sText})); } } addMessage (sClass, sText) { this._xContentNode.appendChild(oGrammalecte.createNode("div", {className: sClass, textContent: sText})); } addListOfTokens (lTokens) { try { if (lTokens) { this._nCount += 1; let xNodeDiv = oGrammalecte.createNode("div", {className: "grammalecte_lxg_list_of_tokens"}); xNodeDiv.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_lxg_list_num", textContent: this._nCount})); for (let oToken of lTokens) { xNodeDiv.appendChild(this._createTokenNode(oToken)); } this._xContentNode.appendChild(xNodeDiv); } } catch (e) { showError(e); } } _createTokenNode (oToken) { let xTokenNode = oGrammalecte.createNode("div", {className: "grammalecte_lxg_token_block"}); xTokenNode.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_lxg_token grammalecte_lxg_token_" + oToken.sType, textContent: oToken.sValue})); xTokenNode.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_lxg_token_colon", textContent: ":"})); if (oToken.aLabel.length === 1) { xTokenNode.appendChild(document.createTextNode(oToken.aLabel[0])); } else { let xTokenList = oGrammalecte.createNode("div", {className: "grammalecte_lxg_morph_list"}); for (let sLabel of oToken.aLabel) { xTokenList.appendChild(oGrammalecte.createNode("div", {className: "grammalecte_lxg_morph_elem", textContent: "• " + sLabel})); } xTokenNode.appendChild(xTokenList); } return xTokenNode; } setHidden (sClass, bHidden) { |
︙ | ︙ |
Modified gc_lang/fr/webext/content_scripts/panel_tf.js from [1a7fb65c7e] to [4e9190557a].
︙ | ︙ | |||
13 14 15 16 17 18 19 | this.xTextArea = null; } _createTextFormatter () { let xTFNode = document.createElement("div"); try { // Options | | | | | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | this.xTextArea = null; } _createTextFormatter () { let xTFNode = document.createElement("div"); try { // Options let xOptions = oGrammalecte.createNode("div", {id: "grammalecte_tf_options"}); let xColumn1 = oGrammalecte.createNode("div", {className: "grammalecte_tf_column"}); let xSSP = this._createFieldset("group_ssp", true, "Espaces surnuméraires"); xSSP.appendChild(this._createBlockOption("o_start_of_paragraph", true, "En début de paragraphe")); xSSP.appendChild(this._createBlockOption("o_end_of_paragraph", true, "En fin de paragraphe")); xSSP.appendChild(this._createBlockOption("o_between_words", true, "Entre les mots")); xSSP.appendChild(this._createBlockOption("o_before_punctuation", true, "Avant les points (.), les virgules (,)")); xSSP.appendChild(this._createBlockOption("o_within_parenthesis", true, "À l’intérieur des parenthèses")); xSSP.appendChild(this._createBlockOption("o_within_square_brackets", true, "À l’intérieur des crochets")); xSSP.appendChild(this._createBlockOption("o_within_quotation_marks", true, "À l’intérieur des guillemets “ et ”")); let xSpace = this._createFieldset("group_space", true, "Espaces manquants"); xSpace.appendChild(this._createBlockOption("o_add_space_after_punctuation", true, "Après , ; : ? ! . …")); xSpace.appendChild(this._createBlockOption("o_add_space_around_hyphens", true, "Autour des tirets d’incise")); let xNBSP = this._createFieldset("group_nbsp", true, "Espaces insécables"); xNBSP.appendChild(this._createBlockOption("o_nbsp_before_punctuation", true, "Avant : ; ? et !")); xNBSP.appendChild(this._createBlockOption("o_nbsp_within_quotation_marks", true, "Avec les guillemets « et »")); xNBSP.appendChild(this._createBlockOption("o_nbsp_before_symbol", true, "Avant % ‰ € $ £ ¥ ˚C")); xNBSP.appendChild(this._createBlockOption("o_nbsp_within_numbers", true, "À l’intérieur des nombres")); xNBSP.appendChild(this._createBlockOption("o_nbsp_before_units", true, "Avant les unités de mesure")); let xDelete = this._createFieldset("group_delete", true, "Suppressions"); xDelete.appendChild(this._createBlockOption("o_erase_non_breaking_hyphens", true, "Tirets conditionnels")); let xColumn2 = oGrammalecte.createNode("div", {className: "grammalecte_tf_column"}); let xTypo = this._createFieldset("group_typo", true, "Signes typographiques"); xTypo.appendChild(this._createBlockOption("o_ts_apostrophe", true, "Apostrophe (’)")); xTypo.appendChild(this._createBlockOption("o_ts_ellipsis", true, "Points de suspension (…)")); xTypo.appendChild(this._createBlockOption("o_ts_dash_middle", true, "Tirets d’incise :")); xTypo.appendChild(this._createRadioBoxHyphens("o_ts_m_dash_middle", "o_ts_n_dash_middle", false)); xTypo.appendChild(this._createBlockOption("o_ts_dash_start", true, "Tirets en début de paragraphe :")); xTypo.appendChild(this._createRadioBoxHyphens("o_ts_m_dash_start", "o_ts_n_dash_start", true)); |
︙ | ︙ | |||
66 67 68 69 70 71 72 | xColumn1.appendChild(xDelete); xColumn2.appendChild(xTypo); xColumn2.appendChild(xMisc); xColumn2.appendChild(xStruct); xOptions.appendChild(xColumn1); xOptions.appendChild(xColumn2); // Actions | | | | | | | | | | | | | | | | | | | | 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 | xColumn1.appendChild(xDelete); xColumn2.appendChild(xTypo); xColumn2.appendChild(xMisc); xColumn2.appendChild(xStruct); xOptions.appendChild(xColumn1); xOptions.appendChild(xColumn2); // Actions let xActions = oGrammalecte.createNode("div", {id: "grammalecte_tf_actions"}); let xDefaultButton = oGrammalecte.createNode("div", {id: "grammalecte_tf_reset", textContent: "Par défaut", className: "grammalecte_tf_button"}); xDefaultButton.addEventListener("click", () => { this.reset(); }); let xApplyButton = oGrammalecte.createNode("div", {id: "grammalecte_tf_apply", textContent: "Appliquer", className: "grammalecte_tf_button"}); xApplyButton.addEventListener("click", () => { this.saveOptions(); this.apply(); }); xActions.appendChild(xDefaultButton); xActions.appendChild(oGrammalecte.createNode("progress", {id: "grammalecte_tf_progressbar"})); xActions.appendChild(oGrammalecte.createNode("span", {id: "grammalecte_tf_time_res", textContent: "…"})); xActions.appendChild(xApplyButton); //xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_infomsg", textContent: "blabla"})); // create result xTFNode.appendChild(xOptions); xTFNode.appendChild(xActions); } catch (e) { showError(e); } return xTFNode; } // Common options _createFieldset (sId, bDefault, sLabel) { let xFieldset = oGrammalecte.createNode("div", {id: sId, className: "grammalecte_tf_groupblock"}); let xGroupOption = oGrammalecte.createNode("div", {id: "o_"+sId, className: "grammalecte_tf_option grammalecte_tf_option_title_off", textContent: sLabel}, {selected: "false", default: bDefault, linked_ids: ""}); xGroupOption.addEventListener("click", (xEvent) => { this.switchOption(xEvent.target.id); this.switchGroup(xEvent.target.id); }); xFieldset.appendChild(xGroupOption); return xFieldset; } _createBlockOption (sId, bDefault, sLabel) { let xLine = oGrammalecte.createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_underline"}); xLine.appendChild(this._createOption(sId, bDefault, sLabel)); xLine.appendChild(oGrammalecte.createNode("div", {id: "res_"+sId, className: "grammalecte_tf_result", textContent: "·"})); return xLine; } _createOption (sId, bDefault, sLabel, sLinkedOptionsId="") { let xOption = oGrammalecte.createNode("div", {id: sId, className: "grammalecte_tf_option grammalecte_tf_option_off", textContent: sLabel}, {selected: "false", default: bDefault, linked_ids: sLinkedOptionsId}); xOption.addEventListener("click", (xEvent) => { this.switchOption(xEvent.target.id); }); return xOption; } // Hyphens _createRadioBoxHyphens (sIdEmDash, sIdEnDash, bDefaultEmDash) { let xLine = oGrammalecte.createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_indent"}); xLine.appendChild(this._createOption(sIdEmDash, bDefaultEmDash, "cadratin (—)", sIdEnDash)); xLine.appendChild(this._createOption(sIdEnDash, !bDefaultEmDash, "demi-cadratin (—)", sIdEmDash)); return xLine; } // Ligatures _createRadioBoxLigatures () { let xLine = oGrammalecte.createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_underline"}); xLine.appendChild(this._createOption("o_ts_ligature", true, "Ligatures")); xLine.appendChild(this._createOption("o_ts_ligature_do", false, "faire", "o_ts_ligature_undo")); xLine.appendChild(this._createOption("o_ts_ligature_undo", true, "défaire", "o_ts_ligature_do")); xLine.appendChild(oGrammalecte.createNode("div", {id: "res_"+"o_ts_ligature", className: "grammalecte_tf_result", textContent: "·"})); return xLine; } _createLigaturesSelection () { let xLine = oGrammalecte.createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_indent"}); xLine.appendChild(this._createOption("o_ts_ligature_ff", true, "ff")); xLine.appendChild(this._createOption("o_ts_ligature_fi", true, "fi")); xLine.appendChild(this._createOption("o_ts_ligature_ffi", true, "ffi")); xLine.appendChild(this._createOption("o_ts_ligature_fl", true, "fl")); xLine.appendChild(this._createOption("o_ts_ligature_ffl", true, "ffl")); xLine.appendChild(this._createOption("o_ts_ligature_ft", true, "ft")); xLine.appendChild(this._createOption("o_ts_ligature_st", false, "st")); return xLine; } // Apostrophes _createSingleLetterOptions () { let xLine = oGrammalecte.createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_indent"}); xLine.appendChild(this._createOption("o_ma_1letter_lowercase", false, "lettres isolées (j’ n’ m’ t’ s’ c’ d’ l’)")); xLine.appendChild(this._createOption("o_ma_1letter_uppercase", false, "Maj.")); return xLine; } // Ordinals _createOrdinalOptions () { let xLine = oGrammalecte.createNode("div", {className: "grammalecte_tf_blockopt grammalecte_tf_underline"}); xLine.appendChild(this._createOption("o_ordinals_no_exponant", true, "Ordinaux (15e, XXIe…)")); xLine.appendChild(this._createOption("o_ordinals_exponant", true, "e → ᵉ")); xLine.appendChild(oGrammalecte.createNode("div", {id: "res_"+"o_ordinals_no_exponant", className: "grammalecte_tf_result", textContent: "·"})); return xLine; } /* Actions */ start (xTextArea) { |
︙ | ︙ |