.. -*- coding: utf-8 -*- .. role:: sref(numref) .. role:: xref(numref) .. Copyright (C) 2025, Wolfgang Scherer, .. This file is part of Netflix More More Info. .. Permission is granted to copy, distribute and/or modify this document .. under the terms of the GNU Free Documentation License, Version 1.3 .. or any later version published by the Free Software Foundation; .. with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. .. A copy of the license is included in the section entitled "GNU .. Free Documentation License". .. inline comments (with du_comment_role) .. role:: rem(comment) .. role:: html(raw) :format: html .. role:: shx(code) :language: sh .. rst-class:: narrow xmedium xlarge xhuge xultra ################################################## :rem:`|||:sec:|||`\ Development/WebExtensions API ################################################## .. . (progn (forward-line 1) (snip-insert "rst_b.peek-a-boo" t t "rst") (insert "")) .. >>CODD See `the components of a doctoral dissertation and their order `_ .. >>CODD Dedication .. >>CODD Epigraph .. >>CODD Abstract .. \|:here:| .. >>CODD Introduction .. >>CODD Chapter ================================================== :rem:`|||:sec:|||`\ Firefox ================================================== For Firefox get `mozilla/web-ext: A command line tool to help build, run, and test web extensions `_ and run .. code-block:: sh web-ext build Sign the extension on `Developer Hub :: Add-ons for Firefox `_. Consider using :file:`package.json`: .. code-block:: json { "scripts": { "start:firefox": "web-ext run --source-dir ./netflix-more-more-info/", "build:firefox": "web-ext build --source-dir ./netflix-more-more-info/" } } ================================================== :rem:`|||:sec:|||`\ Google Chrome ================================================== Chrome allows unsigned package installation from a folder. The developer console on `Chrome Web Store `_ allows to publish extensions. ================================================== :rem:`|||:sec:|||`\ NodeJS ================================================== The regular binary releases are available at `Index of /download/release/ `_, currently `node-v22.12.0-linux-x64.tar.gz `_. An LTS PPA is available at `Nodesource Node.js DEB `_, see also `nodesource/distributions: NodeSource Node.js Binary Distributions `_ .. code-block:: sh curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - sudo apt-get install -y nodejs ================================================== :rem:`|||:sec:|||`\ Examples ================================================== See also `mdn/webextensions-examples: Example Firefox add-ons created using the WebExtensions API `_ in particular `webextensions-examples/annotate-page at main · mdn/webextensions-examples `_. ================================================== :rem:`|||:sec:|||`\ Image to ASCII ================================================== From `Image to ASCII: Free ASCII Art Converter `_ .. code-block:: text =*%@@@@@@@@%% #@@@@@@@@@@@@@@@@@@#+ @@@@@@@@@@@@@@@@@@@@@@@@* ##########@@@@@@@@@@@@@@@@@@+ +#############@@@@@@@@@@@@@@@@@@ ################%@@@@@@@@@@@@@@@@@ ##################@@@@@@@@@@@@@@@@@@ *###################@@@@@@@@@@@@@@@@@ =#####################@@@@@@@@@@@@@@@%* *######################@@@@@@@@@@@@@@##+ ##########*##############@@@@@@@@@@####* #####@@@@@@@@@@##############%%########* +##@@@@@@@@@@@@@@######################* =#@@@@@@@@@@@@@@@@#####################+ +@@@@@@@@@@@@@@@@@#################### =@@@@@@@@@@@@@@@@@@##################= *@@@@@@@@@@@@@@@@@#################= =@@@@@@@@@@@@@@@@@##############*= %@@@@@@@@@@@@@@@@@###########= %@@@@@@@@@@@@@@@@@@@@@@@@ *@@@@@@@@@@@@@@@@@@@# *%@@@@@@@@@@#= ================================================== :rem:`|||:sec:|||`\ Textarea ================================================== Source: `javascript - simulate keyboard input / insert string into textarea (adwords) - Stack Overflow `_ .. code-block:: js const textarea = document.getElementsByTagName('textarea')[0] function setNativeValue(element, value) { const { set: valueSetter } = Object.getOwnPropertyDescriptor(element, 'value') || {} const prototype = Object.getPrototypeOf(element) const { set: prototypeValueSetter } = Object.getOwnPropertyDescriptor(prototype, 'value') || {} if (prototypeValueSetter && valueSetter !== prototypeValueSetter) { prototypeValueSetter.call(element, value) } else if (valueSetter) { valueSetter.call(element, value) } else { throw new Error('The given element does not have a value setter') } } setNativeValue(textarea, 'some text') textarea.dispatchEvent(new Event('input', { bubbles: true })) ================================================== :rem:`|||:sec:|||`\ Interesting Error Message ================================================== .. code-block:: text Uncaught SyntaxError: expected expression, got end of script div>');c=c.firstChild;document.querySelector("body").appendChild(c);c=document.getElementById("notes-container");a=document.getElementById("notes");c.style.maxWidth="300px";c.style.minWidth="300px";c.style.maxWidth="800px";c.style.minWidth="800px";c.style.backgroundColor="white";c.style.color="black";c.style.display="grid";c.style.font="16px serif";c.style.fontPalette="normal";c.style.fontSynthesis="weight style small-caps position";c.style.gridTemplateRows="min-content 0px auto min-content";c.style.letterSpacing="normal";c.style.margin="0px 5px";c.style.maxHeight="100vh";c.style.maxWidth="20vw";c.style.minHeight="50vh";c.style.minWidth="20vw";c.style.padding="5px";c.style.position="fixed";c.style.right="0px";c.style.textTransform="none";c.style.top="50px";c.style.zIndex="99999";c;var d=document.getElementById("notes-container-card-img");d.style.zIndex="100000";d.style.marginRight="8px";d.style.marginTop="8px";var g=document.getElementById("notes-container-img");g.style.display="none";g.style.width="18px";g.style.border="none";g.style.float="right";g.style.margin="0px";g.style.padding="0px";var i=document.getElementById("notes-container-img-span");i.style.display="none";i.style.fontSize="30px";i.style.lineHeight="30px";i.style.backgroundColor="#efbfff";i.style.color="black";i.style.border="none";i.style.float="right";i.style.margin="0px";i.style.padding="0px";function j(){var a=document.getElementById("notes-container-img");var b=document.getElementById("notes-container-img-span");if(a.complete||a.naturalWidth){a.style.display="";b.style.display="none";}else{a.style.display="none";b.style.display="inline-block";}}window.setTimeout(j,500);var k=c.querySelector("h6");k.style.color="black";k.style.font="700 16px serif";k.style.fontPalette="normal";k.style.fontSynthesis="weight style small-caps position";k.style.letterSpacing="normal";k.style.lineHeight="normal";k.style.margin="0px";k.style.padding="3px 7px";k.style.textTransform="none";var l=c.querySelector("h6 span");l.style.margin="0";l.style.padding="0";a.style.background="transparent";a.style.color="black";a.style.display="block";a.style.fontPalette="normal";a.style.fontSynthesis="weight style small-caps position";a.style.font="16px monospace";a.style.height="initial";a.style.letterSpacing="normal";a.style.margin="0px";a.style.outline="initial";a.style.overflowWrap="normal";a.style.overflowX="auto";a.style.padding="3px 5px";a.style.position="initial";a.style.textDecoration="initial";a.style.textTransform="none";a.style.textWrap="nowrap";a.style.whiteSpace="pre";a.style.width="initial";var m=document.getElementById("notes-container-button-bar");m.style.color="black";m.style.display="grid";m.style.fontPalette="normal";m.style.fontSynthesis="weight style small-caps position";m.style.font="14px sans-serif";m.style.gridTemplateColumns="min-content auto min-content min-content min-content";m.style.letterSpacing="normal";m.style.margin="0px";m.style.padding="3px 0px 0px 0px";m.style.textTransform="none";var o=document.getElementById("notes-always-active-button");o.style.backgroundAttachment="scroll";o.style.backgroundColor="transparent";o.style.borderColor="transparent";o.style.borderRadius="3px";o.style.borderStyle="solid";o.style.borderWidth="1px";o.style.boxSizing="border-box";o.style.color="rgb(69, 69, 69)";o.style.height="24px";o.style.marginLeft="0px";o.style.overflow="visible";o.style.padding="1px 0px 2px 0px";o.style.textAlign="center";o.style.whiteSpace="nowrap";o.style.fontPalette="normal";o.style.fontSynthesis="weight style small-caps position";o.style.font="14px sans-serif";var p=document.getElementById("notes-always-active-check");p.style.background="#fff";p.style.color="#000";p.style.cursor="pointer";p.style.display="inline-block";p.style.margin="0";p.style.outline="0";p.style.padding="0";p.style.position="initial";p.style.textAlign="center";p.style.textDecoration="none";p.style.whiteSpace="nowrap";p.style.fontPalette="normal";p.style.fontSynthesis="weight style small-caps position";p.style.font="14px sans-serif";var q=document.getElementById("notes-always-active-label");q.style.padding="0px";q.style.margin="0px 0px 0px 3px";q.style.color="rgb(69, 69, 69)";q.style.cursor="pointer";q.style.textAlign="center";q.style.whiteSpace="nowrap";q.style.fontPalette="normal";q.style.fontSynthesis="weight style small-caps position";q.style.font="14px sans-serif";q.style.display="normal";var r=document.getElementById("notes-container-clear-button");r.style.backgroundAttachment="scroll";r.style.backgroundColor="rgb(246, 246, 246)";r.style.borderColor="rgb(197, 197, 197)";r.style.borderRadius="3px";r.style.borderStyle="solid";r.style.borderWidth="1px";r.style.boxSizing="border-box";r.style.color="rgb(69, 69, 69)";r.style.cursor="pointer";r.style.height="24px";r.style.margin="0px 0px 0px 5px";r.style.overflow="visible";r.style.padding="1px 3px 2px 4px";r.style.textAlign="center";r.style.whiteSpace="nowrap";r.style.fontPalette="normal";r.style.fontSynthesis="weight style small-caps position";r.style.font="14px sans-serif";var s=document.querySelector("#notes-container-clear-button span");s.style.margin="0";s.style.padding="0";s.style.fontPalette="normal";s.style.fontSynthesis="weight style small-caps position";s.style.font="14px sans-serif";s.style.cursor="pointer";var t=document.getElementById("notes-container-refresh-button");t.style.backgroundAttachment="scroll";t.style.backgroundColor="rgb(246, 246, 246)";t.style.borderColor="rgb(197, 197, 197)";t.style.borderRadius="3px";t.style.borderStyle="solid";t.style.borderWidth="1px";t.style.boxSizing="border-box";t.style.color="rgb(69, 69, 69)";t.style.height="24px";t.style.margin="0px 0px 0px 5px";t.style.overflow="visible";t.style.padding="1px 3px 2px 4px";t.style.textAlign="center";t.style.whiteSpace="nowrap";t.style.fontPalette="normal";t.style.fontSynthesis="weight style small-caps position";t.style.font="14px sans-serif";t.style.cursor="pointer";var u=document.querySelector("#notes-container-refresh-button span");u.style.margin="0";u.style.padding="0";u.style.fontPalette="normal";u.style.fontSynthesis="weight style small-caps position";u.style.font="14px sans-serif";u.style.cursor="pointer";var v=document.getElementById("notes-container-save-button");v.style.backgroundAttachment="scroll";v.style.backgroundColor="rgb(246, 246, 246)";v.style.borderColor="rgb(197, 197, 197)";v.style.borderRadius="3px";v.style.borderStyle="solid";v.style.borderWidth="1px";v.style.boxSizing="border-box";v.style.color="rgb(69, 69, 69)";v.style.height="24px";v.style.margin="0px 0px 0px 5px";v.style.overflow="visible";v.style.padding="1px 3px 2px 4px";v.style.textAlign="center";v.style.whiteSpace="nowrap";v.style.fontPalette="normal";v.style.fontSynthesis="weight style small-caps position";v.style.font="14px sans-serif";v.style.cursor="pointer";var w=document.querySelector("#notes-container-save-button span");w.style.margin="0";w.style.padding="0";w.style.fontPalette="normal";w.style.fontSynthesis="weight style small-caps position";w.style.font="14px sans-serif";w.style.cursor="pointer";}e();document.getElementById('notes').addEventListener("input",function(a){f();});document.getElementById('notes').addEventListener("focus",function(a){return;});document.querySelector('#notes-always-active-check').addEventListener("change",function(a){n=this.checked;});document.getElementById('notes-container-clear-button').addEventListener("click",function(a){h("",true);});document.getElementById('notes-container-refresh-button').addEventListener("click",function(a){e();});document.getElementById('notes-container-save-button').addEventListener("click",function(a){f();});window.addEventListener("storage",function(a){if(!a.key||a.key==b)e();});})();document.addEventListener("keydown",function(a){if(a.altKey||a.ctrlKey||a.isComposing||a.metaKey||a.shiftKey)return;if(document.activeElement.id=="notes")return;var b=a.key;if(b==="´"||b==="Escape"){o();a.preventDefault();return;}if(m&&!n)return;if(b==="1"){l("tag1");a.preventDefault();return;}if(b==="2"){l("tag2");a.preventDefault();return;}if(b==="3"){l("tag3");a.preventDefault();return;}if(b==="4"){l("tag4");a.preventDefault();return;}if(b==="c"){j(document.getSelection().toString().trim());a.preventDefault();return;}if(b==="v"){d=!d;a.preventDefault();return;}if(b==="Enter"){i("");a.preventDefault();return;}});})()+:3:15058 .. >>CODD Conclusion .. >>CODD Appendix A .. \|:here:| .. >>CODD Notes .. ================================================== .. :rem:`|||:sec:|||`\ Footnotes .. ================================================== :html:`
` .. \[#] .. \|:info:| put local references here .. \|:info:| put local definitions here .. include:: doc_defs.inc .. include:: abbrev_defs.inc .. include:: doc_defs_combined.inc .. .. \||<-snap->|| doc_standalone .. include:: doc/doc_defs_secret.inc .. \||<-snap->|| doc_standalone .. \||<-snap->|| not_doc_standalone .. include:: doc_defs_secret.inc .. \||<-snap->|| not_doc_standalone .. _`Wolfgang Scherer`: wolfgang.scherer@gmx.de