From 5790b5d22ea8b3c75e2722aa7d21cadbc23865d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolo=CC=80=20Maria=20Mezzopera?= Date: Wed, 6 May 2020 11:52:05 +0200 Subject: [PATCH] feat: prototype --- .gitignore | 1 + _locales/en/messages.json | 66 +++++++++++++++++++++++++ icons/icon128.png | Bin 0 -> 26392 bytes icons/icon16.png | Bin 0 -> 789 bytes icons/icon19.png | Bin 0 -> 749 bytes icons/icon48.png | Bin 0 -> 5964 bytes manifest.json | 25 ++++++++++ src/bg/background.js | 14 ++++++ src/inject/inject.css | 48 +++++++++++++++++++ src/inject/inject.js | 98 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 252 insertions(+) create mode 100644 .gitignore create mode 100644 _locales/en/messages.json create mode 100644 icons/icon128.png create mode 100644 icons/icon16.png create mode 100644 icons/icon19.png create mode 100644 icons/icon48.png create mode 100644 manifest.json create mode 100644 src/bg/background.js create mode 100644 src/inject/inject.css create mode 100644 src/inject/inject.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..a1b9cd0 --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,66 @@ +{ + "l10nTabName": { + "message":"Localization" + ,"description":"name of the localization tab" + } + ,"l10nHeader": { + "message":"It does localization too! (this whole tab is, actually)" + ,"description":"Header text for the localization section" + } + ,"l10nIntro": { + "message":"'L10n' refers to 'Localization' - 'L' an 'n' are obvious, and 10 comes from the number of letters between those two. It is the process/whatever of displaying something in the language of choice. It uses 'I18n', 'Internationalization', which refers to the tools / framework supporting L10n. I.e., something is internationalized if it has I18n support, and can be localized. Something is localized for you if it is in your language / dialect." + ,"description":"introduce the basic idea." + } + ,"l10nProd": { + "message":"You are planning to allow localization, right? You have no idea who will be using your extension! You have no idea who will be translating it! At least support the basics, it's not hard, and having the framework in place will let you transition much more easily later on." + ,"description":"drive the point home. It's good for you." + } + ,"l10nFirstParagraph": { + "message":"When the options page loads, elements decorated with data-l10n will automatically be localized!" + ,"description":"inform that elements will be localized on load" + } + ,"l10nSecondParagraph": { + "message":"If you need more complex localization, you can also define data-l10n-args. This should contain $containerType$ filled with $dataType$, which will be passed into Chrome's i18n API as $functionArgs$. In fact, this paragraph does just that, and wraps the args in mono-space font. Easy!" + ,"description":"introduce the data-l10n-args attribute. End on a lame note." + ,"placeholders": { + "containerType": { + "content":"$1" + ,"example":"'array', 'list', or something similar" + ,"description":"type of the args container" + } + ,"dataType": { + "content":"$2" + ,"example":"string" + ,"description":"type of data in each array index" + } + ,"functionArgs": { + "content":"$3" + ,"example":"arguments" + ,"description":"whatever you call what you pass into a function/method. args, params, etc." + } + } + } + ,"l10nThirdParagraph": { + "message":"Message contents are passed right into innerHTML without processing - include any tags (or even scripts) that you feel like. If you have an input field, the placeholder will be set instead, and buttons will have the value attribute set." + ,"description":"inform that we handle placeholders, buttons, and direct HTML input" + } + ,"l10nButtonsBefore": { + "message":"Different types of buttons are handled as well. <button> elements have their html set:" + } + ,"l10nButton": { + "message":"in a button" + } + ,"l10nButtonsBetween": { + "message":"while <input type='submit'> and <input type='button'> get their 'value' set (note: no HTML):" + } + ,"l10nSubmit": { + "message":"a submit value" + } + ,"l10nButtonsAfter": { + "message":"Awesome, no?" + } + ,"l10nExtras": { + "message":"You can even set data-l10n on things like the <title> tag, which lets you have translatable page titles, or fieldset <legend> tags, or anywhere else - the default Boil.localize() behavior will check every tag in the document, not just the body." + ,"description":"inform about places which may not be obvious, like , etc" + } +} diff --git a/icons/icon128.png b/icons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..79b452b4b2569b27ef7bbb0ea3a6b75b51d3e55c GIT binary patch literal 26392 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 literal 0 HcmV?d00001 diff --git a/icons/icon16.png b/icons/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..6664ee4bfd6bf394c15da61502d1d4d2d2fafebd GIT binary patch literal 789 zcmV+w1M2*VP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!w@E}nRCwBqQ(Z_DQ5ZdUW_Q$GS2uMP zwz4uavWUPS6!XO*0(%H5qFy3jd<cRNj0m3!ilAP@dWtNgpDhZMLI^A}3;aP%tSu=` z*S~fD+})Yoy?ytNqds<rJ2Tw-edm1VyXP{_Ia+*yC%*p3DQA{~{~e35G+G-xSJhx; z)9ZoBWR0HUxe8+-JY>YASH}9M$-(FW7&8HEDnlTg-oh$czw<1c0+q;(G>4rwj_q~f z^!|Jbg2<Ff4|+rJ4TK>`M66gNQm}p3{9GWWiKeu`j+P@uI9To=FsoQW&yb;S@6R}H zyq(8X&>#@A6q^j87<Z0}o5xGA+na@i!6kz%my#Ky$|#|(!U2a?jHX9_iO}3vRyeSk z*vpGG#3?z&xzwwX9L;7D_~&#CPbE;8tD<(hL-s|C)wb7C*>}1ZB&tSiF+GFJz5tq^ z1uz>)qvyvmE_BS`($i@i+U0~n2m*K&U|XRbF9#y%8i^4r!@Zs*eDufBI}u0QhajrU za%2NXrgeDTcAT%yhsUL^0SHZk^*#kpE*er&UXB76dBfvW<vwIDfQ4uZLsPnxYqJ1; zQ&L^I6R!p%)aeD>K2d^A8*B*2GdQ{@7uP%I@oUaNnMXsCj<5euLLT#K1zn?2oUF=& zE1Tinw<wyQ2V_M%N;JG5Uq<I}lyn2<s@-@q6g9nIHBlVt#JoY8m(hH<NSdj0IEI!N zv*;d+;^F5djLjs`SmTCHX8S~au^g$avkTh$LYN7saQCbiXAb0{ey7898wIyFZbShc zVOvj7#;@eB^*~k3<&Li*sjq=_S9+aD5I_Mn@$r`s1}Bpcm(Oyc%-DKmoQqp1Otaz* z^YU=3E)&>trj;uGg=3YA^@X>}iZs8_W(`3gDiTcQG}qX=>zvRzs!Fr_{s}Mu(03#= T);a|q00000NkvXXu0mjfDFtNW literal 0 HcmV?d00001 diff --git a/icons/icon19.png b/icons/icon19.png new file mode 100644 index 0000000000000000000000000000000000000000..68aa4be70b13c9fe29310705c8e213f88376d86d GIT binary patch literal 749 zcmV<J0uud+P)<h;3K|Lk000e1NJLTq000vJ000vR1^@s6a!@wR0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!k4Z#9RCwB~luKw6Q51&%nY?4oqfKnm zDyBtSbfvY%BGTeQ1W|Nh+l95Z6dx4CRVk<o5d~KjK@ciJYK6K`As~ng&BBF<qGF3r ze4%-mmNaRa$K)~b+#3^!NtMzb7&1)meE)y`GxrL)Tn?Kre#v2p_3BKcAZ)tudC8zc zDJwl(sTFZ{j}<Lzw2*U5OMoZ<pMoh2PWTsul{xEfHQ?0F8VEx9;#4+=3|+3LVT?bE zEbL54(t{ml^lURCEB{d<AXmzpgIbYS=xsCc-@k!k;l`*FamZ;zMlMxT(Fzqo7>Bj0 zRSF~w9B;3NUL{m^w!yB!`+$T-tD3t^5_N@IL^3T?Zh(%c?|w;`^h(^Ng5Ej0!;CAQ zP&ur7ivdITg1FIJ2Q#^3ptpVr12=vAe>RYgCOwYb@<YnxV;<|PtK6npuRt)G!BtYC zj3JV{VS+c1(`K6nmmbdW4Ewj6iZAO)aA;QzTG#4IVexc6tj8Z>aKD}d>&<3VB9W4L zt0tX-G7}JrWs9(B68C(J!xv7M!XgP7&9xe&$=1lD5WJBLE_c?#>CmBxo{#p}d3$$X z&J|$>tpYE;C*Y&CC9pC2c22aL`8}K55tk3qq>SO+7M$B_g`HfEKAGhausYacfQP!M zIL#@a1WT0yjTRNW;S7PY*njN@)~!;btwD#4l-nJ0rJ+xQIqaf=bzT2ic>t{XTwaWH z+OVDg%mK^k>vRf^Y8BjXqI?b80TTnOaoQdH_ugcH1LS7BzaB9Po;j(aiOo>xEbR09 ztbDR3ZwL6~|GPH}wbh};VW$c8W+iWHHlD@($$31OnqS<h!Rq<9Bwc|;9YG?Nu|#%4 fE(eHlehV-F4O;ZNbi-Z400000NkvXXu0mjfMx0e^ literal 0 HcmV?d00001 diff --git a/icons/icon48.png b/icons/icon48.png new file mode 100644 index 0000000000000000000000000000000000000000..4a016d7db82de731d32482ccea287c0e849b6cef GIT binary patch literal 5964 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..4da5c7d --- /dev/null +++ b/manifest.json @@ -0,0 +1,25 @@ +{ + "name": "Semantic review comments button", + "version": "0.0.1", + "manifest_version": 2, + "description": "An extension to add quick semantic review comments", + "homepage_url": "http://extensionizr.com", + "icons": { + "16": "icons/icon16.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + }, + "default_locale": "en", + "background": { + "scripts": ["src/bg/background.js"], + "persistent": true + }, + "permissions": ["https://gitlab.com/*"], + "content_scripts": [ + { + "matches": ["https://gitlab.com/*"], + "js": ["src/inject/inject.js"], + "css": ["src/inject/inject.css"] + } + ] +} diff --git a/src/bg/background.js b/src/bg/background.js new file mode 100644 index 0000000..ee54e75 --- /dev/null +++ b/src/bg/background.js @@ -0,0 +1,14 @@ +// if you checked "fancy-settings" in extensionizr.com, uncomment this lines + +// var settings = new Store("settings", { +// "sample_setting": "This is how you use Store.js to remember values" +// }); + +//example of using a message handler from the inject scripts +chrome.extension.onMessage.addListener(function ( + request, + sender, + sendResponse +) { + sendResponse(); +}); diff --git a/src/inject/inject.css b/src/inject/inject.css new file mode 100644 index 0000000..863422c --- /dev/null +++ b/src/inject/inject.css @@ -0,0 +1,48 @@ +/** + * Place your custom CSS styles here. + **/ + +#semanticButtonContainer { + display: flex; + align-items: flex-end; + position: absolute; + bottom: 0; + left: 0; + width: 25px; + height: 60px; + transition: all 0.5s; + overflow: hidden; +} + +#semanticButtonContainer:hover { + width: 300px; +} + +#semanticButtonContainer .buttonContainer { + display: flex; + flex-direction: column-reverse; + height: 25px; + width: 25px; + overflow: hidden; + transition: all 0.5s; +} + +#semanticButtonContainer .buttonContainer:hover { + height: 60px; +} + +#semanticButtonContainer button { + margin-right: 0.5rem; + border: none; + height: 25px; + width: 25px; + outline: 0; +} + +#semanticButtonContainer button:focus { + outline: 0; +} + +#semanticButtonContainer button i.blocking { + color: red; +} diff --git a/src/inject/inject.js b/src/inject/inject.js new file mode 100644 index 0000000..e5e828f --- /dev/null +++ b/src/inject/inject.js @@ -0,0 +1,98 @@ +const semanticLabels = { + praise: { + icon: "fa-trophy", + blocking: false, + }, + nitpick: { + icon: "fa-search", + blocking: true, + }, + suggestion: { + icon: "fa-exclamation", + blocking: true, + }, + issue: { + icon: "fa-bug", + blocking: true, + }, + question: { + icon: "fa-question", + blocking: true, + }, + thought: { + icon: "fa-comment", + blocking: false, + }, + chore: { + icon: "fa-home", + blocking: true, + }, +}; + +const semanticCommentStructure = `**%label%decoration:** <subject>`; + +function buttonGenerator(textarea, parent, label, blocking) { + const button = document.createElement("button"); + const i = document.createElement("i"); + i.classList.add("fa"); + i.classList.add(semanticLabels[label].icon); + if (blocking) { + i.classList.add("blocking"); + } + button.appendChild(i); + button.addEventListener("click", function (e) { + e.preventDefault(); + textarea.value = semanticCommentStructure + .replace("%label", label) + .replace("%decoration", blocking ? "" : " (non-blocking)"); + textarea.focus(); + textarea.setSelectionRange( + textarea.value.length - 9, + textarea.value.length + ); + }); + + parent.appendChild(button); +} + +function buttonPairGenerator(textarea, parent, label) { + const buttonContainer = document.createElement("div"); + buttonContainer.classList.add("buttonContainer"); + buttonGenerator(textarea, buttonContainer, label, false); + if (semanticLabels[label].blocking) { + buttonGenerator(textarea, buttonContainer, label, true); + } + parent.appendChild(buttonContainer); +} + +function addSemanticButton(element) { + const parent = element.closest("div"); + const container = document.createElement("div"); + container.id = "semanticButtonContainer"; + + Object.keys(semanticLabels).forEach((label) => { + buttonPairGenerator(element, container, label); + }); + parent.appendChild(container); +} + +function main() { + document.addEventListener("click", function (e) { + if ( + e.target.id === "note_note" && + !e.target.dataset.semanticButtonInitialized + ) { + e.target.dataset.semanticButtonInitialized = true; + addSemanticButton(e.target); + } + }); +} + +chrome.extension.sendMessage({}, function (response) { + const readyStateCheckInterval = setInterval(function () { + if (document.readyState === "complete") { + clearInterval(readyStateCheckInterval); + main(); + } + }, 10); +});