From ddd6e235d8ea3ea9aea7ca9c460933514f572805 Mon Sep 17 00:00:00 2001 From: setop Date: Thu, 24 Oct 2024 14:16:52 +0200 Subject: [PATCH] basic impl --- README.md | 24 ++++++++++++++++++++++++ background.js | 20 ++++++++++++++++++++ icon.png | Bin 0 -> 2367 bytes manifest.json | 16 ++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 README.md create mode 100644 background.js create mode 100644 icon.png create mode 100644 manifest.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..770f83f --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +This is a Firefox Addon that allows to create a ["Text Fragment"](https://developer.mozilla.org/en-US/docs/Web/URI/Fragment/Text_fragments#:%7E:text=Text%20fragments%20allow%20linking%20directly%20to%20a%20specific%20portion%20of%20text%20in%20a%20web%20document) link for the context menu. + + +# installation + +* git clone or export this repo +* go to page "about:debugging#/runtime/this-firefox" (or "about:debugging" then click "/runtime/this-firefox") +* click on "Load Temporary Add-on…" +* select "manifest.json" file + +# usage + +* select a text in a document, +* right clic to have contextual menu, +* choose "text fragment" entry +* paste the link in an address bar or in a mail or in a chat + +# limitation + +* not packaged, only debug mode yet + * on the plus side, the code is so simple that you can see it won't stab you in the back +* tested only on Firefox + * the other, most popular, web browser is on the evil side for a long time now + diff --git a/background.js b/background.js new file mode 100644 index 0000000..5b0da0c --- /dev/null +++ b/background.js @@ -0,0 +1,20 @@ +browser.contextMenus.create({ + id: "text-fragment", + title: "Text Fragment", + contexts: ["selection"] +}); + +browser.contextMenus.onClicked.addListener((info) => { + if (info.menuItemId === "text-fragment") { + const selectedText = encodeURIComponent(info.selectionText); + const pageUrl = info.pageUrl.split('#')[0]; // Remove existing fragment, if any + const textToCopy = `${pageUrl}#:~:text=${selectedText}`; + + navigator.clipboard.writeText(textToCopy).then(() => { + console.log("Text copied to clipboard"); + }).catch(err => { + console.error("Could not copy text: ", err); + }); + } +}); + diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..741668f74b33fae0b1b67f9af1b3677a5761c139 GIT binary patch literal 2367 zcmV-F3BdM=P)6Yh-&cSA z^&d4p-$*@lYBo=UF`5&I(zZaDz7Iy|Pt-pK;tJVk!@Kt|g@ z6zoHZp~Q*AbzJ=RRY0d1;=SF*dyReQG@7eGFFk+}KCNv8$gn6WjD8w*MwXPQ4I&1D zA(~@<|9SxbuNd(NB~i$+FcEPf8JB~-^kn0bpaO4~~R=BbEedv3VT%qyQPEW8>mVG41N`qr!Iw)y-0~f!)l>GH%(=&|ta1sngV*Uc3!I!bzIGZT zYLac0PeMvgzi-jr*m@HX#D`CbQ3%_tIVbQ=KECRA6$ud+y8?p%S9@N)2^b3o~$+w;M<^wPuVWt}c(3n67@5d}BDwlwm zsQ;?F1fX-{@!{jzW^1W)0)Ign6M*d?2*h+y8a477&n?3H83#QeRs)VP4oj>Ldf+M8 z0*CSxo(jCG^F!JuN@I?P#JjvYgtU`&lChRG?grbB7qdF0lM^OHXNYLE{;>e_}N5YO%#=1_XJ;~v3_ zwVR)74b!ZA0x_+g@c`b4E5H#O7o#cF9nCTWBBg@o=dD%64!#eoO0;+z?1Hl^?#aw{ zRc0#f>$Sm3!Ry%-qipbHIYMI2DAwJ=b-1}M;CssiUsgQ821<+4qy8{$!aDjnK5zh| zun%RUKT5OfHu7}^FGag0M0aET{Y;pVoU-bdQQCfaZ8$j}X(77DkPMr2H1NoqbL~OS z)ddsQ`pTwhN?KYeam`E2>!Jf+7~r#R@bv)xe34w8h~!|2`L%UD-C+?>4e(OWVC{a| z1Nc-`!LwK8Ay=1_F6~h(dRr~;Ir$hu=dz)$9Im1*g!&VmM}I*SPB`_@5>gQrj~Ey zj5zSQ$4xr5U!H@IGIYD7xM}z5U>re2{JE|Lp8)QA)`&TOs)78iKF=F*Zt5Jtr!i!9P?!cz2Jo zqoX6B>-zYvuCCU_ix-ctv~XM8rZty>A^Of!t}Y*Z*4UYVHckq&*exsLV&tg8+~}wv zciFOKTUV`GbqV!_<;#~}s-$om+!oHaiI1S;3pFFk;+RQMgU<~>$}m;3WFv=>2Y~=-P3eHBr+pAZv&Y<%{C>gT=gedmkirvR`lG{RUBt_7{b8^oOsbc2QDg+&&m!*}KRN3W@jt$%Pak|VQa;)c{%IQ=<06P8-#8z~kM^J)Fp-!8Hf43J2 z-n^HR@9^&_+19&0+4+p?)|4>4?-)Tb=WUE8aVPd$Y_Bj0ot>Qo5VUgTO6u9PNz3b0tOuj z5a}aMG;%V-(Y%x+<`2^>0Qw_8jm7CLNAOw4CMnF>2qo+U*d$;&01T{Ivxc~UfC2p0 z1u*kbFTnL725OEtpX2wR_#Qul`<*!d&wL+k4dVJflYoPc85DGmH!}pH^og*#oGdLV z37oiOQx!|CzeK_!cf!=j8!>TN#)f;gmez zZhwYJL=o>pr`&I~jky<+OQ3T;Jt1_#$G#3165LYRZs6_8HbUR1qRpgUB1gBkw~yf( zz;?2jn*_-7J@#h`$4s^v&}mYD6=B>lkCsg)6eB^knV~p%u>=bVh$tn%QiyGBZKJrD zQ^Phzb|?tgWq(HXzIC7j3*|bVa!edsjE1crxzDv{tTDSE34 zU6&Nhs4@W+kN`UYMBL1tr52{=#NM1(?Q?ZCAfOBqSb_BmTmBr%ZvuGKWphH+k`^^1 zpiB~CGEy6H*p^ad@FqAeE{0HZnFN$I9WpK(6RQs1?ku^P!saveA)$`oO;eVA1W3SP z_Wn#~NP36Am^Q!4l&&8MH2{yp43({gbCZ_f?Xdvi4&z=1(xKa(s_K#uDf-v8WVOMY zb6R?brk}40h@?4g!1qChkOcMvsz*Y?+7FOVgsBV6T;16!j=X)|Kg$6Rp7Z(OZ6u^* zY+!-uK~}yY%G~!Kq8GF{of3b3=(GOHX4L)GAD#D$%@Sqr$#G1Q_%N!I0PLJ3K`8<9 z-uWd