Wikipedia
+
+
+
+
+
- matterbridge — chat bridges between a growing number of protocols.
From fc8b0aec3b28e4b4b072b2bfb83e9da7539c586f Mon Sep 17 00:00:00 2001 From: andrigamerita <37557992+andrigamerita@users.noreply.github.com> Date: Fri, 2 Feb 2024 00:11:06 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20octospac?= =?UTF-8?q?c/OcttKB@fc71ccb5f8b3f518d6fa9df0178fcdb9dba0716a=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- -1.html | 86 +++++++++++++------------ -2.html | 55 +++++++++------- Static.html | 102 ++++++++++++++++++++++-------- Static/CSS.html | 4 +- Static/Cryptocurrency.html | 12 ++-- Static/Development.html | 4 +- Static/Interoperability.html | 80 +++++++++++++++++++++++ Static/JavaScript/Libraries.html | 4 +- Static/Nginx.html | 4 +- Static/OcttKB/Index.html | 2 +- Static/Palette.html | 4 +- Static/Static site generator.html | 4 +- Static/Typography.html | 12 ++-- Static/Web/Development.html | 4 +- index.html | 28 ++++---- 15 files changed, 277 insertions(+), 128 deletions(-) create mode 100644 Static/Interoperability.html diff --git a/-1.html b/-1.html index 2d4a843c..f79c9963 100644 --- a/-1.html +++ b/-1.html @@ -252,7 +252,7 @@ {"title":"$:/Apps","created":"20230221195029004","creator":"Octt","modified":"20230225144031829","modifier":"Octt","tags":"$:/ToC"}, {"title":"$:/Apps/Dashboard/index.html","text":"\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\n\u003Cstyle>\n:Root {\n\t--BodyMargin: 8px;\n}\n\nBody {\n\tText-Align: Center;\n\tUser-Select: None;\n\tFont-Family: Sans-Serif;\n\tMargin: Var(--BodyMargin);\n}\n\nA {\n\tColor: #000000;\n\tText-Decoration: None;\n}\nUl {\n\tText-Align: Left;\n\tList-Style: None;\n\tColumn-Count: 1;\n\tMargin-Top: 8px;\n\tMargin-Bottom: 8px;\n\tPadding-Left: 0px;\n\tPadding-Right: 0px;\n}\nLi {\n\tLine-Height: 1.75em;\n\tFont-Size: Larger;\n\tPadding-Left: 8px;\n\tPadding-Right: 8px;\n}\nLi:Hover {\n\tBackground: LightGray;\n}\n\n.SimpleList Li {\n\tWidth: Fit-Content;\n\tWhite-Space: NoWrap;\n}\n\n.TextLineImg {\n\tWidth: 1em;\n\tHeight: 1em;\n\tVertical-Align: Text-Top;\n\tPadding-Right: 8px;\n}\n.Margin4 {\n\tMargin: 4px;\n}\n\n.Dropdown {\n\t/*Position: Relative;*/\n\t/*Display: Inline-Block;*/\n}\n.DropdownBtn {\n\tCursor: Pointer;\n\tBackground: LightGray;\n\tColor: Black;\n}\n.DropdownBody {\n\tDisplay: None;\n\tPosition: Absolute;\n\tWidth: Max-Content;\n\tBackground: White;\n\tBox-Shadow: 0px 8px 8px 0px RGBA(0,0,0,0.2);\n\tZ-Index: 1;\n}\n.DropdownBtn:Hover ~ .DropdownBody,\n.DropdownBody:Hover {\n\tDisplay: Block;\n\t/*Position: Absolute;*/\n}\n.Dropdown Li {\n\tCursor: Pointer;\n\tText-Align: Center;\n}\n.SearchDiv {\n\tWidth: Max-Content;\n}\n.DropdownBtn, Input[Type=\"Text\"] {\n\tFont-Size: Larger;\n}\n\u003C/style>\n\u003C/head>\n\u003Cbody>\n\u003Cdiv id=\"ClockDiv\" style=\"/*Margin: Calc(Var(--BodyMargin) * -1); Background:Black; Color: White;*/\">\n\t\u003Ch2 id=\"ClockTime\" class=\"Margin4\">\u003C/h2>\n\t\u003Cp id=\"ClockDate\" class=\"Margin4\">\u003C/p>\n\u003C/div>\n\u003Chr>\n\u003Ctable id=\"SearchDiv\">\u003Ctr>\n\u003Ctd>\n\t\u003Cdiv class=\"Dropdown\">\n\t\t\u003Cbutton class=\"DropdownBtn\" id=\"EnginesBtn\" style=\"Width:Max-Content;\">\u003Cimg id=\"EnginesCurrentIcon\" class=\"TextLineImg\" style=\"Vertical-Align:Sub;\">\u003Cspan id=\"EnginesCurrent\">\u003C/span>\u003C/button>\n\t\t\u003Cdiv class=\"DropdownBody\" id=\"EnginesDropdown\">\n\t\t\t\u003Cul id=\"EnginesList\">\u003C/ul>\n\t\t\u003C/div>\n\t\u003C/div>\n\u003C/td>\u003Ctd style=\"Width:100%;\">\n\t\u003Cinput type=\"text\" id=\"SearchInput\" onfocus=\"this.select();\" style=\"Width:Calc(100% - Var(--BodyMargin));\">\n\u003C/td>\n\u003C/tr>\u003C/table>\n\u003Cul id=\"BookmarksList\" class=\"SimpleList\">\u003C/ul>\n\n\u003Cscript>\nconst SearchEngines = {\n\t\"Whoogle\": \"https://www.whoogle.click/search?q=\",\n\t\"Wikipedia [\u003Ctt>EN\u003C/tt>]\": \"https://en.wikipedia.org/w/index.php?search=\",\n\t\"Wikipedia [\u003Ctt>IT\u003C/tt>]\": \"https://it.wikipedia.org/w/index.php?search=\",\n\t\"Invidious\": \"https://invidious.baczek.me/search?q=\",\n\t\"WordReference [\u003Ctt>EN->IT\u003C/tt>]\": \"https://www.wordreference.com/enit/\",\n\t\"WordReference [\u003Ctt>IT->EN\u003C/tt>]\": \"https://www.wordreference.com/iten/\"\n};\n\nconst Bookmarks = `\nhttp://octt.ddns.net:8017 FreshRSS;\nhttp://octt.ddns.net:8036 Wallabag;\nhttps://cryptpad.devol.it/drive CryptPad;\nhttps://www.deepl.com/translator DeepL;\nhttps://gitea.it Gitea;\nhttps://github.com GitHub;\nhttps://gitlab.com GitLab;\nhttps://librespeed.org LibreSpeed;\nhttps://odysee.com Odysee;\nhttps://www.openstreetmap.org OpenStreetMap;\nhttps://app.standardnotes.com Standard Notes;\nhttps://temp-mail.org/en Temp Mail;\nhttps://voidlinux.org/packages Void Linux/Packages;\nhttps://www.wikipedia.org Wikipedia;\nhttps://mail.yahoo.com Yahoo Mail;\n`;\n\nfunction GetImgAverageColor(Img) {\n\tconst colorThief = new ColorThief();\n\tif (Img.complete) {\n\t\treturn colorThief.getColor(Img);\n\t} else {\n\t\timage.addEventListener(\"load\", function() {\n\t\t\treturn colorThief.getColor(Img);\n\t\t});\n\t};\n};\n\n/* https://stackoverflow.com/a/2998874 */\nfunction ZeroPad(Num, Pad) {\n\tvar Zero = Pad - Num.toString().length + 1;\n\treturn Array(+(Zero > 0 && Zero)).join(\"0\") + Num;\n};\nfunction TimePad(Num) {\n\treturn ZeroPad(Num, 2);\n};\n\nfunction SetTime() {\n\tlet Time = new Date();\n\tlet Y = Time.getFullYear();\n\tlet M = TimePad(Time.getMonth() + 1);\n\tlet D = TimePad(Time.getDate()); /* Month day */\n\tlet N = Time.getDay(); /* Week day */\n\tlet h = TimePad(Time.getHours());\n\tlet m = TimePad(Time.getMinutes());\n\tlet s = TimePad(Time.getSeconds());\n\tClockTime.textContent = h + \":\" + m + \":\" + s;\n\tClockDate.textContent = Y + \"-\" + M + \"-\" + D;\n};\n\nfunction GetFavicon(URL) {\n\treturn \"https://icons.duckduckgo.com/ip3/\" + URL.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] + \".ico\";\n};\nfunction GetLineFavicon(URL) {\n\treturn '\u003Cimg class=\"TextLineImg\" src=\"' + GetFavicon(URL) + '\">'\n};\n\nfunction LoadBookmarks() {\n\tlet UlURLs = \"\";\n\tlet List = Bookmarks.trim().split(\";\");\n\tfor (let i=0; i\u003CList.length; i++) {\n\t\tlet Item = List[i].trim();\n\t\tif (Item) {\n\t\t\tlet Split = Item.indexOf(\" \");\n\t\t\tlet Href = Item.substring(0, Split);\n\t\t\tlet Name = Item.substring(Split+1);\n\t\t\tUlURLs += '\u003Cli>\u003Ca href=\"' + Href + '\" target=\"_blank\" rel=\"noopener\">' + GetLineFavicon(Href) + Name + '\u003C/a>\u003C/li>';\n\t\t};\n\t};\n\tBookmarksList.innerHTML += UlURLs;\n};\n\nfunction LoadSearchEngines() {\n\tEnginesCurrent.innerHTML = Object.keys(SearchEngines)[0];\n\tEnginesCurrentIcon.src = GetFavicon(SearchEngines[EnginesCurrent.innerHTML]);\n\tObject.keys(SearchEngines).forEach(function(Key) {\n\t\tEnginesList.innerHTML += \"\u003Cli onclick=\\\"EnginesCurrent.innerHTML=`\" + Key + \"`; EnginesCurrentIcon.src=`\" + GetFavicon(SearchEngines[Key]) + \"`;\\\">\" + GetLineFavicon(SearchEngines[Key]) + Key + \"\u003C/li>\";\n\t});\n};\n\nfunction ClockDateToggle() {\n\tClockDate.hidden = !ClockDate.hidden;\n};\nClockDiv.onclick = ClockDateToggle;\n\nSearchInput.onkeydown = function(e) {\n\tif (e.keyCode == 13) {\n\t\t// Only open search URL if textbox contains text, else open parent path (often site root)\n\t\twindow.open(SearchInput.value ? SearchEngines[EnginesCurrent.innerHTML] + SearchInput.value : SearchEngines[EnginesCurrent.innerHTML].split(\"/\").slice(0,-1).join(\"/\"));\n\t};\n};\n\nEnginesBtn.onclick = function() {\n\t\n};\nEnginesBtn.onmouseenter = function() {\n\t\n};\nEnginesBtn.onmouseleave = function() {\n\t\n};\n\nsetInterval(() => {\n\tSetTime();\n}, 150);\n\nLoadBookmarks();\nLoadSearchEngines();\n\u003C/script>\n\u003C/body>\n\u003C/html>","type":"text/html","created":"20221108215403917","modified":"20230108130553489","tags":""}, {"title":"$:/Apps/Dashboard/Style.css","text":":Root {\n\t--BodyMargin: 8px;\n}\n\nBody {\n\tText-Align: Center;\n\tUser-Select: None;\n\tFont-Family: Sans-Serif;\n\tMargin: Var(--BodyMargin);\n}\n\nA {\n\tColor: Black;\n\tText-Decoration: None;\n}\nUl {\n\tText-Align: Left;\n\tList-Style: None;\n\tColumn-Count: 1;\n\tMargin-Top: 8px;\n\tMargin-Bottom: 8px;\n\tPadding-Left: 0px;\n\tPadding-Right: 0px;\n}\nLi {\n\tLine-Height: 1.75em;\n\tFont-Size: Larger;\n\tPadding-Left: 8px;\n\tPadding-Right: 8px;\n}\nLi:Hover {\n\tBackground: LightGray;\n}\n\n.SimpleList Li {\n\tWidth: Fit-Content;\n}\n\n.TextLineImg {\n\tWidth: 1em;\n\tHeight: 1em;\n\tVertical-Align: Text-Top;\n\tPadding-Right: 8px;\n}\n.Margin4 {\n\tMargin: 4px;\n}\n\n.Dropdown {\n\tPosition: Relative;\n\tDisplay: Inline-Block;\n}\n.DropdownBtn {\n\tCursor: Pointer;\n\tBackground: LightGray;\n\tColor: Black;\n}\n.DropdownBody {\n\tDisplay: None;\n\tPosition: Absolute;\n\tWidth: Max-Content;\n\tBackground: White;\n\tBox-Shadow: 0px 8px 8px 0px RGBA(0,0,0,0.2);\n\tZ-Index: 1;\n}\n.DropdownBtn:Hover ~ .DropdownBody,\n.DropdownBody:Hover {\n\tDisplay: Block;\n\tPosition: Absolute;\n}\n.Dropdown Li {\n\tCursor: Pointer;\n\tText-Align: Center;\n}\n.SearchDiv {\n\tWidth: Max-Content;\n}\n.DropdownBtn, Input[Type=\"Text\"] {\n\tFont-Size: Larger;\n}","created":"20221108222403364","modified":"20221108222437545","tags":"","type":"text/css"}, -{"title":"$:/Apps/MagicBox",".context":"1",".type":"masonry",".width":"33","created":"20240129095948486","creator":"Octt","modified":"20240129234018781","modifier":"Octt","tags":"$:/Apps","text":"\\define SearchResults(fields)\n\u003C$list filter=\"[!is[system]search:$fields${$:/temp/MagicBox!!.input}sort[title]limit[100]]\">\n\t\u003Cdiv class=`MagicBoxApplet result ${[{$:/Apps/MagicBox!!.type}]}$` style=`background-image: url(\"${[{!!page-cover}]}$\");`>\n\t\t\u003C$button class=\"tc-btn-invisible\">\n\t\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CcloseOnChoose>>/>\n\t\t\t\u003C$action-navigate $to={{!!title}}/>\n\t\t\t\u003C!--\u003C$link to={{!!title}}>-->\n\t\t\t\t\u003Ch3>\n\t\t\t\t\t\u003C$link to={{!!title}} tabindex=\"-1\"/>\n\t\t\t\t\u003C/h3>\n\t\t\t\t\u003C$if value={{$:/Apps/MagicBox!!.context}}>\n\t\t\t\t\t\u003C$context term={{$:/temp/MagicBox!!.input}} tabindex=\"-1\"/>\n\t\t\t\t\u003C/$if>\n\t\t\t\u003C!--\u003C/$link>-->\n\t\t\u003C/$button>\n\t\u003C/div>\n\u003C/$list>\n\\end\n\n\u003Cdiv class=\"MagicBoxApplet options\">\n\t\u003C$checkbox field=\".context\" checked=\"1\">Context\u003C/$checkbox>\n\t \n\t\u003C!--\u003C$edit-text field=\".type\" placeholder=\"Display Type\"/>-->\n\t\u003C$checkbox field=\".type\" checked=\"grid\" unchecked=\"masonry\">Fixed Grid\u003C/$checkbox>\n\t \n\t\u003C$range field=\".width\" min=\"19\" max=\"49\"/>{{!!.width}}\n\t \n\t\u003C$edit-text tiddler=\"$:/temp/MagicBox\" field=\".input\" class=\"_input\" placeholder=\"Search...\" tabindex=\"0\"/>\n\u003C/div>\n\n\u003C$action-sendmessage $message=\"tm-focus-selector\" $param=\".MagicBoxApplet.options > ._input\"/>\n\u003C\u003Cscript script='try {\n\tdocument.querySelector(\".MagicBoxApplet.options > ._input\")?.focus();\n\tdocument.querySelector(\"div.tc-tiddler-frame.tc-tiddler-view-frame[data-tiddler-title=\\\"$:/Apps/MagicBox/Overlay\\\"] .MagicBoxApplet.options > ._input\")?.focus();\n} catch(e) { $OcttKB.ErrAtLine(e) }'>>\u003C\u003Cscript off>>\n\n\u003Cstyle>\n\t@media (max-width: 500px) {\n\t\t.MagicBoxApplet.result {\n\t\t\tmin-width: calc(({{!!.width}}% * 2) - 16px) !important;\n\t\t\tmax-width: calc(({{!!.width}}% * 3) - 16px) !important;\n\t\t}\n\t}\n\t.MagicBoxApplet.result {\n\t\tmargin: 8px;\n\t\tdisplay: inline-block;\n\t\tbackground-color: lightgray;\n\t\tbackground-size: cover;\n\t\tbackground-position: center;\n\t}\n\t.MagicBoxApplet.result.grid {\n\t\twidth: calc({{!!.width}}% - 16px);\n\t\taspect-ratio: 16/9;\n\t\tvertical-align: top;\n\t}\n\t.MagicBoxApplet.result.masonry {\n\t\tmax-width: calc({{!!.width}}% - 16px);\n\t}\n\t.MagicBoxApplet.result h3 {\n\t\tmargin-top: 25%;\n\t\tpadding: 8px;\n\t\tbackground-color: rgba(255, 255, 255, 0.75);\n\t\ttext-align: center;\n\t}\n\t.MagicBoxApplet.result pre {\n\t\tcolor: initial;\n\t\tmax-height: 7em;\n\t\toverflow-y: auto;\n\t\tmargin: 0;\n\t\ttop: 1em;\n\t\tposition: relative;\n\t\ttext-align: initial;\n\t}\n\t.MagicBoxApplet.result h3 > a {\n\t\tpointer-events: none;\n\t}\n\t.MagicBoxApplet.result > a,\n\t.MagicBoxApplet.result > button {\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\t.MagicBoxApplet.result > a:after {\n\t\tcontent: \"\" !important;\n\t}\n\u003C/style>\n\n\u003C$if value={{{ [{$:/temp/MagicBox!!.input}split[]count[]compare:integer:gteq[3]then[1]] }}}>\n\t\u003C$if value={{{ [!is[system]search:title{$:/temp/MagicBox!!.input}then[]else[1]] }}}>\n\t\t\u003C$button>\n\t\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CcloseOnChoose>>/>\n\t\t\t\u003C$action-sendmessage $message=\"tm-new-tiddler\" title={{$:/temp/MagicBox!!.input}} />\n\t\t\tCreate as New Tiddler\n\t\t\u003C/$button>\n\t\u003C/$if>\n\n\t\u003Cdiv>\u003Cbr/>\u003Chr/>\u003Cbr/>\u003C/div>\n\n\tTitle or Caption matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"title,caption\">>\n\n\t\u003Cdiv>\u003Cbr/>\u003Chr/>\u003Cbr/>\u003C/div>\n\n\tTags or Text matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"tags,text\">>\n\u003C/$if>"}, +{"title":"$:/Apps/MagicBox",".context":"1",".type":"masonry",".width":"33","created":"20240129095948486","creator":"Octt","modified":"20240130144632702","modifier":"Octt","tags":"$:/Apps","text":"\\define SearchResults(fields)\n\u003C$list filter=\"[!is[system]search:$fields${$:/temp/MagicBox!!.input}sort[title]limit[100]]\">\n\t\u003Cdiv class=`MagicBoxApplet result ${[{$:/Apps/MagicBox!!.type}]}$` style=`background-image: url(\"${[{!!page-cover}]}$\");`>\n\t\t\u003C$button class=\"OcttKB-BorderFocus tc-btn-invisible\">\n\t\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CcloseOnChoose>>/>\n\t\t\t\u003C$action-navigate $to={{!!title}}/>\n\t\t\t\u003C!--\u003C$link to={{!!title}}>-->\n\t\t\t\t\u003Ch3>\n\t\t\t\t\t\u003C$link to={{!!title}} tabindex=\"-1\"/>\n\t\t\t\t\u003C/h3>\n\t\t\t\t\u003C$if value={{$:/Apps/MagicBox!!.context}}>\n\t\t\t\t\t\u003C$context term={{$:/temp/MagicBox!!.input}} tabindex=\"-1\"/>\n\t\t\t\t\u003C/$if>\n\t\t\t\u003C!--\u003C/$link>-->\n\t\t\u003C/$button>\n\t\u003C/div>\n\u003C/$list>\n\\end\n\n\u003Cdiv class=\"MagicBoxApplet options\">\n\t\u003C$checkbox field=\".context\" checked=\"1\">Context\u003C/$checkbox>\n\t \n\t\u003C!--\u003C$edit-text field=\".type\" placeholder=\"Display Type\"/>-->\n\t\u003C$checkbox field=\".type\" checked=\"grid\" unchecked=\"masonry\">Fixed Grid\u003C/$checkbox>\n\t \n\t\u003C$range field=\".width\" min=\"19\" max=\"49\"/>{{!!.width}}\n\t \n\t\u003C$edit-text tiddler=\"$:/temp/MagicBox\" field=\".input\" class=\"OcttKB-BorderFocus _input\" placeholder=\"Search...\" tabindex=\"0\"/>\n\u003C/div>\n\n\u003C$action-sendmessage $message=\"tm-focus-selector\" $param=\".MagicBoxApplet.options > ._input\"/>\n\u003C\u003Cscript script='try {\n\tvar inputElem = document.querySelector(\"div.tc-tiddler-frame.tc-tiddler-view-frame[data-tiddler-title=\\\"$:/Apps/MagicBox/Overlay\\\"] .MagicBoxApplet.options > ._input, .MagicBoxApplet.options > ._input\");\n\tinputElem?.focus();\n\tinputElem?.select();\n} catch(e) { $OcttKB.ErrAtLine(e) }'>>\u003C\u003Cscript off>>\n\n\u003Cstyle>\n\t@media (max-width: 500px) {\n\t\t.MagicBoxApplet.result {\n\t\t\tmin-width: calc(({{!!.width}}% * 2) - 16px) !important;\n\t\t\tmax-width: calc(({{!!.width}}% * 3) - 16px) !important;\n\t\t}\n\t}\n\t.MagicBoxApplet.result {\n\t\tmargin: 8px;\n\t\tdisplay: inline-block;\n\t\tbackground-color: lightgray;\n\t\tbackground-size: cover;\n\t\tbackground-position: center;\n\t}\n\t.MagicBoxApplet.result.grid {\n\t\twidth: calc({{!!.width}}% - 16px);\n\t\taspect-ratio: 16/9;\n\t\tvertical-align: top;\n\t}\n\t.MagicBoxApplet.result.masonry {\n\t\tmax-width: calc({{!!.width}}% - 16px);\n\t}\n\t.MagicBoxApplet.result h3 {\n\t\tmargin-top: 25%;\n\t\tpadding: 8px;\n\t\tbackground-color: rgba(255, 255, 255, 0.75);\n\t\ttext-align: center;\n\t}\n\t.MagicBoxApplet.result pre {\n\t\tcolor: initial;\n\t\tmax-height: 10em;\n\t\toverflow-y: auto;\n\t\tmargin: 0;\n\t\ttop: 0.5em;\n\t\tposition: relative;\n\t\ttext-align: initial;\n\t\tfont-size: small;\n\t}\n\t.MagicBoxApplet.result h3 > a {\n\t\tpointer-events: none;\n\t}\n\t.MagicBoxApplet.result > a,\n\t.MagicBoxApplet.result > button {\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\t.MagicBoxApplet.result > a:after {\n\t\tcontent: \"\" !important;\n\t}\n\u003C/style>\n\n\u003C$if value={{{ [{$:/temp/MagicBox!!.input}split[]count[]compare:integer:gteq[3]then[1]] }}}>\n\t\u003C$if value={{{ [search:title{$:/temp/MagicBox!!.input}then[0]else[1]] }}}>\n\t\t\u003C$button>\n\t\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CcloseOnChoose>>/>\n\t\t\t\u003C$action-sendmessage $message=\"tm-new-tiddler\" title={{$:/temp/MagicBox!!.input}} />\n\t\t\tCreate as New Tiddler\n\t\t\u003C/$button>\n\t\u003C/$if>\n\n\t\u003Cdiv>\u003Cbr/>\u003Chr/>\u003Cbr/>\u003C/div>\n\n\tTitle or Caption matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"title,caption\">>\n\n\t\u003Cdiv>\u003Cbr/>\u003Chr/>\u003Cbr/>\u003C/div>\n\n\tTags or Text matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"tags,text\">>\n\u003C/$if>"}, {"title":"$:/Apps/MagicBox/Buttons/Toggle-MagicBox","created":"20240129160009781","creator":"Octt","list-before":"$:/core/ui/Buttons/more-page-actions","modified":"20240129223619782","modifier":"Octt","tags":"$:/tags/PageControls","text":"\\define label() Toggle MagicBox\n\\whitespace trim\n\u003C$button tooltip=\u003C\u003Clabel>> class=\u003C\u003Ctv-config-toolbar-class>>>\n\t\u003C$if value=\u003C\u003Ctv-config-toolbar-icons>> match=\"yes\">\n\t\t🪟️\n\t\u003C/$if>\n\t\u003C$if value=\u003C\u003Ctv-config-toolbar-text>> match=\"yes\">\n\t\t\u003Cspan class=\"tc-btn-text\">\n\t\t\t\u003C$text text=\u003C\u003Clabel>>/>\n\t\t\u003C/span>\n\t\u003C/$if>\n\t{{$:/Apps/MagicBox/Shortcuts/Toggle-MagicBox}}\n\u003C/$button>"}, {"title":"$:/Apps/MagicBox/Overlay","created":"20240129145705629","creator":"Octt","modified":"20240129161333542","modifier":"Octt","tags":"","text":"\\define @thisOverlay() section.tc-story-river > div.tc-tiddler-frame.tc-tiddler-view-frame[data-tiddler-title=\"\u003C$text text=\u003C\u003CcurrentTiddler>>/>\"]\n\u003Cstyle>\n\t\u003C\u003C@thisOverlay>> {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tz-index: 9999;\n\t\twidth: 100vw;\n\t\theight: 100vh;\n\t\toverflow-y: auto;\n\t}\n\t\u003C\u003C@thisOverlay>> div.tc-tiddler-title,\n\t\u003C\u003C@thisOverlay>> div.tc-titlebar {\n\t\tbackground: none;\n\t\theight: 0;\n\t}\n\t\u003C\u003C@thisOverlay>> .tc-tiddler-controls button {\n\t\tdisplay: none;\n\t}\n\t\u003C\u003C@thisOverlay>> .tc-tiddler-controls button[class*=\"tc-btn-%24%3A%2Fcore%2Fui%2FButtons%2Fclose\"] {\n\t\tdisplay: revert;\n\t\tposition: fixed;\n\t\ttop: 0px;\n\t right: 8px;\n\t}\n\t\u003C\u003C@thisOverlay>> .View-Breadcrumbs,\n\t\u003C\u003C@thisOverlay>> div.OcttKB-i18n,\n\t\u003C\u003C@thisOverlay>> div.tc-subtitle {\n\t\tdisplay: none;\n\t}\n\u003C/style>\n\u003C$set name=closeOnChoose value=\u003C\u003CcurrentTiddler>>>\n\t{{$:/Apps/MagicBox}}\n\u003C/$set>"}, {"title":"$:/Apps/MagicBox/readme","created":"20240129220613684","creator":"Octt","modified":"20240129225200513","modifier":"Octt","tags":"","text":"This currently work-in-progress, experimental applet provides a \"magic box\", allowing for wiki content to be searched in a visually effective way: a full-screen interface complete with previews and covers.\n\n* Thread: [[https://talk.tiddlywiki.org/t/wiki-search-grid-with-covers-and-content-preview-prototype/9003]]\n\nInstall in other wiki by drag-and-drop:\n\n# \u003C$draggable tag=\"button\" filter=\"[[$:/Apps/MagicBox]] [prefix[$:/Apps/MagicBox/]] [tag[$:/Apps/MagicBox]] [tag[$:/Apps/MagicBox/Attached]]\">\n\tAll applet files\n\u003C/$draggable>\n\n# (Required dependency) \u003C$draggable tag=\"button\" filter=\"[[$:/plugins/ebalster/condition]]\">\n\t`ebalster/condition` plugin\n\u003C/$draggable>\n\n# (Optional dependency, required to show content) \u003C$draggable tag=\"button\" filter=\"[[$:/plugins/danielo515/ContextPlugin/Stylesheet/results]] [[$:/plugins/danielo515/ContextPlugin/widgets/context.js]]\">\n\tCore files of `danielo515/ContextPlugin` plugin, modified to allow `tabindex=-1`\n\u003C/$draggable>"}, @@ -273,7 +273,7 @@ {"title":"$:/config/ColourPicker/Recent","created":"20230905203524623","creator":"Octt","list":"LavenderBlush Crimson","modified":"20230905203528618","modifier":"Octt"}, {"title":"$:/config/DefaultSidebarTab","created":"20230109112444017","creator":"Octt","modified":"20230208220024639","modifier":"Octt","text":"OcttKB/Index"}, {"title":"$:/config/KookmaPluginLibrary","caption":"Kookma Plugin Library","created":"20200306121057751","modified":"20200323203955814","revision":"0","tags":"$:/tags/PluginLibrary","type":"text/vnd.tiddlywiki","url":"https://kookma.github.io/TW-PluginLibrary/library/index.html","text":"Kookma plugin library is a set of plugins, themes, and scripts, to extend functionality and add new features to Tiddlywiki. For detail information visit the library at [[GitHub|https://github.com/kookma]]. It is recommended to backup your data before installing any plugin, theme, or script. \n\nTo use in other wikis, drag and drop this link to those wikis: [[Kookma Plugin Library|$:/config/KookmaPluginLibrary]]"}, -{"title":"$:/config/Manager/Filter","created":"20240128222912902","creator":"Octt","modified":"20240129160709219","modifier":"Octt","text":"MagicBox"}, +{"title":"$:/config/Manager/Filter","created":"20240128222912902","creator":"Octt","modified":"20240130163532498","modifier":"Octt"}, {"title":"$:/config/Manager/RecentTags","created":"20230203214457411","creator":"Octt","list":"OS Generic $:/tags/Commander/Working Unix Tetris DIY Gaming Nintendo Game Console App Matrix.org","modified":"20230211164100182","modifier":"Octt"}, {"title":"$:/config/Manager/Show","created":"20220920161308377","modified":"20220920161309789","text":"tiddlers"}, {"title":"$:/config/Manager/System","created":"20230203215732789","creator":"Octt","modified":"20240129160704435","modifier":"Octt"}, @@ -354,10 +354,10 @@ {"title":"$:/config/shortcuts/sidebar-search","created":"20231221120825058","creator":"Octt","modified":"20231221152320096","modifier":"Octt","text":"ctrl-shift-F shift-alt-F"}, {"title":"$:/config/shortcuts/stamp","created":"20231221120822873","creator":"Octt","modified":"20231221120822873","modifier":"Octt"}, {"title":"$:/config/shortcuts/StoryCurrent","created":"20211229144857054","creator":"Octt","modified":"20231221142707356","modifier":"Octt","tags":"$:/km/keynav","text":"shift-alt-C"}, -{"title":"$:/config/shortcuts/StoryFirst","created":"20211229144823211","creator":"Octt","modified":"20231221142729068","modifier":"Octt","tags":"$:/km/keynav","text":"shift-alt-Up"}, -{"title":"$:/config/shortcuts/StoryLast","created":"20211229144841080","creator":"Octt","modified":"20231221142732516","modifier":"Octt","tags":"$:/km/keynav","text":"shift-alt-Down"}, -{"title":"$:/config/shortcuts/StoryNext","created":"20211229144803909","creator":"Octt","modified":"20231221142739629","modifier":"Octt","tags":"$:/km/keynav","text":"shift-alt-Left"}, -{"title":"$:/config/shortcuts/StoryPrev","created":"20211229143921111","creator":"Octt","modified":"20231221142743532","modifier":"Octt","tags":"$:/km/keynav","text":"shift-alt-Right"}, +{"title":"$:/config/shortcuts/StoryFirst","created":"20211229144823211","creator":"Octt","modified":"20240130145028693","modifier":"Octt","tags":"$:/km/keynav"}, +{"title":"$:/config/shortcuts/StoryLast","created":"20211229144841080","creator":"Octt","modified":"20240130145114687","modifier":"Octt","tags":"$:/km/keynav"}, +{"title":"$:/config/shortcuts/StoryNext","created":"20211229144803909","creator":"Octt","modified":"20240130144815910","modifier":"Octt","tags":"$:/km/keynav","text":"shift-alt-Left shift-alt-Up"}, +{"title":"$:/config/shortcuts/StoryPrev","created":"20211229143921111","creator":"Octt","modified":"20240130144821891","modifier":"Octt","tags":"$:/km/keynav","text":"shift-alt-Right shift-alt-Down"}, {"title":"$:/config/shortcuts/strikethrough","created":"20231221120808649","creator":"Octt","modified":"20231221121257759","modifier":"Octt","text":"ctrl-alt-S"}, {"title":"$:/config/shortcuts/subscript","created":"20231221120805561","creator":"Octt","modified":"20231221144226895","modifier":"Octt","text":"ctrl-alt-B"}, {"title":"$:/config/shortcuts/superscript","created":"20231221120803713","creator":"Octt","modified":"20231221144246691","modifier":"Octt","text":"ctrl-alt-P"}, @@ -586,7 +586,8 @@ {"title":"$:/state/addplugins/tab-1342078386","created":"20221109142817793","creator":"Octt","modified":"20240129010808326","modifier":"Octt","text":"$:/config/OfficialPluginLibrary"}, {"title":"$:/state/advancedsearch/currentTab","created":"20230109143853256","creator":"Octt","modified":"20240129215548626","modifier":"Octt","text":"$:/core/ui/AdvancedSearch/Filter"}, {"title":"$:/state/codemirror-6/translate/Draft of 'TiddlyWiki/ThirdParty' by Octt","created":"20240128231636637","creator":"Octt","modified":"20240128231640844","modifier":"Octt","text":"yes"}, -{"title":"$:/state/commander/log-tiddler","created":"20230203222356189","creator":"Octt","modified":"20240129002728746","modifier":"Octt","text":"$:/temp/commander/logs/tid-1"}, +{"title":"$:/state/commander/log-tiddler","created":"20230203222356189","creator":"Octt","modified":"20240130163630607","modifier":"Octt","text":"$:/temp/commander/logs/tid-2"}, +{"title":"$:/state/commander/reveal/$:/plugins/kookma/commander/log/ui--23637530","created":"20240130163644030","creator":"Octt","modified":"20240130163644030","modifier":"Octt","text":"open"}, {"title":"$:/state/commander/reveal/$:/plugins/kookma/commander/search/selection-668442618","created":"20230117113820190","creator":"Octt","modified":"20230206203755250","modifier":"Octt","text":"open"}, {"title":"$:/state/commander/snr/select-tiddler","created":"20230203222519483","creator":"Octt","modified":"20230209170836660","modifier":"Octt"}, {"title":"$:/state/compInspect/temp/commander/selectState-tiddler","created":"20230203222519484","creator":"Octt","modified":"20230209170836661","modifier":"Octt"}, @@ -636,10 +637,10 @@ {"title":"$:/state/dropdown/keyboardshortcut/sidebar-search--502179266","created":"20231221120700496","creator":"Octt","modified":"20240128232432378","modifier":"Octt","text":"close"}, {"title":"$:/state/dropdown/keyboardshortcut/stamp--502179266","created":"20231221120700152","creator":"Octt","modified":"20231221142700459","modifier":"Octt","text":"close"}, {"title":"$:/state/dropdown/keyboardshortcut/StoryCurrent--502179266","created":"20231221120659800","creator":"Octt","modified":"20231221142708532","modifier":"Octt","text":"close"}, -{"title":"$:/state/dropdown/keyboardshortcut/StoryFirst--502179266","created":"20231221120659464","creator":"Octt","modified":"20231221142747652","modifier":"Octt","text":"close"}, -{"title":"$:/state/dropdown/keyboardshortcut/StoryLast--502179266","created":"20231221120659032","creator":"Octt","modified":"20231221142745564","modifier":"Octt","text":"close"}, -{"title":"$:/state/dropdown/keyboardshortcut/StoryNext--502179266","created":"20231221120658624","creator":"Octt","modified":"20231221142744876","modifier":"Octt","text":"close"}, -{"title":"$:/state/dropdown/keyboardshortcut/StoryPrev--502179266","created":"20231221120658160","creator":"Octt","modified":"20231221142746236","modifier":"Octt","text":"close"}, +{"title":"$:/state/dropdown/keyboardshortcut/StoryFirst--502179266","created":"20231221120659464","creator":"Octt","modified":"20240130145117719","modifier":"Octt","text":"close"}, +{"title":"$:/state/dropdown/keyboardshortcut/StoryLast--502179266","created":"20231221120659032","creator":"Octt","modified":"20240130145115872","modifier":"Octt","text":"close"}, +{"title":"$:/state/dropdown/keyboardshortcut/StoryNext--502179266","created":"20231221120658624","creator":"Octt","modified":"20240130144850086","modifier":"Octt","text":"close"}, +{"title":"$:/state/dropdown/keyboardshortcut/StoryPrev--502179266","created":"20231221120658160","creator":"Octt","modified":"20240130144851341","modifier":"Octt","text":"close"}, {"title":"$:/state/dropdown/keyboardshortcut/strikethrough--502179266","created":"20231221120657833","creator":"Octt","modified":"20231221121417848","modifier":"Octt","text":"close"}, {"title":"$:/state/dropdown/keyboardshortcut/subscript--502179266","created":"20231221120657304","creator":"Octt","modified":"20231221144227975","modifier":"Octt","text":"close"}, {"title":"$:/state/dropdown/keyboardshortcut/superscript--502179266","created":"20231221120656928","creator":"Octt","modified":"20231221144248647","modifier":"Octt","text":"close"}, @@ -791,9 +792,9 @@ {"title":"$:/state/plugin-info-2030122776-$:/plugins/oeyoews/tiddlywiki-codemirror-6---1853744903","created":"20240128215059448","creator":"Octt","modified":"20240128224806116","modifier":"Octt","text":"readme"}, {"title":"$:/state/plugin-info-496662381-$:/languages/it-IT","created":"20230218113830823","creator":"Octt","modified":"20230218114059177","modifier":"Octt","text":"no"}, {"title":"$:/state/search/currentTab","created":"20230501095944427","creator":"Octt","modified":"20240128225117219","modifier":"Octt","text":"$:/core/ui/DefaultSearchResultList"}, -{"title":"$:/state/showeditpreview","created":"20220920140732083","creator":"Octt","modified":"20240129223326435","modifier":"Octt","text":"no"}, +{"title":"$:/state/showeditpreview","created":"20220920140732083","creator":"Octt","modified":"20240130143619413","modifier":"Octt","text":"no"}, {"title":"$:/state/ShowPaletteEditor","created":"20220920114858684","modified":"20220920114858684","text":"yes"}, -{"title":"$:/state/sidebar","created":"20220920174307633","creator":"Octt","modified":"20240129133637373","modifier":"Octt","text":"yes"}, +{"title":"$:/state/sidebar","created":"20220920174307633","creator":"Octt","modified":"20240130140903653","modifier":"Octt","text":"yes"}, {"title":"$:/state/tab--1091387428","created":"20220922115715109","creator":"Octt","modified":"20230508210119459","modifier":"Octt","text":"$:/Octt/Music Archiving Status/VANTAGE"}, {"title":"$:/state/tab--1421386850","created":"20230209145707201","creator":"Octt","modified":"20230209145717889","modifier":"Octt","text":"$:/core/ui/TiddlerInfo/Tools"}, {"title":"$:/state/tab--1440231522","created":"20230217120532762","creator":"Octt","modified":"20230217120533957","modifier":"Octt","text":"$:/plugins/tiddlywiki/text-slicer/docs/usage"}, @@ -802,10 +803,11 @@ {"title":"$:/state/tab--1581376822","created":"20230117125310625","creator":"Octt","modified":"20230117125313877","modifier":"Octt","text":"$:/plugins/flibbles/relink/ui/TiddlerInfo/References"}, {"title":"$:/state/tab--1588928600","created":"20230110152826768","modified":"20230110152833719","text":"$:/core/ui/TiddlerInfo/Fields"}, {"title":"$:/state/tab--1672778217","created":"20240128222933768","creator":"Octt","modified":"20240128222934548","modifier":"Octt","text":"$:/plugins/kookma/commander/tiddler/uicomp/delete-tiddlers"}, +{"title":"$:/state/tab--1697244606","created":"20240130163352898","creator":"Octt","modified":"20240130163913678","modifier":"Octt","text":"$:/core/ui/TiddlerInfo/Tools"}, {"title":"$:/state/tab--1885964178","created":"20220920191426046","modified":"20220920191431231","text":"$:/core/ui/TiddlerInfo/Tools"}, {"title":"$:/state/tab--1963855381","created":"20220920090533937","creator":"Octt","modified":"20240129120246880","modifier":"Octt","text":"$:/core/ui/ControlPanel/Toolbars"}, {"title":"$:/state/tab--2112689675","created":"20220920090438306","creator":"Octt","modified":"20231110114859307","modifier":"Octt","text":"$:/core/ui/ControlPanel/Basics"}, -{"title":"$:/state/tab--23637530","created":"20231107221030108","creator":"Octt","modified":"20240129160536894","modifier":"Octt","text":"$:/plugins/kookma/commander/snr/ui"}, +{"title":"$:/state/tab--23637530","created":"20231107221030108","creator":"Octt","modified":"20240130163540682","modifier":"Octt","text":"$:/plugins/kookma/commander/field/ui"}, {"title":"$:/state/tab--257319936","created":"20230110215945671","modified":"20230110215951590","text":"$:/core/ui/TiddlerInfo/References"}, {"title":"$:/state/tab--639260661","created":"20230124112758912","creator":"Octt","modified":"20230215182507150","modifier":"Octt","text":"$:/core/ui/ControlPanel/Plugins/Add/Plugins"}, {"title":"$:/state/tab--697582678","created":"20221104182518580","modified":"20230108193715701","text":"$:/core/ui/ControlPanel/Settings/TiddlyWiki"}, @@ -816,9 +818,10 @@ {"title":"$:/state/tab-1410043539","created":"20230203222331010","creator":"Octt","modified":"20230207221424319","modifier":"Octt","text":"$:/plugins/kookma/commander/tag/uicomp/add-remove-tags"}, {"title":"$:/state/tab-1558774480","created":"20230926071540758","creator":"Octt","modified":"20230926071548108","modifier":"Octt","text":"$:/core/ui/TiddlerInfo/Advanced"}, {"title":"$:/state/tab-1606569932","created":"20230508205451649","creator":"Octt","modified":"20230508210959773","modifier":"Octt","text":"$:/Octt/Music Archiving Status/(Misc)"}, -{"title":"$:/state/tab-1749438307","created":"20220920090405977","creator":"Octt","modified":"20240129230306596","modifier":"Octt","text":"$:/core/ui/ControlPanel/Appearance"}, +{"title":"$:/state/tab-1749438307","created":"20220920090405977","creator":"Octt","modified":"20240130144710127","modifier":"Octt","text":"$:/core/ui/ControlPanel/KeyboardShortcuts"}, {"title":"$:/state/tab-1754034960","created":"20230110215926447","modified":"20230110215935623","text":"$:/core/ui/TiddlerInfo/References"}, {"title":"$:/state/tab-1912911341","created":"20231107221031452","creator":"Octt","modified":"20231107221034852","modifier":"Octt","text":"$:/plugins/kookma/commander/tag/uicomp/add-remove-tags"}, +{"title":"$:/state/tab-1964634701","created":"20240130163555079","creator":"Octt","modified":"20240130163943321","modifier":"Octt","text":"$:/plugins/kookma/commander/field/uicomp/add-fields"}, {"title":"$:/state/tab-2025781229","created":"20220922151106305","modified":"20220922151357705","text":"Music Archiving Status/Android52"}, {"title":"$:/state/tab-2065006209","created":"20220920091923734","creator":"Octt","modified":"20230926061021641","modifier":"Octt","text":"$:/core/ui/ControlPanel/Saving/GitLab"}, {"title":"$:/state/tab-224541917","created":"20220920090825998","creator":"Octt","modified":"20230219212730831","modifier":"Octt","text":"$:/core/ui/ControlPanel/Plugins/Add/Plugins"}, @@ -833,7 +836,7 @@ {"title":"$:/state/tab-99014043","created":"20220921221238452","creator":"Octt","modified":"20230218224826352","modifier":"Octt","text":"$:/core/ui/ControlPanel/TiddlerIcon"}, {"title":"$:/state/tab/moresidebar-1850697562","created":"20220920114911876","creator":"Octt","modified":"20230920153329472","modifier":"Octt","text":"$:/core/ui/MoreSideBar/Explorer"}, {"title":"$:/state/tab/search-results/sidebar","created":"20230501095944427","creator":"Octt","modified":"20240128225117219","modifier":"Octt","text":"$:/core/ui/DefaultSearchResultList"}, -{"title":"$:/state/tab/sidebar--595412856","created":"20220920092307479","creator":"Octt","modified":"20240129223648813","modifier":"Octt","text":"OcttKB/Index"}, +{"title":"$:/state/tab/sidebar--595412856","created":"20220920092307479","creator":"Octt","modified":"20240130172746108","modifier":"Octt","text":"OcttKB/Index"}, {"title":"$:/state/tabs/controlpanel/toolbars-1345989671","created":"20220920114638764","creator":"Octt","modified":"20240129143019544","modifier":"Octt","text":"$:/core/ui/ControlPanel/Toolbars/ViewToolbar"}, {"title":"$:/state/tag-cloud-count","created":"20230109231545587","modified":"20230109231831243","text":"inline"}, {"title":"$:/state/toc-$:/OcttKB/ToC-2084057354","created":"20230301190128004","creator":"Octt","modified":"20230301190128780","modifier":"Octt","text":"close"}, @@ -848,7 +851,7 @@ {"title":"$:/state/toc/$:/ToC-$:/Games-1491465924","created":"20230227182906960","creator":"Octt","modified":"20230301140227063","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Games-747701490","created":"20230225112101049","creator":"Octt","modified":"20230301115417837","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools--1446284390","created":"20240127224231676","creator":"Octt","modified":"20240127224233280","modifier":"Octt","text":"close"}, -{"title":"$:/state/toc/$:/ToC-$:/Tools--1697730578","created":"20230817233308156","creator":"Octt","modified":"20240129215819354","modifier":"Octt","text":"close"}, +{"title":"$:/state/toc/$:/ToC-$:/Tools--1697730578","created":"20230817233308156","creator":"Octt","modified":"20240130172629197","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools--685112640","created":"20230217211142634","creator":"Octt","modified":"20230217211145890","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools--777438282","created":"20230301202335134","creator":"Octt","modified":"20230301204324760","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools-1491465924","created":"20230227182905552","creator":"Octt","modified":"20230227182906545","modifier":"Octt","text":"close"}, @@ -1052,11 +1055,11 @@ {"title":"$:/Styles/1337box/shadow.css","text":"/*\\\nCredits: 1337box by Leah Rowe, Creative Commons Zero 1.0\nInfo: \u003Chttps://vimuser.org/1337box.html>\n\\*/\n.f, .f * {\n position: fixed;\n max-width: 100%;\n max-height: 100%;\n top: 50%;\n left: 50%\n}\n.f * { transform: translate(-50%,-50%) }\n.f {\n display: none;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 999;\n background:rgba(0,0,0,0.8);\n}\n*:focus + .f { display:block; }\nimg { cursor:pointer; }\n","Credits":"1337box by Leah Rowe, Creative Commons Zero 1.0","Info":"\u003Chttps://vimuser.org/1337box.html>","created":"20230114161404958","modified":"20230114163044372","tags":"","type":"text/css"}, {"title":"$:/Styles/bilibili-back-to-top.html","created":"20230124224040783","creator":"Octt","modified":"20230218174510343","modifier":"Octt","tags":"$:/tags/AboveStory","text":"\u003C!-- Original image is by \u003Chttps://bilibili.com> -->\n\u003C!-- \u003Cdiv -->\n\u003Ca\nclass=\"bilibili-back-to-top\"\ntitle=\"Cute little lolis from bilibili to help you reach the top of the page...\"\nstyle=\"\n\ndisplay: block; \nposition: fixed;\n/*\nbottom: 100px;\nright: 20px;\n*/\nz-index: 9999;\nbottom: 2px;\nleft: 2px;\ntransform: translateY(0px);\nwidth: 62px;\nheight: 85px;\n/*\nmargin-left: 602px;\n*/\ntransform: scale(0.5);\ncursor: pointer;\nbackground-image: url(https://s1.hdslb.com/bfs/static/jinkela/space/assets/space-to-top.png);\nbackground-position: -40px -44px;\n\n\" href=\"javascript:(function(){\n\nvar Select = [\n '.tc-story-river > .story-backdrop',\n '.tc-sidebar-scrollable .tc-sidebar-header .tc-site-title',\n];\nfor (var i=0; i \u003C Select.length; i++) {\n var Elem = document.querySelectorAll(Select[i])[0];\n Elem.scrollIntoView({behavior: 'smooth'});\n};\n/*alert('TODO animation');*/\n\n})();\">\u003C/a>\n\u003C!--\n\" onclick=\"\n\">\u003C/div>\n-->"}, {"title":"$:/Styles/Breadcrumbs","created":"20230126091040410","creator":"Octt","modified":"20230301212829674","modifier":"Octt","tags":"$:/tags/Stylesheet","text":"\\import [[$:/Macros/Styles]]\n\n\\define River() .tc-story-river\n\\define SRiver() .tc-static-story-river\n\\define Frame() .tc-tiddler-frame\n\\define Titler() .tc-tiddler-title\n\n\u003C\u003CRiver>> > \u003C\u003CFrame>> \u003C\u003CTitler>> .tc-title { \u003C\u003CNoDisp>> }\n\n.tc-story-river > .tc-tiddler-frame > .View-Breadcrumbs {\n opacity: 0.80;\n/*\n font-size: xx-large;\n margin-top: 0px;\n margin-bottom: -1.5em;\n position: sticky;\n z-index: 512;\n*/\n}\n.tc-story-river > .tc-tiddler-frame:not(.tc-tiddler-missing) > .View-Breadcrumbs > * {\n /*font-style: normal !important;*/\n opacity: 0.40;\n}\n.tc-story-river > .tc-tiddler-frame:not(.tc-tiddler-missing) > .View-Breadcrumbs:hover > * { opacity: 0.80; }\n.tc-story-river > .tc-tiddler-frame .View-Breadcrumbs > .Inline-Icon > * {\n width: 1em;\n height: 1em;\n vertical-align: top;\n}\n\n/*.View-Breadcrumbs { display: inline-flex; }*/\n\n/*.View-Breadcrumbs > .Inline-Sep:not(.View-Breadcrumbs > .Inline-Sep:last-of-type):before*/\n.View-Breadcrumbs > .Inline-Sep { padding-left: 0.3em; padding-right: 0.3em; }\n.View-Breadcrumbs > .Inline-Sep:after { content: '>'; font-size: smaller; }\n.View-Breadcrumbs > .Inline-Sep > span { font-size: 0px; }\n\n.View-Breadcrumbs > .Path-Elem[data-path-elem=\"$:\"] > a,\n.View-Breadcrumbs > .Path-Elem[data-path-elem=\"$:\"] + .Inline-Sep\n{ color: gray; padding-left: 0em; }\n\n.View-Breadcrumbs > .Path-Elem[data-path-elem=\"$:\"] + .Inline-Sep:after { content: ''; }\n.View-Breadcrumbs > .Path-Elem[data-path-elem=\"$:\"] + .Inline-Sep > span { font-size: revert; font-size: smaller; }\n\n.View-Breadcrumbs > .Path-Elem:last-of-type { cursor: pointer; }\n.View-Breadcrumbs details { display: inline; vertical-align: top; }\n\n.tc-static-story-river > .tc-tiddler-frame > .tc-tiddler-title details > summary,\n.View-Breadcrumbs details > summary {\n width: fit-content;\n list-style: none;\n cursor: pointer;\n}\n\ntc-table-of-contents\n\n.tc-static-story-river > .tc-tiddler-frame > .tc-tiddler-title details > .tc-tree,\n.tc-static-story-river > .tc-tiddler-frame > .tc-tiddler-title details > .tc-table-of-contents,\n.View-Breadcrumbs details > .tc-tree,\n.View-Breadcrumbs details > .tc-table-of-contents {\n font-size: initial; line-height: 1rem;\n}\n\n.tc-static-story-river > .tc-tiddler-frame > .tc-tiddler-title details > .tc-tree > span,\n.tc-static-story-river > .tc-tiddler-frame > .tc-tiddler-title details > .tc-table-of-contents > span,\n.View-Breadcrumbs details > .tc-tree > span, \n.View-Breadcrumbs details > .tc-table-of-contents > span {\n display: none;\n}\n\n.tc-static-story-river > .tc-tiddler-frame > .tc-tiddler-title .Path-Copy { display: none; }\n\n.View-Breadcrumbs > .Path-Copy {\n margin-left: 0.3em;\n margin-right: 0.3em;\n text-decoration: none;\n font-size: smaller;\n}\n"}, -{"title":"$:/Styles/Embed","created":"20230112154615238","creator":"Octt","modified":"20230813105657577","modifier":"Octt","tags":"$:/tags/Stylesheet","text":"\\define --HeadingColor0() #c061cb;\n\n.iFrameNormal, .iFrame100 {\n Margin: 0px;\n Padding: 0px;\n Background: #eeeeff/*#ddddff*/;\n Width: 100vw;\n}\n.iFrameNormal { Height: 90vh; }\n.iFrame100 { Height: 100vh; }\n\n.iFrameFitX { Width: 100%; }\n.iFrameFullY { Height: 96vh; }\n\n.MediaWikiEmbed, .MediaWikiEmbedBlock {\n Border-Left: 4px Solid \u003C\u003C--HeadingColor0>>;\n Padding-Left: 1em /*8px*/;\n}\n\n.MediaWikiEmbedCover { float: right; }\n.MediaWikiEmbedCover > * { max-height: 35vh /*50vh*/; }\n\n.EmbedFrom, .Embed-From,\n.MediaWikiEmbed-From, .MediaWikiEmbedFrom {\n Font-Size: Smaller;\n Font-Style: Italic;\n /* Don't make the link go over the \"fullscreen\" checkbox+label */\n max-width: calc(100% - 9em);\n}\n\n/* input.Checkbox-Btn:after { content: attr(label); } */\n\n.Embed-Fullscreen-Btn { float: right; font-style: revert; margin-top: -2em; }\ninput.Embed-Fullscreen-Btn { width: 2em; height: 2em; }\nlabel.Embed-Fullscreen-Btn {\n margin-right: 2.5em;\n width: initial;\n}\n\n/* TODO: Different top: positioning based on if mobile or desktop view is active, and if sidebar is open or closed (2em for mobile and sidebar closed, ~0.64em for the rest) */\ninput.Embed-Fullscreen-Btn:checked,\ninput.Embed-Fullscreen-Btn:checked ~ label,\ninput.Embed-Fullscreen-Btn:checked ~ iframe\n{ position: absolute; z-index: 99999; top: 2em/*0.64em*/; right: 0px; }\n\ninput.Embed-Fullscreen-Btn:checked ~ iframe {\n height: calc(100vh - 2em);\n left: 0px;\n right: unset;\n min-width: calc(100vw - 40px);\n}\n"}, +{"title":"$:/Styles/Embed","created":"20230112154615238","creator":"Octt","modified":"20240130140457967","modifier":"Octt","tags":"$:/tags/Stylesheet","text":"\\define --HeadingColor0() #c061cb;\n\n.iFrameNormal, .iFrame100 {\n Margin: 0px;\n Padding: 0px;\n Background: #eeeeff/*#ddddff*/;\n Width: 100vw;\n}\n.iFrameNormal { Height: 90vh; }\n.iFrame100 { Height: 100vh; }\n\n.iFrameFitX { Width: 100%; }\n.iFrameFullY { Height: 96vh; }\n\n.MediaWikiEmbed, .MediaWikiEmbedBlock {\n Border-Left: 4px Solid \u003C\u003C--HeadingColor0>>;\n Padding-Left: 1em /*8px*/;\n}\n\n.MediaWikiEmbedCover { float: right; }\n.MediaWikiEmbedCover > * { max-height: 35vh /*50vh*/; }\n\n.EmbedFrom, .Embed-From,\n.MediaWikiEmbed-From, .MediaWikiEmbedFrom {\n Font-Size: Smaller;\n Font-Style: Italic;\n /* Don't make the link go over the \"fullscreen\" checkbox+label */\n max-width: calc(100% - 9em);\n}\n\n/* input.Checkbox-Btn:after { content: attr(label); } */\n\n.Embed-Fullscreen-Btn { float: right; font-style: revert; margin-top: -2em; }\ninput.Embed-Fullscreen-Btn { width: 2em; height: 2em; }\nlabel.Embed-Fullscreen-Btn {\n margin-right: 2.5em;\n width: initial;\n}\n\n/* TODO: Different top: positioning based on if mobile or desktop view is active, and if sidebar is open or closed (2em for mobile and sidebar closed, ~0.64em for the rest) */\ninput.Embed-Fullscreen-Btn:checked,\ninput.Embed-Fullscreen-Btn:checked ~ label,\ninput.Embed-Fullscreen-Btn:checked ~ iframe\n{\n\tposition: absolute;/*fixed;*/\n\tz-index: 99999;\n\ttop: 2em/*0.64em*/;\n\tright: 0px;\n}\n\ninput.Embed-Fullscreen-Btn:checked ~ iframe {\n height: calc(100vh - 2em);\n left: 0px;\n right: unset;\n min-width: calc(100vw - 40px);\n}\n"}, {"title":"$:/Styles/Global.css","text":".NoDisplay { display: none; }\n\n.NoSelect {\n\t-webkit-touch-callout: none;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tUser-Select: none;\n}\n","created":"20230130151417995","creator":"Octt","modified":"20230130151526950","modifier":"Octt","tags":"$:/tags/Stylesheet","type":"text/css"}, {"title":"$:/Styles/LinkIcon","created":"20230219153505142","creator":"Octt","modified":"20230905223216334","modifier":"Octt","tags":"$:/tags/Stylesheet","text":"\u003C!-- Code originally from \u003Chttps://linkstyle.tiddlyspot.com/>, adapted by me to work just with icons -->\n\n\u003C!-- Notes: \n - Anchor classes are selected via strict HTML attributes to avoid things like custom buttons from being stylized where they shouldn't; we will then need another rule to look for an explicit class to stylize other elements\n - Currently this assumes that the icon field of a tiddler can only have an emoji, never an image URL\n-->\n\n\\define linkstyle()\n\u003C$set name=\"uri\" value=\u003C\u003Cmakedatauri \"\"\"$(tid)$\"\"\" \"text/plain\">> >\n\u003C$list variable=\"urititle\" filter=\"\"\"[\u003Curi>removeprefix[data:text/plain,]]\"\"\">\n\u003Cstyle>\na[href=\"#\u003C\u003Curititle>>\"][class='tc-tiddlylink tc-tiddlylink-resolves']:after,\n.tc-tag-list-item[data-tag-title=\"\u003C\u003Curititle>>\"] > .tc-tag-label:after {\n content: ' \u003C\u003Cicon>>';\n}\n\u003C/style>\n\u003C/$list>\n\u003C/$set>\n\\end\n\n\\define linkbody()\n\\whitespace trim\n\u003C$list filter=\"\"\"[has[linkstyle]] [has[linkstyle-before]] [has[linkstyle-after]] [has[icon]]\"\"\">\n\u003C$vars tid={{!!title}} icon={{!!icon}}>\n\u003C\u003Clinkstyle>>\n\u003C/$vars>\n\u003C/$list>\n\\end\n\n\u003C\u003Clinkbody>>\n"}, {"title":"$:/Styles/Lists","created":"20230307191735805","creator":"Octt","modified":"20230531085347943","modifier":"Octt","tags":"$:/tags/Stylesheet","text":".tc-tiddler-body ul:hover,\n.tc-tiddler-body ol:hover,\n.tc-tiddler-body dd:hover {\n Box-Shadow: 2px 2px 12px RGBA(128, 128, 128, 0.5);\n padding-top: 4px;\n padding-bottom: 4px;\n padding-right: 4px;\n}\nul, ol, dd { transition: 0.3s; }\n\n.tc-tiddler-body li { padding-top: 4px; }\n\n/* Definition lists */\ndd:before { content: '»'; margin-right: 8px; vertical-align: top; }\ndl { margin-left: 8px; }\ndl > dd { margin-left: 24px; }\ndl > dd > p,\ndl > dd > div,\ndl > dd > dt {\n display: inline-block;\n max-width: calc(100% - 1.5em);\n}\n/*\ndl > dd > div > ul,\ndl > dd > div > ol {\n padding-left: 16px;\n}*/\ndiv:not(.tc-tiddler-body) > dl > dt,\ndd > p,\ndd > div > p,\ndd > div > ul {\n margin-top: unset;\n margin-bottom: unset;\n}\n"}, -{"title":"$:/Styles/Main","created":"20230108190740128","creator":"Octt","modified":"20240129121756874","modifier":"Octt","tags":"$:/tags/Stylesheet","text":"\\define --HeadingColor0() #c061cb;\n\n\\define sidebarbreakpoint()\n\u003C$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n\u003C$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n\u003C$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n\u003C/$reveal>\n\u003C/$reveal>\n\\end\n\n/* --- */\n\nhtml, body {\n overflow-x: hidden;\n}\n\ndiv.commandpalette {\n\tmin-width: 75vw;\n\tmax-width: 100vw;\n}\n\n/* Override the font used for icon display by the the \u003C$:/plugins/Gk0Wk/notionpage-covericon> plugin, and then also apply it to the :after of .tc-tiddlylink anchors, for consistency.\nWe override adding a \"sans-serif\" to the start due to a spacing bug (?) */\n.gk0wk-notionpagebg-icon1,\n.gk0wk-notionpagebg-icon2,\na[class=\"tc-tiddlylink tc-tiddlylink-resolves\"]:after {\n font-family: sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", NotoColorEmoji, \"Noto Color Emoji\", \"Segoe UI Symbol\", \"Android Emoji\", EmojiSymbols;\n}\n\n/* Mobile */\n@media (max-width: \u003C\u003Csidebarbreakpoint>>) {\n .tc-sidebar-scrollable .tc-sidebar-header { padding-top: 0px; }\n}\n\n/* Desktop */\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\n .tc-sidebar-scrollable {\n padding-left: 0px;\n padding-right: 0px;\n }\n .tc-story-river {\n padding: {{$:/Config/OcttKB/Tweaks/Starlight/.tc-story-river Padding}};\n }\n .tc-tiddler-frame {\n padding: 20px /*24px 32px 24px 32px*/;\n margin-bottom: 20px;\n }\n\n\u003C\u003Cif-fluid-fixed text:\"\"\"\n .tc-story-river {\n margin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n }\n\"\"\" hiddenSidebarText:\"\"\"\n .tc-story-river {\n margin-right: 0px;\n padding-right: 24px;\n }\n\"\"\">>\n}\n\nDiv.View-Breadcrumbs\n{ margin: 4px; padding: 4px; }\n\n/* Inserting HTML content with tag $:/tags/AboveStory causes excess padding on top of the story river; Setting display none breaks that HTML, so we just tweak position */ \n.tc-page-container .tc-story-river > .story-backdrop { position: absolute; }\n\n/* Reduce top padding of sidebar */\n.tc-sidebar-scrollable { padding-top: 12px; }\n.tc-sidebar-scrollable .tc-sidebar-header .tc-reveal .tc-site-subtitle { padding-right: 4em; }\n\n.tc-story-river { padding-bottom: 0px; }\n.tc-story-river ~ p { display: none; }\n\n.tc-tiddler-frame,\n.tc-tiddler-body p iframe {\n Box-Shadow: 2px 2px 12px RGBA(128, 128, 128, 0.5);\n}\n\n.tc-tiddler-body p iframe { Border: None; }\n.tc-tiddler-frame { border-radius: 4px; }\n.tc-modal-body { max-height: 75vh /*60vh*/; }\n\n.tc-sidebar-scrollable .tc-sidebar-tabs-main .tc-more-sidebar .tc-tab-content { overflow: visible; }\n\n.tc-unfold-banner {\n width: calc(100% - 8px);\n margin-left: -16px;\n margin-top: -8px;\n}\n\n/* Large tag selection menu, optimized for desktop + nicer tag button */\n.tc-edit-tags .tc-edit-add-tag .tc-block-tags-dropdown {\n position: revert;\n white-space: revert;\n}\n.tc-edit-tags .tc-edit-add-tag .tc-block-tags-dropdown a {\n display: inline-block;\n border-radius: 1em;\n}\n\n.tc-sidebar-search .tc-search .tc-popup-handle[type=\"search\"]:focus {\n border: 2px dashed \u003C\u003C--HeadingColor0>>;\n}\n\n.AiLink { opacity: 0.40; }\n\n.DirList-Title, .DirList-Title * { Font-Style: Normal !Important; }\n.Separator-Right:last-of-type { Display: None; }\n\n.StartHere-Button {\n font-size: x-large /*smaller*/;\n text-decoration: none !important;\n user-select: none;\n}\n.StartHere-Button > img {\n width: 122px;\n image-rendering: pixelated;\n}\n.StartHere-Button > span {\n position: relative;\n top: -20px /*-10px*/;\n}\n\nImg.Img90, .Img90 Img {\n Max-Width: 90%;\n Max-Height: 90vh;\n}\n\n.tc-sidebar-scrollable .tc-sidebar-header .tc-page-controls .tc-popup .tc-drop-down { min-width: auto; }\n\n.tc-story-river > .tc-tiddler-frame .tc-subtitle { margin: 4px; padding: 4px; }\n\n/* Customized sidebar button */\n.tc-topbar.tc-topbar-right {\n bottom: 10px;\n right: 10px;\n top: unset;\n}\n.tc-topbar.tc-topbar-right > button {\n background: RGBA(0,0,0,0.64);\n border-radius: 4px;\n}\n.tc-topbar.tc-topbar-right > button > svg > g { fill: white; }\n\ndetails.tw-details > summary > * { display: inline; }\n\ninput[type=\"range\"] { min-width: 8em; }\n\ninput.Edit-Text-Full { width: 100% !important; }\n\n.tc-tiddler-body details:hover {\n Box-Shadow: 2px 2px 12px RGBA(128, 128, 128, 0.5);\n}\n.tc-tiddler-body details:hover > iframe {\n Box-Shadow: none;\n}\n\n.ibox-btn {\n max-width: 35%;\n max-height: 50vh;\n}\n.ibox-btn img {\n width: 100% !important;\n}\n\n.tc-modal {\n width: 80%;\n left: calc((100% - 80%) / 2);\n}\n\n.tb-inc > .tb-inc-controls.tc-tiddler-controls > button {\n\tfont-size: 150%;\n}\n"}, +{"title":"$:/Styles/Main","created":"20230108190740128","creator":"Octt","modified":"20240130144331870","modifier":"Octt","tags":"$:/tags/Stylesheet","text":"\\define --HeadingColor0() #c061cb;\n\n\\define sidebarbreakpoint()\n\u003C$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n\u003C$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n\u003C$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n\u003C/$reveal>\n\u003C/$reveal>\n\\end\n\n/* --- */\n\nhtml, body {\n overflow-x: hidden;\n}\n\ndiv.commandpalette {\n\tmin-width: 75vw;\n\tmax-width: 100vw;\n}\n\n/* Override the font used for icon display by the the \u003C$:/plugins/Gk0Wk/notionpage-covericon> plugin, and then also apply it to the :after of .tc-tiddlylink anchors, for consistency.\nWe override adding a \"sans-serif\" to the start due to a spacing bug (?) */\n.gk0wk-notionpagebg-icon1,\n.gk0wk-notionpagebg-icon2,\na[class=\"tc-tiddlylink tc-tiddlylink-resolves\"]:after {\n font-family: sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", NotoColorEmoji, \"Noto Color Emoji\", \"Segoe UI Symbol\", \"Android Emoji\", EmojiSymbols;\n}\n\n/* Mobile */\n@media (max-width: \u003C\u003Csidebarbreakpoint>>) {\n .tc-sidebar-scrollable .tc-sidebar-header { padding-top: 0px; }\n}\n\n/* Desktop */\n@media (min-width: \u003C\u003Csidebarbreakpoint>>) {\n .tc-sidebar-scrollable {\n padding-left: 0px;\n padding-right: 0px;\n }\n .tc-story-river {\n padding: {{$:/Config/OcttKB/Tweaks/Starlight/.tc-story-river Padding}};\n }\n .tc-tiddler-frame {\n padding: 20px /*24px 32px 24px 32px*/;\n margin-bottom: 20px;\n }\n\n\u003C\u003Cif-fluid-fixed text:\"\"\"\n .tc-story-river {\n margin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n }\n\"\"\" hiddenSidebarText:\"\"\"\n .tc-story-river {\n margin-right: 0px;\n padding-right: 24px;\n }\n\"\"\">>\n}\n\nDiv.View-Breadcrumbs\n{ margin: 4px; padding: 4px; }\n\n/* Inserting HTML content with tag $:/tags/AboveStory causes excess padding on top of the story river; Setting display none breaks that HTML, so we just tweak position */ \n.tc-page-container .tc-story-river > .story-backdrop { position: absolute; }\n\n/* Reduce top padding of sidebar */\n.tc-sidebar-scrollable { padding-top: 12px; }\n.tc-sidebar-scrollable .tc-sidebar-header .tc-reveal .tc-site-subtitle { padding-right: 4em; }\n\n.tc-story-river { padding-bottom: 0px; }\n.tc-story-river ~ p { display: none; }\n\n.tc-tiddler-frame,\n.tc-tiddler-body p iframe {\n Box-Shadow: 2px 2px 12px RGBA(128, 128, 128, 0.5);\n}\n\n.tc-tiddler-body p iframe { Border: None; }\n.tc-tiddler-frame { border-radius: 4px; }\n.tc-modal-body { max-height: 75vh /*60vh*/; }\n\n.tc-sidebar-scrollable .tc-sidebar-tabs-main .tc-more-sidebar .tc-tab-content { overflow: visible; }\n\n.tc-unfold-banner {\n width: calc(100% - 8px);\n margin-left: -16px;\n margin-top: -8px;\n}\n\n/* Large tag selection menu, optimized for desktop + nicer tag button */\n.tc-edit-tags .tc-edit-add-tag .tc-block-tags-dropdown {\n position: revert;\n white-space: revert;\n}\n.tc-edit-tags .tc-edit-add-tag .tc-block-tags-dropdown a {\n display: inline-block;\n border-radius: 1em;\n}\n\n.OcttKB-BorderFocus:focus,\n.tc-sidebar-search .tc-search .tc-popup-handle[type=\"search\"]:focus {\n border: 2px dashed \u003C\u003C--HeadingColor0>>;\n}\n\n.AiLink { opacity: 0.40; }\n\n.DirList-Title, .DirList-Title * { Font-Style: Normal !Important; }\n.Separator-Right:last-of-type { Display: None; }\n\n.StartHere-Button {\n font-size: x-large /*smaller*/;\n text-decoration: none !important;\n user-select: none;\n}\n.StartHere-Button > img {\n width: 122px;\n image-rendering: pixelated;\n}\n.StartHere-Button > span {\n position: relative;\n top: -20px /*-10px*/;\n}\n\nImg.Img90, .Img90 Img {\n Max-Width: 90%;\n Max-Height: 90vh;\n}\n\n.tc-sidebar-scrollable .tc-sidebar-header .tc-page-controls .tc-popup .tc-drop-down { min-width: auto; }\n\n.tc-story-river > .tc-tiddler-frame .tc-subtitle { margin: 4px; padding: 4px; }\n\n/* Customized sidebar button */\n.tc-topbar.tc-topbar-right {\n bottom: 10px;\n right: 10px;\n top: unset;\n}\n.tc-topbar.tc-topbar-right > button {\n background: RGBA(0,0,0,0.64);\n border-radius: 4px;\n}\n.tc-topbar.tc-topbar-right > button > svg > g { fill: white; }\n\ndetails.tw-details > summary > * { display: inline; }\n\ninput[type=\"range\"] { min-width: 8em; }\n\ninput.Edit-Text-Full { width: 100% !important; }\n\n.tc-tiddler-body details:hover {\n Box-Shadow: 2px 2px 12px RGBA(128, 128, 128, 0.5);\n}\n.tc-tiddler-body details:hover > iframe {\n Box-Shadow: none;\n}\n\n.ibox-btn {\n max-width: 35%;\n max-height: 50vh;\n}\n.ibox-btn img {\n width: 100% !important;\n}\n\n.tc-modal {\n width: 80%;\n left: calc((100% - 80%) / 2);\n}\n\n.tb-inc > .tb-inc-controls.tc-tiddler-controls > button {\n\tfont-size: 150%;\n}\n"}, {"title":"$:/Styles/onhover-toolbar-styles.css","text":".tc-tiddler-frame .tc-titlebar button {\nopacity: 0;\ntransition: opacity .5s ease-in-out;\n}\n.tc-tiddler-frame:hover .tc-titlebar button {\nzoom: 1;\nfilter: alpha(opacity=100);\nopacity: 1;\n}","created":"20150924065447163","creator":"Tobias Beer","modified":"20230110175248723","modifier":"Tobias Beer","revision":"0","tags":"","type":"text/css"}, {"title":"$:/Styles/PIP.css","text":"/* This has to be redone basically from scratch because there are issues with position:fixed without editing the tiddler frame z-index, which can't be done via CSS only (no parent selector) */\n\ninput.PIP-Select, input.PIP-Select+label, div.PIP-Select > input, div.PIP-Select > label, div.PIP-Select > span { width: 1.25em; height: 1.25em; font-size: 1.50em; vertical-align: middle; }\n\n/*\ninput[type=\"radio\"].PIP-Select[value=\"↗️\"]:checked ~ div { border: 3px solid red; }\ninput[type=\"radio\"].PIP-Select[value=\"↘️\"]:checked ~ div { border: 3px solid blue; }\n*/\n\n/* Set PIP properties common to all position */\n/*\ninput[type=\"radio\"].PIP-Select[value]:not(input[type=\"radio\"].PIP-Select[value=\"❎\"]):checked,\ninput[type=\"radio\"].PIP-Select[value]:not(input[type=\"radio\"].PIP-Select[value=\"❎\"]):checked ~ input,\ninput[type=\"radio\"].PIP-Select[value]:not(input[type=\"radio\"].PIP-Select[value=\"❎\"]):checked ~ label,\n*/\ninput[type=\"radio\"].PIP-Select[value]:not(input[type=\"radio\"].PIP-Select[value=\"❎\"]):checked ~ input[type=\"radio\"].PIP-Select[value=\"❎\"],\ninput[type=\"radio\"].PIP-Select[value]:not(input[type=\"radio\"].PIP-Select[value=\"❎\"]):checked ~ div {\n position: fixed;\n z-index: 99999;\n top: 0px;\n right: 0px;\n}\n\ninput[type=\"radio\"].PIP-Select[value]:not(input[type=\"radio\"].PIP-Select[value=\"❎\"]):checked ~ input[type=\"radio\"].PIP-Select[value=\"❎\"] { z-index: 100001; }\n\ninput[type=\"radio\"].PIP-Select[value]:not(input[type=\"radio\"].PIP-Select[value=\"❎\"]):checked ~ div {\n /*height: 100vh;*/\n width: 50vw;\n background: white;\n}\n","created":"20230202093634199","creator":"Octt","modified":"20230202194628022","modifier":"Octt","tags":"$:/tags/Stylesheet","type":"text/css"}, {"title":"$:/Styles/Ribbon.html","created":"20230108212828635","creator":"Octt","modified":"20230218112003133","modifier":"Octt","tags":"$:/tags/PageControls","type":"","text":"\u003C!-- TOP RIGHT RIBBON --->\n\u003Cdiv class=\"github-fork-ribbon-wrapper right\">\u003Cdiv class=\"github-fork-ribbon\">\u003Ca rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://hub.octt.eu.org\">Visit the Octt Hub 🌐\u003C/a>\u003C/div>\u003C/div>"}, @@ -1123,7 +1126,7 @@ {"title":"Android/Apps","created":"20230205151705787","creator":"Octt","modified":"20231221161159437","modifier":"Octt","tags":"","text":"List of some Android apps to keep in mind that are not mentioned in any other tiddler.\n\n* AccA\n* Activity Launcher\n* AdAway\n* AIDA64\n* Andronix\n* Antutu\n* B612\n* Color\n* Cryptomator\n* dotpict\n* Gadgetbridge\n* ibisPaint X\n* Linux Deploy \n* Material Files\n* Mi Remote\n* MiXplorer\n* Music Player F-Droid\n* NeoBackup\n* NewPipe\n* News Provider\n* OpenBoard\n* Open Camera\n* PCAPdroid\n* PocketMaps\n* Pydroid 3\n* QR & Barcode Scanner\n* Quill\n* Readrops\n* Rekado\n* SAI\n* ScreenStreamer\n* Seal\n* Sketchware Pro\n* StreetComplete\n* Squircle IDE\n* SuperFreezZ\n* Tiddloid\n* Tor Browser\n* Transdroid\n* Unexpected Keyboard\n* UserLAnd\n* WiGLE WiFi\n"}, {"title":"Android/Development","created":"20230217221957113","creator":"Octt","modified":"20240119145813252","modifier":"Octt","tags":"","text":"!!! ''Development''\n\n* \u003C\u003CRedditL r/androiddev/comments/18ysf26/why_is_the_android_documentation_so_poor/ \"Why is the android documentation so poor?\">>\n\n* [[ADB (Android Debug Bridge)|https://developer.android.com/tools/adb]]\n\n!!!! ''Apps'' and the likes\n\n; Lego block development: \n: [[Sketchware Pro|https://sketchware-pro.ga/]] - //Open-source mod of the proprietary and discontinued Sketchware app, for developing directly on Android// - [[[Git|https://github.com/Sketchware-Pro/]]]\n: [[MIT App Inventor|https://appinventor.mit.edu/]] - //Before Sketchware, we had this//\n\n; Minimalist development\n: [[How can I build an Android apk without Gradle on the command line?|https://stackoverflow.com/questions/41132753/how-can-i-build-an-android-apk-without-gradle-on-the-command-line]]\n: [[Tiny Android Template|https://github.com/jbendtsen/tiny-android-template]] - //Minimalist Android Project w/o Gradle//\n: \u003Cdiv>\n\n* [[How to do Android development faster without Gradle|https://authmane512.medium.com/how-to-do-android-development-faster-without-gradle-9046b8c1cf68]] - (Old, not recommended, use the above instead) [[[Git|https://github.com/authmane512/android-project-template]]]\n** Old version of this, has some useful insights: [[How to make Android apps without IDE from command line|https://authmane512.medium.com/how-to-build-an-apk-from-command-line-without-ide-7260e1e22676]]\n\u003C/div>\n\n; Classic development\n: \u003Cdiv>\n\n* [[Android Studio|https://developer.android.com/studio]] by Google - Also includes the Android Emulator and some other tools - Warning: IntelliSense is very broken (at least for me)\n** [[Why is Android Studio so buggy and Android development so frustrating?|https://libreddit.kavin.rocks/r/androiddev/comments/yocva7/why_is_android_studio_so_buggy_and_android/]]\n\u003C/div>\n\n; Classic development, directly on an Android:\n: With these apps it's also easy to compile for very old API targets, unlike Gradle or Android Studio where it's basically impossible today\n: [[Anacode IDE|http://www.anacodeide.com/home]] - [\u003C\u003CGPlayLink com.majosoft.anacode>>] - The app is freemium and apparently gives you 5-minute waits between build attempts after you build idk how many times (3? 5?)\n: AIDE //IDE for Android// - [\u003C\u003CGPlayLink com.aide.ui>>] - This app is freemium but honestly unusable without paying the montly/annual fee (for example, you can't save code you edit after a while); ''grab patch for [[Lucky Patcher]]'' [[here|https://patch.chelpus.com/custom-patch-for-aide-ide-for-android-java-c++/3.2.210316]] or [[here|https://patch.chelpus.com/custom-patch-for-aide-ide/3.2.210316]] (I don't understand why the app name is different)\n\n; Guides, Snippets, Problems\n: \u003Cdiv>\n\n* [[Add custom headers to WebView resource requests|https://stackoverflow.com/questions/7610790/add-custom-headers-to-webview-resource-requests-android]]\n* [[Using headers from a WebView.load(...) response|https://gist.github.com/kmerrell42/b4ff31733c562a3262ee9a42f5704a89]]\n* [[Intercept and override HTTP requests from WebView|https://stackoverflow.com/questions/4780899/intercept-and-override-http-requests-from-webview]]\n** [[Intercept all requests in WebView on Android|https://medium.com/@madmuc/intercept-all-network-traffic-in-webkit-on-android-9c56c9262c85]]\n** [[Intercepting and Blocking Requests|https://joshuatz.com/posts/2021/webview-intercepting-and-blocking-requests/]]\n* [[Android Webview - Completely Clear the Cache|https://stackoverflow.com/questions/2465432/android-webview-completely-clear-the-cache]] --- `webview.clearCache(true);` (note, this doesn't automatically reload the page)\n* [[How to implement @JavascriptInterface for android webview in Kotlin|https://stackoverflow.com/questions/62937014/how-to-implement-javascriptinterface-for-android-webview]]\n* [[Android Calling JavaScript functions in WebView|https://stackoverflow.com/questions/4325639/android-calling-javascript-functions-in-webview/31291128#31291128]] --- `webview.evaluateJavascript(\"obj()\", null)` on >= 4.4, otherwise `webview.loadUrl(\"javascript:obj()\")`\n\u003C/div>\n: [[Android Icon Size guide for Android 6 Marshmallow|https://www.creativefreedom.co.uk/icon-designers-blog/android-icon-size-guide/]]\n: [[How to rename an Android Studio Project|https://www.delasign.com/blog/android-studio-rename-project/]] --- //A step by step guide on renaming an Android Studio project. Open Source Kotlin Android project included.//\n: \u003Cdiv>\n\n* [[why setCanceledOnTouchOutside(false) doesn't work in Alert builder?|https://stackoverflow.com/questions/13526690/why-setcanceledontouchoutsidefalse-doesnt-work-in-alert-builder]]\n* [[How to prevent a dialog from closing when a button is clicked|https://stackoverflow.com/questions/2620444/how-to-prevent-a-dialog-from-closing-when-a-button-is-clicked]]\n* [[Best way to secure Android app sensitive Data?|https://stackoverflow.com/questions/8184492/best-way-to-secure-android-app-sensitive-data/8184699#8184699]]\n* [[New Android Project named after Main Activity instead of app name|https://stackoverflow.com/questions/12084299/new-android-project-named-after-main-activity-instead-of-app-name]] --- //In the manifest file, you are able to set one label for the launcher icon, and another for the activity. The app name is set in the intent filter, like this: `\u003Cactivity ... > \u003Cintent-filter android:label=\"@string/app_name\"> ...`//\n* [[Proper way to create and access BroadcastReceiver inside MainActivity? (Kotlin)|https://stackoverflow.com/questions/69565210/proper-way-to-create-and-access-broadcastreceiver-inside-mainactivity-kotlin/69600790#69600790]]\n* [[Android check SharedPreferences for value type|https://stackoverflow.com/questions/29615920/android-check-sharedpreferences-for-value-type]] --- contains a solution for directly getting any item regardless of type, via `sharedPrefs?.all`\n* [[Detecting & sending SMS on Android 📮|http://web.archive.org/web/20220120020100/https://joaquimley.com/blog/detect-send-sms-android]] \u003C\u003C[# \"On Medium\" \"https://medium.com/android-news/detecting-sending-sms-on-android-8a154562597f\">>\n\u003C/div>\n\n!!!! ''Hacking / Modding''\n\n* ''[[Apktool|https://ibotpeaches.github.io/Apktool/]]'' - //A tool for reverse engineering Android apk files// - [[[Git|https://github.com/iBotPeaches/Apktool]]]\n* ''APK Editor'' - //Edit APK Files inside your Android phone! Enjoy Hacking!// - [[[APKPure|https://m.apkpure.com/apk-editor-android/com.gmail.heagoo.apkeditor]]] [[[Uptodown|https://apk-editor.en.uptodown.com/android]]] - Can do about the same things as Apktool, but it's an Android app. It's apparently abandonware, and the pro version has more features. - [[[Pro (ApkBe)|https://en.apkbe.com/app/com.gmail.heagoo.apkeditor.pro]]]\n** The same developer offers other various apps that may be of related interest (also abandoned).\n* ''jadx'' - //Dex to Java decompiler// - [[[Git|https://github.com/skylot/jadx]]]\n\n; Problems, Snippets, Guides\n: [[Reverse Engineering and Analyzing Android Apps: A Step-by-Step Guide|https://medium.com/@asmaeziani47/reverse-engineering-and-analyzing-android-apps-a-step-by-step-guide-67b8af9bf152]]\n: [[Flashing Stock or Custom Firmware with Heimdall (on linux)|https://www.simernes.com/?p=279]]\n"}, {"title":"Android/Easter Eggs","created":"20230227223950556","creator":"Octt","modified":"20230227224447992","modifier":"Octt","tags":"","text":"!!! ''Android 7 (Nougat)''\n\n...\n\n!!! ''Android 11''\n\n; The Hidden\n: It's a re-proposal of Nougat's hidden cats egg\n"}, -{"title":"Animal Crossing","created":"20230110225425199","creator":"Octt","icon":"🍃","modified":"20231111000325649","modifier":"Octt","page-cover":"https://source.unsplash.com/random?Animal_Crossing","tags":"Nintendo $:/i18n:en Game Proprietary","text":"\u003C\u003C^wikipediaframe \"Animal Crossing\">>\n\n; What I like\n: The games' atmosphere is totally relaxing, with its cartoon style and time-based ambient music, you just stay in the chill.\n: There are year-based events, like festivities happening at specific times, or non-festive occourrences that sometimes happen (tournaments and the like).\n: The game is generally open-ended; you have set goals you can pursue but are in general free to do all the game's activities.\n: A kind of lore is present (but more in the older games). Very intriguing because it's kind of hidden and made from many different fragments.\n\n; What I don't like\n: Every new game has been more soulless than the previous, making the dialogues less engaging, more shallow and repetitive. \u003Cdd>\nThis is a shared sentiment: (TODO: link videos, forum threads, and other resources here)\n\u003C/dd> \u003Cdd>\nFor example, in New Horizons every animal villager is simply its personaliity stereotype, and doesn't really have an unique identity.\n\u003C/dd>\n: Since the games are closed-source, it would be almost impossible to mod one to fix the bad parts and unite the good parts from all games (in fact, no one has successfully done it yet, only minor mods and cheats exist).\n: [[Some festivities are exclusive|https://nookipedia.com/wiki/Event/New_Leaf]] to the release of the game in specific reason, and some releases only have some languages, and I know this is to make the game paletable and relatable to the general public, but it pisses me off. \u003Cdd>\nI can't for example really play Japan festivities because only the Japan ROM includes them, but that ROM only includes the Japanese language, which I don't understand.\n\u003C/dd>\n: The above used to apply to features too, for what concerns the GameCube game, but fan translation projects of the Japanese GameCube games exist today\n\n!!! ''Resources''\n\n* [[Decompilation of Animal Forest (zeldaret)|https://github.com/zeldaret/af]]\n* [[ac-decomp|https://github.com/Prakxo/ac-decomp]] --- //Decompilation in progress of Animal Crossing for the Nintendo GameCube//\n* [[marcrobledo acnl-editor|https://www.marcrobledo.com/acnl-editor/]] --- //An Animal Crossing: New Leaf savegame editor made in HTML5// --- \u003C\u003C#[ Git \"https://github.com/marcrobledo/acnl-editor\">>\n\n; Content\n\n: \u003Cdt> Animali Crostini 🍃 (Animal Crossing Moments)\n\u003C/dt> \u003Cdd> [[Telegram]]: [[@Animali_Crostini|https://t.me/Animali_Crostini]] - \u003C\u003C[ \"[[Backup|https://t.me/+nrhr1RXuNc4xMjJh]]\">> \n\u003C/dd> \u003Cdd> [[Matrix]]: \u003C\u003CMatrixLink \"#Animali_Crostini:matrix.org\" \"#Animali_Crostini:matrix.org\">> \n\u003C/dd>\n\n: [[JVGS|https://www.jvgs.net/]] (blogs, documentation, microblogs, YouTube)\n"}, +{"title":"Animal Crossing","created":"20230110225425199","creator":"Octt","icon":"🍃","modified":"20240130172729377","modifier":"Octt","page-cover":"https://source.unsplash.com/random?Animal_Crossing","tags":"Nintendo $:/i18n:en Game Proprietary","text":"\u003C\u003C^wikipediaframe \"Animal Crossing\">>\n\n; What I like\n: The games' atmosphere is totally relaxing, with its cartoon style and time-based ambient music, you just stay in the chill.\n: There are year-based events, like festivities happening at specific times, or non-festive occourrences that sometimes happen (tournaments and the like).\n: The game is generally open-ended; you have set goals you can pursue but are in general free to do all the game's activities.\n: A kind of lore is present (but more in the older games). Very intriguing because it's kind of hidden and made from many different fragments.\n\n; What I don't like\n: Every new game has been more soulless than the previous, making the dialogues less engaging, more shallow and repetitive. \u003Cdd>\nThis is a shared sentiment: (TODO: link videos, forum threads, and other resources here)\n\u003C/dd> \u003Cdd>\nFor example, in New Horizons every animal villager is simply its personaliity stereotype, and doesn't really have an unique identity.\n\u003C/dd>\n: Since the games are closed-source, it would be almost impossible to mod one to fix the bad parts and unite the good parts from all games (in fact, no one has successfully done it yet, only minor mods and cheats exist).\n: [[Some festivities are exclusive|https://nookipedia.com/wiki/Event/New_Leaf]] to the release of the game in specific reason, and some releases only have some languages, and I know this is to make the game paletable and relatable to the general public, but it pisses me off. \u003Cdd>\nI can't for example really play Japan festivities because only the Japan ROM includes them, but that ROM only includes the Japanese language, which I don't understand.\n\u003C/dd>\n: The above used to apply to features too, for what concerns the GameCube game, but fan translation projects of the Japanese GameCube games exist today\n\n!!! ''Resources''\n\n* [[Decompilation of Animal Forest (zeldaret)|https://github.com/zeldaret/af]]\n* [[ac-decomp|https://github.com/Prakxo/ac-decomp]] --- //Decompilation in progress of Animal Crossing for the Nintendo GameCube//\n\n* [[ACSE|https://github.com/Cuyler36/ACSE]] --- //save editor for Animal Crossing main series games// --- note that, for my experience, and from looking at the code, the \"Remove Resetti Bit\" option doesn't work for ACWW\n* [[marcrobledo acnl-editor|https://www.marcrobledo.com/acnl-editor/]] --- //An Animal Crossing: New Leaf savegame editor made in HTML5// --- \u003C\u003C#[ Git \"https://github.com/marcrobledo/acnl-editor\">>\n\n* [[[Action Replay] Impedire a Resetti di apparire|https://t.me/Animali_Crostini/156]] --- EUR/PAL: `221d139c 00000000`\n\n* [[Guida ACWW animalcrossingitalia|http://web.archive.org/web/20120905223120/http://www.bauce.it/ACWW/Benvenuto_files/Guida_ACWW.pdf]]\n\n; Content\n\n: \u003Cdt> Animali Crostini 🍃 (Animal Crossing Moments)\n\u003C/dt> \u003Cdd> [[Telegram]]: [[@Animali_Crostini|https://t.me/Animali_Crostini]] - \u003C\u003C[ \"[[Backup|https://t.me/+nrhr1RXuNc4xMjJh]]\">> \n\u003C/dd> \u003Cdd> [[Matrix]]: \u003C\u003CMatrixLink \"#Animali_Crostini:matrix.org\" \"#Animali_Crostini:matrix.org\">> \n\u003C/dd>\n\n: [[JVGS|https://www.jvgs.net/]] (blogs, documentation, microblogs, YouTube)\n"}, {"title":"Anti-Capitalist Software License:en","created":"20230128233320444","creator":"Octt","modified":"20230206111552063","modifier":"Octt","tags":"TODO Legal $:/i18n:en","text":"The ''Anti-Capitalist Software License'' (''ACSL'') is a license for proprietary software that, while with some good intentions, has a questionable implementation resulting in bad qualities. It's not open-source, and thus should be avoided for most projects. I don't think it could hold in a court of law.\n\n* Website: [[anticapitalist.software|https://anticapitalist.software]]\n\nI've seen a number higher than one of modified versions of this license in the wild:\n\n* Form promoting the anti-cryptocurrency narrative: https://github.com/Lana-chan/webgbcam/raw/main/LICENSE - It adds: \"//5. The User must not be involved in Non-Fungible Tokens or any other form of cryptocurrency minting or exchange.//\"\n"}, {"title":"Anti-Fascist MIT License:en","created":"20230128234619470","creator":"Octt","modified":"20230206111552066","modifier":"Octt","tags":"Legal $:/i18n:en","text":"The ''Anti-Fascist MIT License'' is a MIT license modified with additional text to prohibit use by fascists. I don't think fascists will respect it, one of their mottos is literally \"me ne frego\" (\"I don't care\"), nor do I think the license could actually hold in a court of law, but the intentions behind it are good.\n\n* Repo: [[github.com/jamiebuilds/anti-fascist-mit-license|https://github.com/jamiebuilds/anti-fascist-mit-license]]\n\nAfter further research, it appears that forks exist:\n\n* https://github.com/Laurelai/anti-fascist-mit-license\n"}, {"title":"App","created":"20230905205703716","creator":"Octt","modified":"20230905205754816","modifier":"Octt","text":"\u003C\u003C^wikipediaframe \"Application software\">>"}, @@ -1147,7 +1150,7 @@ {"title":"Bluetooth","created":"20230209164141017","creator":"Octt","modified":"20230209165918407","modifier":"Octt","tags":"Wireless","text":"\u003C\u003CMediaWiki Bluetooth en 2>>\n\n* Interesting: \u003C\u003CWikipediaLink- \"List of Bluetooth profiles\" en>>"}, {"title":"C Language","created":"20231029134919585","creator":"Octt","modified":"20231224151327804","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe C_Language>>\n\n* [[reassign struct in C|https://stackoverflow.com/questions/10298070/reassign-struct-in-c]] (meaning reassigning all fields at a time); the feature is part of compound literals, sadly only supported in C99+, won't work before that and it's not easy to guess why without knowing this\n* [[How to copy arrray to array using memcpy() in C|https://stackoverflow.com/a/15685912]] --- //you should allocate memory for tmp with size = sizeof(a). And then memcpy with size = sizeof(a)//\n* [[Reading command line parameters|https://stackoverflow.com/questions/5157337/reading-command-line-parameters]]\n\n* [[Why do many functions that return structures in C, actually return pointers to structures?|https://softwareengineering.stackexchange.com/questions/359408/why-do-many-functions-that-return-structures-in-c-actually-return-pointers-to-s]]\n* [[Passing by reference in C|https://stackoverflow.com/questions/2229498/passing-by-reference-in-c]] --- \"C does not support passing a variable by reference\"... //Passing a pointer ''is'' passing-by-reference. This seems to be one of those facts that \"savvy\" C programmers pride themselves on. Like they get a kick out of it. \"Oh you might THINK C has pass-by-reference but no it's actually just the value of a memory address being passed harharhar\". Passing by reference literally just means passing the memory address of where a variable is stored rather than the variable's value itself [...]//\n* [[Pointers in C: when to use the ampersand and the asterisk?|https://stackoverflow.com/questions/2094666/pointers-in-c-when-to-use-the-ampersand-and-the-asterisk#2094715]]\n** Related: [[error: invalid type argument of ‘unary *’ (have ‘int’)|https://stackoverflow.com/questions/5455866/error-invalid-type-argument-of-unary-have-int#5455962]], this happens when using `*` against a value instead of a pointer, since you can't dereference a value from a value.\n* [[What is a \"callback\" in C and how are they implemented?|https://stackoverflow.com/questions/142789/what-is-a-callback-in-c-and-how-are-they-implemented/142809#142809]] (function pointers)\n** [['declared as a function' in C|https://stackoverflow.com/questions/23329261/declared-as-a-function-in-c#23329274]] --- function pointers in structs must be declared with the syntax `type (functionName*)( type arg1, ... )`\n* [[Where should I prefer pass-by-reference or pass-by-value?|https://stackoverflow.com/questions/4986341/where-should-i-prefer-pass-by-reference-or-pass-by-value]] --- (performance-wise) //\"here's the simple rule: pass by reference when the value is large.\"//\n** [[When should I pass or return a struct by value?|https://stackoverflow.com/questions/30980759/when-should-i-pass-or-return-a-struct-by-value]]\n* [[Directly assigning values to C Pointers|https://stackoverflow.com/questions/17665793/directly-assigning-values-to-c-pointers]]\n\n* [[strcpy vs. memcpy|https://stackoverflow.com/questions/2898364/strcpy-vs-memcpy]] --- //strcpy stops when it encounters a NUL ('\\0') character, memcpy does not//, aka as the names suggest often strcpy is perfect for strings while for generic data memcpy could be needed.\n* [[ISO C90 forbids mixed declarations and code in C|https://stackoverflow.com/questions/13291353/iso-c90-forbids-mixed-declarations-and-code-in-c]] --- old C standards required that new variables can be declared only before any other actual instruction in a scoped block, e.g. only at the top of a function\n* [[\"Multiple definition\", \"first defined here\" errors|https://stackoverflow.com/questions/30821356/multiple-definition-first-defined-here-errors]] --- error that can arise in multiple cases\n\n* [[Creating empty function macros|https://stackoverflow.com/questions/9187628/empty-function-macros]] --- only safe way is `#define SomeFunction(arg) ((void)0)`\n** [[C macros, what's the meaning of ((void)0)?|https://stackoverflow.com/questions/61157541/c-macros-whats-the-meaning-of-void0]]\n* [[How to use \"else if\" with the preprocessor #ifdef?|https://stackoverflow.com/questions/68696585/how-to-use-else-if-with-the-preprocessor-ifdef]] --- the only widely-supported way is: `#if defined(X)`...`#elif defined(Y)`...`#else`...`#endif`\n** \"compound conditionals\" are supported, eg. `#if defined(X) || (defined(Y) && defined(Z))`...\n\n* [[How to enforce C89-style variable declarations in gcc?|https://stackoverflow.com/questions/3099813/how-to-enforce-c89-style-variable-declarations-in-gcc#3099874]] --- for some things of this goal, just the flags `-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wdeclaration-after-statement` are needed, I would guess.\n* [[Good C-coding style for multiple lines if conditions|https://stackoverflow.com/questions/29328923/good-c-coding-style-for-multiple-lines-if-conditions]]\n\n* [[How to get the current directory in a C program?|https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program]] --- (`getcwd(...)`)\n* [[C Program to list all files and sub-directories in a directory|https://www.geeksforgeeks.org/c-program-list-files-sub-directories-directory/]]\n* [[How to read the content of a file to a string in C?|https://stackoverflow.com/a/174552]]\n"}, {"title":"C++","created":"20231115233135878","creator":"Octt","modified":"20231223210119928","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe C++>>\n\n* [[ISO C++ Standard Foundation|https://isocpp.org/]]\n* [[mixing c and cpp|https://isocpp.org/wiki/faq/mixing-c-and-cpp]]\n** [[What is the effect of extern \"C\" in C++?|https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c]], and how to use it in practice to effectively mix C and C++\n* [[mingw - compiling g++ programs for windows 98?|https://stackoverflow.com/questions/25596221/g-programs-for-windows-98#50849554]]\n"}, -{"title":"Calculator","created":"20230215213812453","creator":"Octt","modified":"20230217143401588","modifier":"Octt","text":"\u003C\u003C^WikipediaFrame Calculator en>>\n\n!!! ''Resources''\n\n; Some Calculators\n: \u003C\u003CYoutubeL Ong91Ji3iDk \"EEVblog #1159 - World's Most Precise Pocket Calculator\">>\n\n; Curiosities\n: \u003C\u003CYoutubeL waqDoeQ0Ijw \"Calculator Number Trick: rectangle patterns [Stand-up Maths]\">>\n: \u003C\u003CYoutubeL ihK6MKbHvSc \"How does a calculator work? The magic of the 8-digit four function calculator\">>\n: (Casio) \u003C\u003CYoutubeL 7LKy3lrkTRA \"Why do calculators get this wrong? (We don't know!) [Stand-up Maths]\">>\n: \u003C\u003CYoutubeL dTLhXHyzfEM \"Whats Inside Black Stuff in Calculator Circuit board IC\">>\n\n; DIY, Hacks, Reuses\n: \u003Cdiv>\n\n* \u003C\u003CYoutubeL dJoKl0LK5jM \"HHC 2019: DIY Calculators\">>\n* \u003C\u003CYoutubeL lJu1ij_Emlk \"Ben Heck’s DIY Raspberry Pi Calculator\">>\n* \u003C\u003CYoutubeL HeJPX-fPN6Y \"DIY graphics calculator galdeano02 hardware\">> - //A DIY calculator, programed in micropython, a custom version with lvgl widgets and Eigenmath, a CAS engine//\n* \u003C\u003CYoutubeL m1aFRhqvuLM \"IVEE - a Powerful Programable RPN Calculator based on FORTH and Arduino\">>\n\u003C/div>\n\n: \u003Cdiv>\n\n* \u003C\u003CYoutubeL QlpZyf7hKg8 \"Coil winding counter from old calculator - home made DIY מונה ליפוף סלילים\">>\n** \u003C\u003CYoutubeL TWPS0lI33Mc \"How to make a calculator coil winding counter with a retractable USB cable\">>\n\u003C/div>\n: \u003C\u003CYoutubeL U8DnuSo8SV4 \"EEVblog #962 - Hacking A Calculator Into A Counter\">>\n: \u003C\u003CYoutubeL T9alyB4fznw \"Hacking a pocket calculator as LCD for the Arduino\">>\n: \u003C\u003CYoutubeL EzkUPGPEVp8 \"Turning my High School Calculator into a Mechanical Keyboard. 1 Year Review. [TheLastMillennial]\">>\n\n; Memes\n: [[Fuck man, the Mulino Bianco calculator can make Square Root|https://web.archive.org/web/20230217134036id_/https://i.imgur.com/sM5KmoK.png]]\n: \u003C\u003CYoutubeL \"PLt5AfwLFPxWKAINNfxIdYmFVKuk_F_cQq\" \"Calculator Unboxings on Numberphile\" \"playlist?list=\">>\n: \u003C\u003CYoutubeL Mp_8OqCbFt4 \"POWER OF GAMING CALCULATOR😱⚡\">>\n: \u003C\u003CYoutubeL AAw1JjN-7u0 \"When You Are Game Addicted - Casio Calculator Play Racing Game Asphalt\">>\n"}, +{"title":"Calculator","created":"20230215213812453","creator":"Octt","modified":"20240130121513294","modifier":"Octt","page-cover":"https://source.unsplash.com/random?calculator","text":"\u003C\u003C^WikipediaFrame Calculator en>>\n\n!!! ''Resources''\n\n; Some Calculators\n: \u003C\u003CYoutubeL Ong91Ji3iDk \"EEVblog #1159 - World's Most Precise Pocket Calculator\">>\n\n; Curiosities\n: \u003C\u003CYoutubeL waqDoeQ0Ijw \"Calculator Number Trick: rectangle patterns [Stand-up Maths]\">>\n: \u003C\u003CYoutubeL ihK6MKbHvSc \"How does a calculator work? The magic of the 8-digit four function calculator\">>\n: (Casio) \u003C\u003CYoutubeL 7LKy3lrkTRA \"Why do calculators get this wrong? (We don't know!) [Stand-up Maths]\">>\n: \u003C\u003CYoutubeL dTLhXHyzfEM \"Whats Inside Black Stuff in Calculator Circuit board IC\">>\n\n; DIY, Hacks, Reuses\n: \u003Cdiv>\n\n* \u003C\u003CYoutubeL dJoKl0LK5jM \"HHC 2019: DIY Calculators\">>\n* \u003C\u003CYoutubeL lJu1ij_Emlk \"Ben Heck’s DIY Raspberry Pi Calculator\">>\n* \u003C\u003CYoutubeL HeJPX-fPN6Y \"DIY graphics calculator galdeano02 hardware\">> - //A DIY calculator, programed in micropython, a custom version with lvgl widgets and Eigenmath, a CAS engine//\n* \u003C\u003CYoutubeL m1aFRhqvuLM \"IVEE - a Powerful Programable RPN Calculator based on FORTH and Arduino\">>\n\u003C/div>\n\n: \u003Cdiv>\n\n* \u003C\u003CYoutubeL QlpZyf7hKg8 \"Coil winding counter from old calculator - home made DIY מונה ליפוף סלילים\">>\n** \u003C\u003CYoutubeL TWPS0lI33Mc \"How to make a calculator coil winding counter with a retractable USB cable\">>\n\u003C/div>\n: \u003C\u003CYoutubeL U8DnuSo8SV4 \"EEVblog #962 - Hacking A Calculator Into A Counter\">>\n: \u003C\u003CYoutubeL T9alyB4fznw \"Hacking a pocket calculator as LCD for the Arduino\">>\n: \u003C\u003CYoutubeL EzkUPGPEVp8 \"Turning my High School Calculator into a Mechanical Keyboard. 1 Year Review. [TheLastMillennial]\">>\n\n; Memes\n: [[Fuck man, the Mulino Bianco calculator can make Square Root|https://web.archive.org/web/20230217134036id_/https://i.imgur.com/sM5KmoK.png]]\n: \u003C\u003CYoutubeL \"PLt5AfwLFPxWKAINNfxIdYmFVKuk_F_cQq\" \"Calculator Unboxings on Numberphile\" \"playlist?list=\">>\n: \u003C\u003CYoutubeL Mp_8OqCbFt4 \"POWER OF GAMING CALCULATOR😱⚡\">>\n: \u003C\u003CYoutubeL AAw1JjN-7u0 \"When You Are Game Addicted - Casio Calculator Play Racing Game Asphalt\">>\n"}, {"title":"Candle","created":"20230225111237015","creator":"Octt","icon":"🕯️","modified":"20230225111724354","modifier":"Octt","page-cover":"https://source.unsplash.com/random/?Candle","tags":"","text":"\u003C\u003C^wikipediaframe Candle en>>"}, {"title":"Cartography","created":"20231111233128372","creator":"Octt","modified":"20240119164516295","modifier":"Octt","tags":"Geography","text":"\u003C\u003C^wikipediaframe Cartography>>\n\n* \u003C\u003Clinkdescgit OpenStreetMap\"https://www.openstreetmap.org/\" \"largest community-created geospatial project of all time\" \"https://github.com/openstreetmap\">>\n** \u003C\u003Clinkdescgit OsmAnd\"https://osmand.net/\" \"Offline Maps and Navigation\" \"https://github.com/osmandapp\">>, primarily for Android but a webapp is WIP\n** [[Organic Maps|https://organicmaps.app/]] --- //Organic Maps is a free Android & iOS offline maps app for travelers, tourists, hikers, and cyclists. It uses crowd-sourced OpenStreetMap data.// --- \u003C\u003C[# Git\"https://github.com/organicmaps/organicmaps\">>\n* \u003C\u003Clinkdescgit Leaflet\"https://leafletjs.com/\" \"🍃 JavaScript library for mobile-friendly interactive maps\" \"https://github.com/Leaflet\">>\n"}, {"title":"CASIO","created":"20230205150537106","creator":"Octt","modified":"20230205150543738","modifier":"Octt","tags":"TODO"}, @@ -1166,7 +1169,7 @@ {"title":"Copyright","created":"20231022234706178","creator":"Octt","modified":"20231022234838813","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Copyright>>\n\n* [[Um, is it normal for someone to casually admit to pirating stuff?|https://www.resetera.com/threads/um-is-it-normal-for-someone-to-casually-admit-to-pirating-stuff.156559/]] --- This thread made me laugh, \"did you admit to a crime\" LMAO\n"}, {"title":"Creative Commons/BY-SA 4.0:en","created":"20220925131851817","modified":"20230206111552087","modifier":"Octt","tags":"TODO $:/i18n:en","text":"!! Creative Commons\n\n!!! ''Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)''\n\nThis is a human-readable summary of (and not a substitute for) the [[license|https://creativecommons.org/licenses/by-sa/4.0/legalcode]].\n\n\u003Cdetails>\n\u003Csummary>Disclaimer\u003C/summary>\n\u003Cp>This deed highlights only some of the key features and terms of the actual license. It is not a license and has no legal value. You should carefully review all of the terms and conditions of the actual license before using the licensed material.\u003C/p>\n\n\u003Cp>Creative Commons is not a law firm and does not provide legal services. Distributing, displaying, or linking to this deed or the license that it summarizes does not create a lawyer-client or any other relationship.\u003C/p>\n\u003C/details>\n\n[img[$:/ThirdParty/Buttons/CC BY-SA.svg]]\n\n!!!'' You are free to:''\n\n''Share'' — copy and redistribute the material in any medium or format\n\n''Adapt'' — remix, transform, and build upon the material\nfor any purpose, even commercially.\n\nThe licensor cannot revoke these freedoms as long as you follow the license terms.\n\n!!! ''Under the following terms:''\n\n''Attribution'' — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.\n\n''ShareAlike'' — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.\n\n''No additional restrictions'' — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.\n\n!!! ''Notices:''\nYou do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.\n\nNo warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material."}, {"title":"Cryptocurrency","created":"20230218181942782","creator":"Octt","modified":"20240127233538211","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Cryptocurrency>>\n\n* Cryptocurrencies are usually decentralized; in such cases, they are based on a [[Blockchain]].\n\n!! Some cryptocurrencies (+ tokens)\n\n!!! ''[[Bitcoin|https://bitcoin.org/]]'' (BTC)\n\n* https://github.com/bitcoin\n\n; Self-custocial Wallets\n: [[Mycelium|https://wallet.mycelium.com/]] (Android) - \u003C\u003C[ \"[[Git|https://github.com/mycelium-com]]\">>\n\n\n!!! [[Dash|https://www.dash.org/]]\n\n//Dash is an experimental digital currency that enables instant, private payments to anyone, anywhere in the world.//\n\nIt's a fork of Bitcoin. There are some advantages, some technical and some situational, but a strange disadvantage I have seen appears to be that wallet syncs take a lot of time.\n\n* https://github.com/dashpay\n\n!!! [[Duino-Coin|https://github.com/revoxhere/duino-coin]]\n\n//Simple, eco-friendly, centralized coin that can be mined with microcontrollers.//\n\n* https://github.com/revoxhere/duino-coin\n\n!!! ''[[Ethereum|https://ethereum.org/]]'' (ETH)\n\n* https://github.com/ethereum\n\n; Self-custodial Wallets\n: [[AlphaWallet|https://alphawallet.com/]] (Android) - \u003C\u003C[ \"[[Git|https://github.com/AlphaWallet]]\">>\n: [[Metamask|https://metamask.io/]] (Web Extension, Android) - \u003C\u003C[ \"[[Git|https://github.com/MetaMask]]\">>\n\n\n!!! ''[[Monero|https://www.getmonero.org/]]'' (XMR)\n\n* https://github.com/monero-project\n\n; Self-custodial Wallets\n: [[MyMonero|https://mymonero.com/]] (Web, Android, PC) - \u003C\u003C[ \" [[Git|https://github.com/mymonero]]\">>\n"}, -{"title":"CSS","created":"20230209150101862","creator":"Octt","icon":"💅","modified":"20240130004423944","modifier":"Octt","page-cover":"https://images.unsplash.com/photo-1523437113738-bbd3cc89fb19","tags":"Web Frontend","text":"\u003C\u003C^wikipediaframe CSS en>>\n\n!!! ''References''\n\n* [[CSS Attribute Selectors|https://www.w3schools.com/css/css_attribute_selectors.asp]]\n* [[CSS Borders [w3s]|https://www.w3schools.com/css/css_border.asp]]\n** \u003C\u003CMDNLink Web/CSS/border-style border-style>> --- all ways to style a border, not only colors\n\n!!! ''Tips''\n\n* [[How to disable a link using only CSS|https://stackoverflow.com/questions/2091168/how-to-disable-a-link-using-only-css]] --- essentially, `pointer-events: none;` for the functional side, + other rules for styling\n\n!!! ''Frameworks''\n\n* [[Bulma|https://bulma.io/]] --- //modern CSS framework that just works//\n* [[PaperCSS|https://www.getpapercss.com/]] --- //the less formal CSS framework//\n* [[W3.CSS|https://www.w3schools.com/w3css/default.asp]] --- //A Quality Alternative to Bootstrap, is Smaller, Faster and Easier to Use.//\n\n!!! ''Amazing''\n\n* [[CSS Zen Garden|https://csszengarden.com/]] --- //The Beauty of CSS Design//\n* [[Pure CSS Minesweeper|https://codepen.io/bali_balo/pen/BLJONZ?editors=1100]]\n* [[Spinning Diagrams with CSS|https://x.st/spinning-diagrams-with-css]]\n* [[Bubble Sort...in PURE CSS? [No JS] 😱|https://dev.to/grahamthedev/bubble-sortin-pure-css-no-js-3bb1]]\n* [[25 CSS Paper Effects|https://freefrontend.com/css-paper-effects/]]\n* [[Reusable CSS \"Sticker\" Effect|https://dev.to/5t3ph/reusable-css-sticker-effect-44lc]]\n"}, +{"title":"CSS","created":"20230209150101862","creator":"Octt","icon":"💅","modified":"20240130154503348","modifier":"Octt","page-cover":"https://images.unsplash.com/photo-1523437113738-bbd3cc89fb19","tags":"Web Frontend","text":"\u003C\u003C^wikipediaframe CSS en>>\n\n* [[Temani Afif|https://dev.to/afif]] --- //Your favorite CSS Hacker// --- \u003C\u003C[# \"GitHub Profile\" \"https://github.com/Afif13\">>\n** [[CSS Tip|https://css-tip.com/]] --- // A micro blog to share CSS Tips & Tricks// --- \u003C\u003C[# Git \"https://github.com/Afif13/CSS-Tip\">>\n\n!!! ''References''\n\n* [[CSS Attribute Selectors|https://www.w3schools.com/css/css_attribute_selectors.asp]]\n* [[CSS Borders [w3s]|https://www.w3schools.com/css/css_border.asp]]\n** \u003C\u003CMDNLink Web/CSS/border-style border-style>> --- all ways to style a border, not only colors\n\n!!! ''Tips''\n\n* [[How to disable a link using only CSS|https://stackoverflow.com/questions/2091168/how-to-disable-a-link-using-only-css]] --- essentially, `pointer-events: none;` for the functional side, + other rules for styling\n\n!!! ''Frameworks''\n\n* [[Bulma|https://bulma.io/]] --- //modern CSS framework that just works//\n* [[PaperCSS|https://www.getpapercss.com/]] --- //the less formal CSS framework//\n* [[W3.CSS|https://www.w3schools.com/w3css/default.asp]] --- //A Quality Alternative to Bootstrap, is Smaller, Faster and Easier to Use.//\n\n!!! ''Amazing''\n\n* [[CSS Zen Garden|https://csszengarden.com/]] --- //The Beauty of CSS Design//\n* [[25 CSS Paper Effects|https://freefrontend.com/css-paper-effects/]]\n* [[Reusable CSS \"Sticker\" Effect|https://dev.to/5t3ph/reusable-css-sticker-effect-44lc]]\n* [[26 Impressive web projects built with CSS only.|https://medium.mybridge.co/26-impressive-web-projects-built-with-css-only-4a4c2f773a21?gi=c96d73b5b5d2]]\n\n* [[Pure CSS Minesweeper|https://codepen.io/bali_balo/pen/BLJONZ?editors=1100]]\n* [[Spinning Diagrams with CSS|https://x.st/spinning-diagrams-with-css]]\n* [[Bubble Sort...in PURE CSS? [No JS] 😱|https://dev.to/grahamthedev/bubble-sortin-pure-css-no-js-3bb1]]\n* [[CSS-only Calendar App Concept|https://codepen.io/davidkpiano/pen/wBGjMr]]\n"}, {"title":"CTGP Nitro","created":"20230205150034992","creator":"Octt","modified":"20230213165348163","modifier":"Octt","tags":"Mod [[Mario Kart DS]]","text":"//Rediscover Mario Kart DS once again!//\n\n//''[[CTGP Nitro|https://dswiki.garhoogin.com/ctgp-n/]]'' is the biggest, most ambitious Mario Kart DS Rom Hack to date. Instead of replacing the existing tracks, it preserves the whole vanilla experience and adds new tracks, speedrunning quality of life improvements, online mode adjustments, new skins for characters and much more!//\n"}, {"title":"CUPS","created":"20230825221340887","creator":"Octt","modified":"20230902000445288","modifier":"Octt","tags":"Unix Printing","type":"","text":"\u003C\u003C^wikipediaframe CUPS>>\n\n* [[CUPS: Command-Line Printing and Options|http://www.it.uu.se/datordrift/maskinpark/skrivare/cups/]] including Linux-specific ones.\n* [[CUPS-PDF, Print to PDF from any Application|https://cubiclenate.com/2021/01/21/cups-pdf-print-to-pdf-from-any-application/]] --- Must probably be installed separately via `cups-pdf` package --- Outputs are by default in `~/PDF/`\n\n* [[How do you administer CUPS remotely using the web interface?|https://askubuntu.com/questions/23936/how-do-you-administer-cups-remotely-using-the-web-interface]] --- `cupsctl --remote-admin --remote-any ` (and optionally `--share-printers`), then restart `cups` service, and visit `http://{IpAddress}:631`. Redo commands but with `no-` suffix to flags to disable the feature.\n"}, {"title":"CyanogenMod:en","created":"20230202230421306","creator":"Octt","modified":"20230206111552091","modifier":"Octt","tags":"Android $:/i18n:en","text":"\u003C\u003CMediaWiki CyanogenMod en 4>>"}, @@ -1179,7 +1182,7 @@ {"title":"Data recovery","created":"20231106235418371","creator":"Octt","modified":"20231106235541279","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Data recovery\">>\n\n* [[CGSecurity Wiki|https://www.cgsecurity.org/wiki/Main_Page]] --- home of the TestDisk and PhotoRec programs, plus some other tools and documentation\n"}, {"title":"Data serialization","created":"20231223143928533","creator":"Octt","modified":"20231223144025192","modifier":"Octt","tags":"","text":"\u003C\u003C^WikipediaFrame \"Data serialization\">>\n\n* [[JSON is valid YAML|https://til.codeinthehole.com/posts/json-is-valid-yaml/]]\n\n!! YAML\n\n\u003C\u003C^WikipediaFrame \"YAML\">>\n\n* [[YAML Lint Online|https://www.yamllint.com/]]\n* [[YAML to JSON Converter Online|https://yml2json.com/]]\n\n!! INI\n\n\u003C\u003C^WikipediaFrame \"INI file\">>\n\n!!! TOML\n\n\u003C\u003C^WikipediaFrame \"TOML\">>\n"}, {"title":"Data storage","created":"20231104231609952","creator":"Octt","modified":"20231220183517988","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Data storage\">>\n\n* \u003C\u003Clinkdescgit \"f3 - Fight Flash Fraud\" \"https://fight-flash-fraud.readthedocs.io/en/stable/\" \"simple tool that tests flash cards capacity and performance to see if they live up to claimed specifications\" \"https://github.com/AltraMayor/f3\">>\n* [[Storj|https://storj.io]] --- //Decentralized cloud object storage that is affordable, easy to use, private, and secure.// --- \u003C\u003C[# Git\"https://github.com/storj\">>\n"}, -{"title":"Database","created":"20231223234312578","creator":"Octt","modified":"20240119162211752","modifier":"Octt","text":"\u003C\u003C^wikipediaframe Database>>\n\n!! SQL (Structured Query Language)\n\n\u003C\u003C^wikipediaframe SQL>>\n\n* [[SQL Tutorial - Essential SQL For The Beginners|https://www.sqltutorial.org/]], //helps you get started with SQL quickly and effectively through many practical examples.//\n\n* [[SQL Server reverse order after using desc|https://stackoverflow.com/questions/12534248/sql-server-reverse-order-after-using-desc]] --- just use a subselect subquery, `SELECT * FROM (... ORDER BY x DESC) _ ORDER BY x ASC`\n* [[How to count instances of character in SQL Column|https://stackoverflow.com/questions/1860457/how-to-count-instances-of-character-in-sql-column#1860478]] --- `SELECT LEN(col) - LEN(REPLACE(col, 'x', ''))`\n** [[SQL String: Counting Words inside a String|https://stackoverflow.com/questions/41952250/sql-string-counting-words-inside-a-string]] --- various methods more specially catered for counting words, than the naive space counting\n** Note: for counting in many rows together, the `SUM()` function must be used, [[or else you will go mad like me|https://chat.openai.com/share/5883b4c6-37cf-40e3-b735-9cd52b26020c]]\n\n!!! MySQL \\ MariaDB\n\n\u003C\u003C^wikipediaframe MySQL>>\n\u003C\u003C^wikipediaframe MariaDB>>\n\n* [[How to install MySQL (MariaDB) on Android with Termux|https://parzibyte.me/blog/en/2019/04/16/install-mysql-mariadb-android-termux/]]\n* [[--skip-grant-tables option cannot execute statement|https://stackoverflow.com/questions/54751024/skip-grant-tables-option-cannot-execute-statement]] --- in `mysql>` execute `flush privileges`\n\n* [[MySQL LENGTH() Function|https://www.w3schools.com/sql/func_mysql_length.asp]] (not LEN on MySQL!)\n"}, +{"title":"Database","created":"20231223234312578","creator":"Octt","modified":"20240130143749965","modifier":"Octt","page-cover":"https://source.unsplash.com/random?database","text":"\u003C\u003C^wikipediaframe Database>>\n\n!! SQL (Structured Query Language)\n\n\u003C\u003C^wikipediaframe SQL>>\n\n* [[SQL Tutorial - Essential SQL For The Beginners|https://www.sqltutorial.org/]], //helps you get started with SQL quickly and effectively through many practical examples.//\n\n* [[SQL Server reverse order after using desc|https://stackoverflow.com/questions/12534248/sql-server-reverse-order-after-using-desc]] --- just use a subselect subquery, `SELECT * FROM (... ORDER BY x DESC) _ ORDER BY x ASC`\n* [[How to count instances of character in SQL Column|https://stackoverflow.com/questions/1860457/how-to-count-instances-of-character-in-sql-column#1860478]] --- `SELECT LEN(col) - LEN(REPLACE(col, 'x', ''))`\n** [[SQL String: Counting Words inside a String|https://stackoverflow.com/questions/41952250/sql-string-counting-words-inside-a-string]] --- various methods more specially catered for counting words, than the naive space counting\n** Note: for counting in many rows together, the `SUM()` function must be used, [[or else you will go mad like me|https://chat.openai.com/share/5883b4c6-37cf-40e3-b735-9cd52b26020c]]\n\n!!! MySQL \\ MariaDB\n\n\u003C\u003C^wikipediaframe MySQL>>\n\u003C\u003C^wikipediaframe MariaDB>>\n\n* [[How to install MySQL (MariaDB) on Android with Termux|https://parzibyte.me/blog/en/2019/04/16/install-mysql-mariadb-android-termux/]]\n* [[--skip-grant-tables option cannot execute statement|https://stackoverflow.com/questions/54751024/skip-grant-tables-option-cannot-execute-statement]] --- in `mysql>` execute `flush privileges`\n\n* [[MySQL LENGTH() Function|https://www.w3schools.com/sql/func_mysql_length.asp]] (not LEN on MySQL!)\n\n!!! SQLite\n\n\u003C\u003C^wikipediaframe SQLite>>\n\n* [[Copying data from one SQLite database to another|https://stackoverflow.com/questions/2359205/copying-data-from-one-sqlite-database-to-another/40353567#40353567]] --- best way is probably `sqlite3 old.sqlite \".dump { names of tables }\" | sqlite3 new.sqlite`\n"}, {"title":"Demoscene","created":"20230425095136540","creator":"Octt","modified":"20231107212630799","modifier":"Octt","text":"\u003C\u003C^wikipediaframe Demoscene>>\n\n* \u003C\u003ChttpsL www.untergrund.net>> --- //free hosting service for demoscene related projects//\n\n\u003C\u003C{ \"Tech Art\">>\n"}, {"title":"Development","created":"20230613185754543","creator":"Octt","modified":"20231227013022723","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Software development\">>\n\n!!! Tools\n\n* [[AST explorer|https://astexplorer.net/]] --- //A web tool to explore the ASTs generated by various parsers.// --- \u003C\u003C[# Git\"https://github.com/fkling/astexplorer\">>\n** [[metajs|http://www.jezng.com/metajs/]] --- //visualize javascript AST execution// --- \u003C\u003C[# Git\"https://github.com/int3/metajs\">>\n* [[NamsoGen|https://namso-gen.com]] --- //Your Testing Toolkit//\n\n!!! Resources\n\n* \u003C\u003CWikipediaL \"Dependency hell\">>\n\n* \u003C\u003CRedditL r/webdev/comments/spr2db/confused_about_web_app_architecture_and/ \"Confused about web app architecture and separation of frontend and backend\">>\n* [[What package naming convention do you use for personal/hobby projects|https://stackoverflow.com/questions/292169/what-package-naming-convention-do-you-use-for-personal-hobby-projects-in-java]] in Java/Android/Flatpak?\n* [[Should images be stored in a git repository?|https://softwareengineering.stackexchange.com/questions/80962/should-images-be-stored-in-a-git-repository]] [or any SCM]\n\n* [[Why would a game developer write their own engine instead of using existing ones?|https://gamedev.stackexchange.com/questions/74388/why-would-a-game-developer-write-their-own-engine-instead-of-using-existing-ones]]\n** \u003C\u003CRedditL r/gamedev/comments/91u7ia/is_it_worth_my_time_in_2018_to_make_a_game_using \"Is it worth my time in 2018 to make a game using only C and SDL?\">>\n* [[How to Mix C and Assembly|https://www.devdungeon.com/content/how-mix-c-and-assembly]]\n\n* [[Compilation and Installation using Autoconf|https://opensource.apple.com/source/X11libs/X11libs-60/mesa/Mesa-7.8.2/docs/autoconf.html]]\n* [[What is the purpose of .PHONY in a Makefile?|https://stackoverflow.com/questions/2145590/what-is-the-purpose-of-phony-in-a-makefile]] --- TLDR: it's to declare \"fake\" targets that must build independently from actual files on disk (that make would otherwise use as targets), it doesn't mean \"sound\" or \"pronunciation\" or otherwise the full list of only allowed build targets, as I initially thought because of associating phony => telephony => ...\n* [[Makefile Tutorial by Example|https://makefiletutorial.com]] --- //Learn Makefiles With the tastiest examples// --- \u003C\u003C[# Git\"https://github.com/theicfire/makefiletutorial\">>\n* \u003C\u003Clinkdescgit \"Modern CMake\" \"https://cliutils.gitlab.io/modern-cmake/\" \"A book about using CMake for your projects\" \"https://gitlab.com/CLIUtils/modern-cmake\">>\n\n* [[Replit: The software creation platform. IDE, AI, and Deployments|https://replit.com/]]\n** [[Repl.it Offline|https://web.archive.org/web/20230330151345/https://offline.repl.it/]] (joke) --- //Repl.it's most requested feature has finally come: an offline, local-first IDE.//\n*** [[We still get mailed code and we still mail back outputs in case you thought we stopped https://offline.repl.it|https://web.archive.org/web/20230129101236/https://twitter.com/amasad/status/1442672024397045761]]\n\n* [[GPL and Linking Exceptions|https://opensource.stackexchange.com/questions/14122/gpl-and-linking-exceptions]]\n** //You can use LGPLv3 with the [[LGPL-3.0-linking-exception|https://spdx.org/licenses/LGPL-3.0-linking-exception.html]]//\n* [[What does \"GPL with classpath exception\" mean in practice?|https://softwareengineering.stackexchange.com/questions/119436/what-does-gpl-with-classpath-exception-mean-in-practice]]\n"}, {"title":"Development/Resources","created":"20230216222435750","creator":"Octt","modified":"20240127215554237","modifier":"Octt","tags":"Development","text":"* [[Rico's cheatsheets (devhint.io)|https://devhints.io/]] --- //TL;DR for developer documentation - a ridiculous collection of cheatsheets// --- \u003C\u003C[# Git \"https://github.com/rstacruz/cheatsheets\">>\n\n; Learning, Reference\n: [[Baeldung|https://www.baeldung.com/]]\n: [[DigitalOcean Tutorials|https://www.digitalocean.com/community/tutorials]]\n: [[Rollbar Tutorials|https://rollbar.com/blog/category/tutorials/]]\n: [[MDN Web Docs|https://developer.mozilla.org/en-US/]] (Mozilla)\n: [[Programiz|https://www.programiz.com/]]\n: [[Programming Simplified|https://www.programmingsimplified.com/]] --- //C C++ and Java programming tutorials and programs//\n: [[W3Schools|https://www.w3schools.com/]]\n: [[W3docs|https://www.w3docs.com/]] --- //Tutorials, Quizzes, Certificates, Frameworks, Solutions//\n\n; Collections and aggregates\n: \u003C\u003Clinkdescgit DevDocs \"https://devdocs.io\" \"API Documentation Browser\" \"https://github.com/freeCodeCamp/devdocs\">>\n: [[Developer's Documentation Collections|https://devdoc.net/]] --- //(aka API docs: devdoc)//\n: [[DevTut|https://devtut.github.io/]] --- //Tutorials compiled from StackOverflow Documentation// --- \u003C\u003C[# \"Source Git\" \"https://github.com/devtut/generate\">> \u003C\u003C[# \"Deploy Git\" \"https://github.com/devtut/devtut.github.io\">>\n\n; Code search\n: [[grep.app|https://grep.app/]]\n: [[Tabnine|https://www.tabnine.com/code/]]\n\n; Badges\n: \u003C\u003Clinkdescgit \"For the Badge\" \"https://forthebadge.com\" \"We don't develop for the money, power, fame, or codebabes. We do it For the Badge.\" \"https://github.com/BraveUX/for-the-badge\">>\n: \u003C\u003Clinkdescgit Shields.io \"https://shields.io\" \"badges as a service\" \"https://github.com/badges\">>\n"}, @@ -1201,7 +1204,7 @@ {"title":"Electronics","created":"20230723224321237","creator":"Octt","modified":"20231119004236913","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Electronics>>\n\n* [[The Nand Game|https://nandgame.com/]] --- //Welcome to The Nand Game! You are going to build a computer starting from basic components.//\n* [[Polyfuses explained|https://elinux.org/Polyfuses_explained]]\n\n* [[How to Solder|https://www.talkingelectronics.com/projects/Solder%20-%20How%20to/HowToSolder.html]]\n** \u003C\u003CYoutubeL y0xDR3St5Gg \"How to Solder a Wire to a Circuit Board\">>\n\n* [[How can I go about making temporary test connections in pcb while prototyping without soldering?|https://electronics.stackexchange.com/questions/331531/how-can-i-go-about-making-temporary-test-connections-in-pcb-while-prototyping-wi]], [[How can I make connection on pcb (circuit board) holes without solder (for prototyping)?|https://electronics.stackexchange.com/questions/249140/how-can-i-make-connection-on-pcb-circuit-board-holes-without-solder-for-proto]]\n** [[Any tricks to attaching a wire or pin to a testpoint?|https://electronics.stackexchange.com/questions/96799/any-tricks-to-attaching-a-wire-or-pin-to-a-testpoint#96807]]\n"}, {"title":"Email","created":"20231221000014083","creator":"Octt","modified":"20231223223915590","modifier":"Octt","text":"\u003C\u003C^wikipediaframe Email>>\n\n* [[What characters are allowed in an email address?|https://stackoverflow.com/questions/2049502/what-characters-are-allowed-in-an-email-address]] (contains scary examples)\n\n* [[MxToolbox|https://mxtoolbox.com/]] --- misc tools for email server administration and testing\n* [[SPF/DKIM/DMARC/DomainKey/RBL Test Online|https://appmaildev.com/]]\n\n!! ''Hosting and software''\n\n* [[Best Open Source Email Servers|https://itsfoss.com/open-source-email-servers/]]\n\n* [[Documentation for docker-mailserver!|https://docker-mailserver.github.io/docker-mailserver/latest/]] --- \u003C\u003C[# Git\"https://github.com/docker-mailserver\">>\n\n!!! Postfix\n\n\u003C\u003C^wikipediaframe \"Postfix (software)\">>\n\n* [[Adding aliases inboxes using Postfix|https://unix.stackexchange.com/questions/319222/adding-aliases-inboxes-using-postfix]] --- add new lines in /etc/aliases as needed for aliases, with format `desidered_alias: real_username`, then run `newaliases`.\n* [[Quickly test an IMAP server with telnet|https://coderwall.com/p/h-tzia/quickly-test-an-imap-server-with-telnet]]\n* [[Postfix: SASL auth with PAM and passwd file|https://seenthis.net/messages/522996]] || [[Postfix and SASL (Debian)|http://web.archive.org/web/20210211014625/http://www.jimmy.co.at/weblog/2005/12/05/postfix-and-sasl-debian/]]\n"}, {"title":"Email Settings","created":"20221107225602829","modified":"20230206111552101","modifier":"Octt","tags":"$:/i18n:en","text":"!!! ''Outlook''\n* ''Username'': Full Email Address (e.g. `example@outlook.com`)\n* ''Password'': Standard Account Password\n* ''Server'': `smtp-mail.outlook.com`\n* ''Ports'':\n** ''TLS'': `587`\n** ''No Encryption'': `25`\n* ''Daily Limits'': 250 Mails, or [verification needed] 100 different Recipients\n\n!!! ''Yahoo Mail''\n\n* ''Username'': Full Email Address (e.g. `example@yahoo.com`)\n* ''Password'': App Password; Must be set from Yahoo's account security settings\n* ''Server'': `smtp.mail.yahoo.com`\n* Ports: 465 (With SSL)\n** ''SSL'': `465`\n** ''TLS'': `587`\n* ''Daily Limits''\u003Csup>[verification needed]\u003C/sup>: 500 Mails, or 100 Connections"}, -{"title":"Emulation","created":"20230116211647194","creator":"Octt","modified":"20231212234134224","modifier":"Octt","tags":"$:/i18n:en","text":"\u003C\u003C^wikipediaframe Emulator en >>\n\n!! ''Resources''\n\n* a big list of [[Emulators written in JavaScript|https://github.com/fcambus/jsemu]]\n* a \u003C\u003CRedditL r/iosgaming/comments/tcdpr4/list_of_browser_based_emulators/ \"list of browser based emulators\">>\n* [[EmulatorJS|https://emulatorjs.org/]] --- //tool to embed an emulator into your website// --- \u003C\u003C[# Git\"https://github.com/EmulatorJS/EmulatorJS\">>\n** It was apparently born as a reverse-engineering of \u003C\u003ChttpsL www.emulatorjs.com>>\n\n* [[Is it possible to make a ROM converter?|https://retrocomputing.stackexchange.com/questions/8121/is-it-possible-to-make-a-rom-converter]] --- Spoiler: yes, but not often and not without high costs\n** [[jamulator: Statically Recompiling NES Games into Native Executables with LLVM and Go|https://andrewkelley.me/post/jamulator.html]]\n\n!!! ''Web Sites''\n* [[Emulation General Wiki|https://emulation.gametechwiki.com]]\n* [[Zophar's Domain|https://www.zophar.net/]]\n\n!!! ''Game Console Emulators''\n* https://github.com/js-emulators/desmond\n* https://github.com/44670/44vba\n* https://github.com/skylersaleh/SkyEmu\n\n!!! ''General PC Emulators''\n\n* [[Virtual x86 (v86) by copy|https://copy.sh/v86/]] - //x86 virtualization in your browser, recompiling x86 to wasm on the fly// - \u003C\u003C[ \"[[Git|https://github.com/copy/v86]]\">>\n* [[TinyEMU|https://bellard.org/tinyemu/]] - //system emulator for the RISC-V and x86 architectures//\n** [[JSLinux|https://bellard.org/jslinux/]] - //Run Linux or ''other Operating'' Systems in your browser!//\n* https://dos.zone/mobile/\n* [[Bochs|https://bochs.sourceforge.io/]] - //IA-32 emulator// - \u003C\u003C[ \"[[Git|https://github.com/bochs-emu/]]\">>\n** \u003C\u003CGPlayLink net.sourceforge.bochs \"Android port\">> by lubomyr\u003C\u003Cfnote \"The same developer also has other various emulators\">> - Sources: [[Core|https://github.com/lubomyr/bochs]], [[GUI|https://github.com/lubomyr/BochsLauncher]]\n* [[PCem|https://pcem-emulator.co.uk/]] - IBM PC emulator with focus on emulation of infinite hardware components - \u003C\u003C[ \"[[Git|https://github.com/sarah-walker-pcem/pcem]]\">>\n** [[86Box|https://86box.net/]] --- a sometimes more recommended fork --- \u003C\u003C[# Git \"https://github.com/86Box\">>\n\n!!! ''Linux Emulators''\n* [[WebVM|https://webvm.io]] - //Linux virtualization for the Web, in WebAssembly// - \u003C\u003C[ \"[[Git|https://github.com/leaningtech/webvm]]\">>\n* [[box86\\box64|https://box86.org/]] - //Linux Userspace x86 Emulator for ARM// - \u003C\u003C[ \"[[Git (86)|https://github.com/ptitSeb/box86]]\">> \u003C\u003C[ \"[[Git (64)|https://github.com/ptitSeb/box64]]\">>\n\n!!! ''Other''\n* [[Thumbnails for RetroArch|https://github.com/libretro-thumbnails/libretro-thumbnails]]\n* https://github.com/Abdess/retroarch_system\n* [[Emulator files|https://emulation.gametechwiki.com/index.php/Emulator_files]] (system BIOS and such)\n"}, +{"title":"Emulation","created":"20230116211647194","creator":"Octt","modified":"20240130121545770","modifier":"Octt","page-cover":"https://source.unsplash.com/random?emulation","tags":"$:/i18n:en","text":"\u003C\u003C^wikipediaframe Emulator en >>\n\n!! ''Resources''\n\n* a big list of [[Emulators written in JavaScript|https://github.com/fcambus/jsemu]]\n* a \u003C\u003CRedditL r/iosgaming/comments/tcdpr4/list_of_browser_based_emulators/ \"list of browser based emulators\">>\n* [[EmulatorJS|https://emulatorjs.org/]] --- //tool to embed an emulator into your website// --- \u003C\u003C[# Git\"https://github.com/EmulatorJS/EmulatorJS\">>\n** It was apparently born as a reverse-engineering of \u003C\u003ChttpsL www.emulatorjs.com>>\n\n* [[Is it possible to make a ROM converter?|https://retrocomputing.stackexchange.com/questions/8121/is-it-possible-to-make-a-rom-converter]] --- Spoiler: yes, but not often and not without high costs\n** [[jamulator: Statically Recompiling NES Games into Native Executables with LLVM and Go|https://andrewkelley.me/post/jamulator.html]]\n\n!!! ''Web Sites''\n* [[Emulation General Wiki|https://emulation.gametechwiki.com]]\n* [[Zophar's Domain|https://www.zophar.net/]]\n\n!!! ''Game Console Emulators''\n* https://github.com/js-emulators/desmond\n* https://github.com/44670/44vba\n* https://github.com/skylersaleh/SkyEmu\n\n!!! ''General PC Emulators''\n\n* [[Virtual x86 (v86) by copy|https://copy.sh/v86/]] - //x86 virtualization in your browser, recompiling x86 to wasm on the fly// - \u003C\u003C[ \"[[Git|https://github.com/copy/v86]]\">>\n* [[TinyEMU|https://bellard.org/tinyemu/]] - //system emulator for the RISC-V and x86 architectures//\n** [[JSLinux|https://bellard.org/jslinux/]] - //Run Linux or ''other Operating'' Systems in your browser!//\n* https://dos.zone/mobile/\n* [[Bochs|https://bochs.sourceforge.io/]] - //IA-32 emulator// - \u003C\u003C[ \"[[Git|https://github.com/bochs-emu/]]\">>\n** \u003C\u003CGPlayLink net.sourceforge.bochs \"Android port\">> by lubomyr\u003C\u003Cfnote \"The same developer also has other various emulators\">> - Sources: [[Core|https://github.com/lubomyr/bochs]], [[GUI|https://github.com/lubomyr/BochsLauncher]]\n* [[PCem|https://pcem-emulator.co.uk/]] - IBM PC emulator with focus on emulation of infinite hardware components - \u003C\u003C[ \"[[Git|https://github.com/sarah-walker-pcem/pcem]]\">>\n** [[86Box|https://86box.net/]] --- a sometimes more recommended fork --- \u003C\u003C[# Git \"https://github.com/86Box\">>\n\n!!! ''Linux Emulators''\n* [[WebVM|https://webvm.io]] - //Linux virtualization for the Web, in WebAssembly// - \u003C\u003C[ \"[[Git|https://github.com/leaningtech/webvm]]\">>\n* [[box86\\box64|https://box86.org/]] - //Linux Userspace x86 Emulator for ARM// - \u003C\u003C[ \"[[Git (86)|https://github.com/ptitSeb/box86]]\">> \u003C\u003C[ \"[[Git (64)|https://github.com/ptitSeb/box64]]\">>\n\n!!! ''Other''\n* [[Thumbnails for RetroArch|https://github.com/libretro-thumbnails/libretro-thumbnails]]\n* https://github.com/Abdess/retroarch_system\n* [[Emulator files|https://emulation.gametechwiki.com/index.php/Emulator_files]] (system BIOS and such)\n"}, {"title":"Endianness","created":"20230404134313374","creator":"Octt","modified":"20240119003724455","modifier":"Octt","tags":"Computing","text":"\u003C\u003C^wikipediaframe Endianness>>\n\n* [[Was Little Endian made to confuse programmers|https://www.quora.com/Was-Little-Endian-made-to-confuse-programmers]]\n* \u003C\u003CRedditL /r/csELI5/comments/1qkadu/big_and_little_endians/ \"Big and Little Endians - r/csELI5\">>\n* https://www.technicalsourcery.net/posts/on-endianness/ [\u003C\u003CHackernewsL 28207414>>]\n"}, {"title":"English","created":"20220922204615800","icon":"$:/languages/en-GB/icon","modified":"20220922204615800"}, {"title":"EPSON WF-2510","created":"20230902000456550","creator":"Octt","modified":"20231221002107431","modifier":"Octt","tags":"Printing","text":"Linux driver:\n\n* on [[OpenPrinting|https://openprinting.org/printer/Epson/Epson-WF-2510_Series]]\n** the deb file is apparently outdated and won't work on Debian 12\n* (Debian) apt package: `printer-driver-escpr` (available in stable as of Debian 12)\n"}, @@ -1209,7 +1212,7 @@ {"title":"ESP8266:en","created":"20230202103531778","creator":"Octt","modified":"20230206111552112","modifier":"Octt","tags":"MCU $:/i18n:en","text":"\u003C\u003CWikipediaFrame ESP8266 en>>"}, {"title":"F-Zero","created":"20230219132559585","creator":"Octt","modified":"20230226222922829","modifier":"Octt","tags":"Racing Retro Modern Nintendo","text":"\u003C\u003C^wikipediaframe F-Zero>>\n\n; What I like\n: The game feels very fast, speedy, like you can't rest for even a second while racing, it's immersive. \u003Cdd>\nVery impressive how the [[SNES]] version runs at a constant 60 FPS.\n\u003C/dd>\n: The [[Mode-7]] games are especially colorful and the controls feel good.\n; What I don't like\n: The 3D games are kind of \"foggy\" and dark, and while the atmosphere may feel more modern, they are mostly unattractive to me.\n"}, {"title":"Fantasy computer","created":"20240119005148701","creator":"Octt","modified":"20240119010619538","modifier":"Octt","tags":"","text":"* //''[[Uxn/Varvara ecosystem|https://100r.co/site/uxn.html]]'' is a personal computing stack based on a small virtual machine that lies at the heart of our software, and that allows us to run the same application on a variety of systems.//\n** //''[[Uxn|https://wiki.xxiivv.com/site/uxn.html]]'' is a virtual stack-machine designed to host the Hundred Rabbits projects.//\n** [[Awesome Uxn Awesome|https://github.com/hundredrabbits/awesome-uxn#emulators]] --- //Curated list of awesome Uxn projects from the community.//\n** [[learn-uxn|https://metasyn.srht.site/learn-uxn/]] by trying and editing code in the browser\n\n!! Fantasy console\n\n\u003C\u003C^wikipediaframe \"Fantasy console\">>"}, -{"title":"Fediverse","created":"20230114124144464","creator":"Octt","icon":"","modified":"20231223123321502","modifier":"Octt","tags":"[[Social network]]","text":"\u003C!-- \u003C\u003CMediaWiki Fediverse en 1 Fediverse_logo_proposal.svg>> -->\n\u003C\u003C^wikipediaframe Fediverse en>>\n\n!! ''List of Platforms''\n\nTip: these sites list many public instances for many platforms.\n\n* [[Fediverse.Party|https://fediverse.party]] --- \u003C\u003C#[ Git \"https://codeberg.org/fediverse/fediparty\">>\n* [[Fediverse Observer|https://fediverse.observer]]\n* [[Fediverse Explorer (h4kor)|https://h4kor.github.io/fediverse-explorer/]] --- Graph view of instances\n\n!!! ''Media''\n\n* [[PeerTube|PeerTube:en]] - Video sharing\n* [[Pixelfed|Pixelfed:en]] - Image sharing\n\n!!! ''Microblogging''\n\n* [[GoToSocial|https://gotosocial.org]] - //Fast, fun, ActivityPub server, powered by Go//\n* [[Mastodon|Mastodon]] | [[Hometown|https://github.com/hometown-fork/hometown]] | [[glitch-soc|https://github.com/glitch-soc]]\n* [[Misskey|Misskey]] | [[Dolphin|https://github.com/syuilo/dolphin]]\n* [[Pleroma|https://pleroma.social]] | [[Akkoma|https://akkoma.social]] | [[Soapbox|https://soapbox.pub]]\n* [[Takahē|https://jointakahe.org]] - //An efficient ActivityPub Server, for small installs with multiple domains//\n\n!!! ''Other''\n\n* [[Epicyon|https://epicyon.net]] [[[Git|https://gitlab.com/bashrc2/epicyon]]] - //Designed for simplicity and accessibility, includes calendar, news and sharing economy features//\n* [[Friendica|Friendica]]\n* [[Lemmy|Lemmy:en]] [[[Git|https://github.com/ernestwisniewski/kbin]], [[Dev Instance|https://dev.karab.in]]] - //🐀 A link aggregator and forum for the fediverse//\n* [[/kbin|https://kbin.pub]] - //Fediverse of content//\n\n!!! ''Coming Soon''\n\n* [[Goldfish Social|https://github.com/Goldfish-Social/Goldfish]]\n\n\n!! ''Posts and Users''\n\n* [[Fediverse Explorer (stefanbohacek)|https://stefanbohacek.com/project/fediverse-explorer/]] --- //Browse most recent public posts across the fediverse by hashtag//\n* [[fediverse.info|https://fediverse.info/]] --- Directory of suggested profiles\n\n\n!! ''Other''\n\n* [[Soapbox|https://soapbox.pub/]] --- //A social media frontend with a focus on custom branding and ease of use.// (+ other things) --- \u003C\u003C[# Git\"https://gitlab.com/soapbox-pub\">>\n* [[Mangan App|https://manganapp.vercel.app]] --- //Fork of Mangane, fork Soapbox, fork of Mastodon UI//, with support for login into any instance --- \u003C\u003C[# Git\"https://github.com/sjbat/mangan\">>\n\n* [[Fediverse Enhancement Proposals|https://codeberg.org/fediverse/fep]]\n* [[MaPlefeed|https://maplefeed.bihlink.com/]] --- //Mastodon & Pleroma Feed generator// --- \u003C\u003C[# Git\"https://github.com/bihlink/maplefeed\">>\n\n"}, +{"title":"Fediverse","created":"20230114124144464","creator":"Octt","icon":"","modified":"20240130121405070","modifier":"Octt","page-cover":"https://source.unsplash.com/random?fediverse","tags":"[[Social network]]","text":"\u003C!-- \u003C\u003CMediaWiki Fediverse en 1 Fediverse_logo_proposal.svg>> -->\n\u003C\u003C^wikipediaframe Fediverse en>>\n\n!! ''List of Platforms''\n\nTip: these sites list many public instances for many platforms.\n\n* [[Fediverse.Party|https://fediverse.party]] --- \u003C\u003C#[ Git \"https://codeberg.org/fediverse/fediparty\">>\n* [[Fediverse Observer|https://fediverse.observer]]\n* [[Fediverse Explorer (h4kor)|https://h4kor.github.io/fediverse-explorer/]] --- Graph view of instances\n\n!!! ''Media''\n\n* [[PeerTube|PeerTube:en]] - Video sharing\n* [[Pixelfed|Pixelfed:en]] - Image sharing\n\n!!! ''Microblogging''\n\n* [[GoToSocial|https://gotosocial.org]] - //Fast, fun, ActivityPub server, powered by Go//\n* [[Mastodon|Mastodon]] | [[Hometown|https://github.com/hometown-fork/hometown]] | [[glitch-soc|https://github.com/glitch-soc]]\n* [[Misskey|Misskey]] | [[Dolphin|https://github.com/syuilo/dolphin]]\n* [[Pleroma|https://pleroma.social]] | [[Akkoma|https://akkoma.social]] | [[Soapbox|https://soapbox.pub]]\n* [[Takahē|https://jointakahe.org]] - //An efficient ActivityPub Server, for small installs with multiple domains//\n\n!!! ''Other''\n\n* [[Epicyon|https://epicyon.net]] [[[Git|https://gitlab.com/bashrc2/epicyon]]] - //Designed for simplicity and accessibility, includes calendar, news and sharing economy features//\n* [[Friendica|Friendica]]\n* [[Lemmy|Lemmy:en]] [[[Git|https://github.com/ernestwisniewski/kbin]], [[Dev Instance|https://dev.karab.in]]] - //🐀 A link aggregator and forum for the fediverse//\n* [[/kbin|https://kbin.pub]] - //Fediverse of content//\n\n!!! ''Coming Soon''\n\n* [[Goldfish Social|https://github.com/Goldfish-Social/Goldfish]]\n\n\n!! ''Posts and Users''\n\n* [[Fediverse Explorer (stefanbohacek)|https://stefanbohacek.com/project/fediverse-explorer/]] --- //Browse most recent public posts across the fediverse by hashtag//\n* [[fediverse.info|https://fediverse.info/]] --- Directory of suggested profiles\n\n\n!! ''Other''\n\n* [[Soapbox|https://soapbox.pub/]] --- //A social media frontend with a focus on custom branding and ease of use.// (+ other things) --- \u003C\u003C[# Git\"https://gitlab.com/soapbox-pub\">>\n* [[Mangan App|https://manganapp.vercel.app]] --- //Fork of Mangane, fork Soapbox, fork of Mastodon UI//, with support for login into any instance --- \u003C\u003C[# Git\"https://github.com/sjbat/mangan\">>\n\n* [[Fediverse Enhancement Proposals|https://codeberg.org/fediverse/fep]]\n* [[MaPlefeed|https://maplefeed.bihlink.com/]] --- //Mastodon & Pleroma Feed generator// --- \u003C\u003C[# Git\"https://github.com/bihlink/maplefeed\">>\n\n"}, {"title":"FFmpeg","created":"20231210222318699","creator":"Octt","modified":"20231210222659341","modifier":"Octt","text":"\u003C\u003C^wikipediaframe FFmpeg>>\n\n* [[ffmpeg.wasm|https://ffmpegwasm.netlify.app/]] --- //FFmpeg for browser, powered by WebAssembly// --- \u003C\u003C[# Git\"https://github.com/ffmpegwasm\">>\n** [[ffmpeg-web|https://ffmpeg-web.netlify.app/]] --- //Web UI for ffmpeg-wasm: convert video, audio and images using the power of ffmpeg, directly from your browser// --- \u003C\u003C[# Git\"https://github.com/dinoosauro/ffmpeg-web\">>"}, {"title":"FFmpeg/Snippets","created":"20221008141221923","creator":"Octt","modified":"20231112232329809","modifier":"Octt","tags":"Snippets $:/i18n:en","text":"!! Flags\n\n* Specify an input file: `-i ${File}`\n* Framerate: `-r ${r}`, `-framerate ${r}` (//use both because one sometimes doesn't work//) ([[other ways|https://stackoverflow.com/questions/45462731/using-ffmpeg-to-change-framerate#45465730]])\n\n\n!!! Filter Flags\n\n//These are specified by prefixing an argument://\n\n* Audio: `-filter:a` or `-af`\n* Video: `-filter:v` or `-vf`\n\n!!!! Audio Filters\n\n* Volume: `volume=`\n** `±{n}dB`: Adding or Subtracting to absolute value in dB\n** `{%/100}`: Target percentage divided by 100 (e.g: //150% -> 1.5//)\n\n* Detecting volume details: `volumedetect -f null /dev/null` (just prints to console)\n\n!!!! Video Filters\n\n* Scaling: `scale=${w}:${h}`\n* [[Cropping|https://video.stackexchange.com/questions/4563/how-can-i-crop-a-video-with-ffmpeg]]: `crop=${w}:${h}:${x}:${y}`\n\n\n!!! Audio/Video Flags\n\n//These are specified as `-flag:a` or `-flag:v`.//\n\n* Bitrate: `-b:{a|v} ${n}{k|m|...}`\n* Codec: `-c:{a|v} ${codec}`\n\n!!!! Audio Flags\n\n* Audio channels: `-ac ${n}`\n\n\n!! Codecs List\n\n!!! Special\n\n* `copy`: Copy data stream without re-encoding (if supported by container)\n\n!!! Audio Codecs\n\n* `libopus`\n\n!!! Video Codecs\n\n* `h263`, `h264`, `libx265`\n* `libvpx-vp8`, `libvpx-vp9`\n* `libaom-av1`\n\n\n!! Tips\n\n* [[Trim Video|https://shotstack.io/learn/use-ffmpeg-to-trim-video]]\n* [[Image+Audio -> Video|https://superuser.com/questions/1041816/combine-one-image-one-audio-file-to-make-one-video-using-ffmpeg]]"}, {"title":"File manager","created":"20231112232349800","creator":"Octt","modified":"20231112232557820","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"File manager\">>\n\n* \u003C\u003Clinkdescgit \"FileBrowser.org\" \"https://filebrowser.org/\" \"📂 Web File Browser\" \"https://github.com/filebrowser\">>\n"}, @@ -1231,7 +1234,7 @@ {"title":"Game save","created":"20230504095233944","creator":"Octt","modified":"20231001093833237","modifier":"Octt","tags":"Gaming","text":"\u003C\u003C^wikipediaframe Gamesave>>\n\n* [[3DS Save Bank|https://ds-save-bank.firebaseapp.com/]]\n"}, {"title":"Gamepad","created":"20230822234737434","creator":"Octt","icon":"🎮","modified":"20231103235715411","modifier":"Octt","page-cover":"https://source.unsplash.com/random?Gamepad","tags":"Gaming","text":"\u003C\u003C^wikipediaframe Gamepad>>\n\n* [[The “padhacking” thread|https://archive.supercombo.gg/t/the-padhacking-thread/16708/1]]\n\n* [[Converting a wireless 360 controller to wired|https://gaming.stackexchange.com/questions/155459/converting-a-wireless-360-controller-to-wired]] --- Basically impossible, while the integrated MCU carries data via USB, it has a fake firmware that can't carry HID events... because actually the pad's port (proprietary USB fork really with 3 extra pins) has data pins. Who knows.\n"}, {"title":"Gaming","created":"20230116202756249","creator":"Octt","modified":"20240129133948769","modifier":"Octt","page-cover":"https://source.unsplash.com/random?gaming","tags":"$:/i18n:en","text":"\u003C\u003C^wikipediaframe Video_game en>>\n\nSome games:\n\n* [[Dwarf Fortress|https://bay12games.com/dwarves]] --- very old game that recently got modernized, I like the original ASCII-graphics-based version (\"Classic\") which is also gratis\n* [[Rising Up|https://twitwi.itch.io/risingup]] --- //Climb the Corporate Ladder... with Your Fists!//\n* All other games I mentioned on this KB: \u003C\u003Ctag Game>>\n\nSome gaming resources:\n\n* [[Video Game History Foundation|https://gamehistory.org/]] --- //non-profit organization dedicated to preserving, celebrating, and teaching the history of video games//\n* [[The Cutting Room Floor|https://tcrf.net/]] is a site dedicated to unearthing and researching unused and cut content from video games\n* [[Video Game Music Preservation Foundation|https://www.vgmpf.com/Wiki/index.php]] --- //the Wikipedia of video game music!//\n* [[|https://vgmdb.net/]]\n\n* \u003C\u003CThonky.com>> --- //Video Game Guides and More//\n* [[MobyGames Video Game Database|https://www.mobygames.com/]] --- //extremely ambitious project with the goal to meticulously catalog all relevant information about electronic games on a game-by-game basis//\n* [[The King of Grabs|https://thekingofgrabs.com/]] --- //Grabbing amazing video game screenshots one game at a time.//\n* [[VGMaps.com: The Video Game Atlas|https://www.vgmaps.com/]] --- //the largest source of screenshot maps on the Internet, with thousands of maps of your favourite video games!//\n* [[Bootleg Games Wiki|https://bootleggames.fandom.com/]] --- //Wiki dedicated to unlicensed and bootleg video games//\n\n* \u003C\u003ChttpsL Classic-Games.net>> --- //Your retro game headquarters//\n* [[RetroBreak|https://retrobreak.co.uk/]] --- //Celebrating Video Game History//\n* [[The Tech Game - Community|https://www.thetechgame.com/]] --- gaming news along with useful related downloads\n* [[GameTripper UK|https://www.gametripper.co.uk/]] --- //Reliving your gaming memories//\n\n* //''[[Hard Drive|https://hard-drive.net/]]'' is a very real video games news site that you should not question. Just absorb the information as truth and move on. JK it’s satire don’t ban us.//\n\n* [[Sala Museo Games|https://gamingshitposting.github.io/SalaMuseoGames]] --- //Where art is your new play// --- \u003C\u003C[# Git\"https://github.com/GamingShitposting/SalaMuseoGames\">>\n* [[GameSnacks|https://gamesnacks.com/]] --- //Play Bite-Sized HTML5 Games for Mobile and Desktop// --- mostly trashy games but some are decent, also there are no ads apparently?\n* [[Free Game Planet|https://www.freegameplanet.com/]] --- //All The Best Free Video Games With New Additions Every Day//\n** [[Alpha Beta Gamer|https://www.alphabetagamer.com/]] --- //Free Video Game Alpha & Beta Tests. The Worlds Biggest Beta Testing Site//\n\n* [[Attract Mode (Concept)|https://www.giantbomb.com/attract-mode/3015-1641/]] --- //A mode in which a game will play a gameplay demonstration video as a means to entice players into playing the game.//\n\n* \u003C\u003CYoutubeL ha_7cZxqhhE \"Nobody Knows I'm Gaming Right Now... Secretly Gaming in Public with [...] AR Glasses\">> --- a nice crazy idea for gaming everywhere in the most pick-up-and-play fashion\n"}, -{"title":"Gaming console","created":"20231119004553704","creator":"Octt","modified":"20240110011644718","modifier":"Octt","tags":"Gaming","text":"\u003C\u003C^wikipediaframe \"Gaming console\">>\n\n* [[Console Protocols|https://sites.google.com/site/consoleprotocols/]] --- //site dedicated to the accurate documentation of protocols used to communicate with and inside of game consoles//\n* [[ConsoleMods.org|https://consolemods.org/wiki/Main_Page]] --- //collaborative community focused on collecting and preserving the ephemeral knowledge of console modifications, repairs, and restoration methods//\n\n* \u003C\u003CYoutubeL XrieCn9-9GU \"Can a $10 8-bit handheld game console be any good?\">> (Sup Famiclone)\n** \u003C\u003CYoutubeL ceI4CeIN1SQ \"Improving the $10 8-bit handheld game console\">> (better quality AV out)\n* \u003C\u003CYoutubeL N7q-tiiTN1Q \"SH108 - Hackeriamo un mini arcade\">>\n* [[Fun project -hack cheap handheld console- help with BGA NAND flash chip needed|https://www.eevblog.com/forum/beginners/fun-project-hack-cheap-handheld-console-help-with-bga-nand-flash-chip-needed/]]\n* [[Dissecting a hand-held NOAC console|https://hackaday.io/project/175322-dissecting-a-hand-held-noac-console]] --- //This is an attempt to understand how these little things work, and what we can do on it.//\n* \u003C\u003CRedditL r/SBCGaming/comments/t8k09f/is_there_any_conceivable_way_to_replace_the_roms/ \"Is there any conceivable way to replace the ROMs on 400-in-1 Handheld Console?\">>\n** [[teardown: e-mods rs-1 handheld|https://flawed.net.nz/2017/09/11/teardown-e-mods-rs-1-handheld-game/]]\n** [[Искусство кройки и шитья или возможность заменить игры в портативной игровой консоли SUP (The art of cutting and sewing or the ability to replace games in a portable SUP game console)|https://habr.com/ru/articles/718366/]]\n\n* [[V.R. Technology IC Design|https://www.vrt.com.tw/]] (official site with manuals, datasheets, and downloads)\n** [[VTxx|https://bootleggames.fandom.com/wiki/VTxx]]\n"}, +{"title":"Gaming console","created":"20231119004553704","creator":"Octt","modified":"20240130121432753","modifier":"Octt","page-cover":"https://source.unsplash.com/random?gaming-console","tags":"Gaming","text":"\u003C\u003C^wikipediaframe \"Gaming console\">>\n\n* [[Console Protocols|https://sites.google.com/site/consoleprotocols/]] --- //site dedicated to the accurate documentation of protocols used to communicate with and inside of game consoles//\n* [[ConsoleMods.org|https://consolemods.org/wiki/Main_Page]] --- //collaborative community focused on collecting and preserving the ephemeral knowledge of console modifications, repairs, and restoration methods//\n\n* \u003C\u003CYoutubeL XrieCn9-9GU \"Can a $10 8-bit handheld game console be any good?\">> (Sup Famiclone)\n** \u003C\u003CYoutubeL ceI4CeIN1SQ \"Improving the $10 8-bit handheld game console\">> (better quality AV out)\n* \u003C\u003CYoutubeL N7q-tiiTN1Q \"SH108 - Hackeriamo un mini arcade\">>\n* [[Fun project -hack cheap handheld console- help with BGA NAND flash chip needed|https://www.eevblog.com/forum/beginners/fun-project-hack-cheap-handheld-console-help-with-bga-nand-flash-chip-needed/]]\n* [[Dissecting a hand-held NOAC console|https://hackaday.io/project/175322-dissecting-a-hand-held-noac-console]] --- //This is an attempt to understand how these little things work, and what we can do on it.//\n* \u003C\u003CRedditL r/SBCGaming/comments/t8k09f/is_there_any_conceivable_way_to_replace_the_roms/ \"Is there any conceivable way to replace the ROMs on 400-in-1 Handheld Console?\">>\n** [[teardown: e-mods rs-1 handheld|https://flawed.net.nz/2017/09/11/teardown-e-mods-rs-1-handheld-game/]]\n** [[Искусство кройки и шитья или возможность заменить игры в портативной игровой консоли SUP (The art of cutting and sewing or the ability to replace games in a portable SUP game console)|https://habr.com/ru/articles/718366/]]\n\n* [[V.R. Technology IC Design|https://www.vrt.com.tw/]] (official site with manuals, datasheets, and downloads)\n** [[VTxx|https://bootleggames.fandom.com/wiki/VTxx]]\n"}, {"title":"GBA","created":"20230216205342744","creator":"Octt","modified":"20230216205848009","modifier":"Octt","tags":"Nintendo Console Gaming","text":"\u003C\u003Cwikipediaframe GBA en>>\n\n!! ''Resources''\n\n* \u003C\u003CYoutubeL CCXlwI939is \"The Game Boy Advance Is Insanely Powerful Compared to the SNES\">>\n"}, {"title":"GIF","created":"20240107013040620","creator":"Octt","modified":"20240107013413537","modifier":"Octt","tags":"Image","text":"\u003C\u003C^WikipediaFrame \"GIF\">>\n\n* [[Gifski|https://gif.ski/]] -- //Highest-quality GIF encoder. GIF encoder based on libimagequant (pngquant). Squeezes maximum possible quality from the awful GIF format.// --- \u003C\u003C[# Git\"https://github.com/ImageOptim/gifski/\">>\n"}, {"title":"GIMP","created":"20231210224054942","creator":"Octt","modified":"20231210231508446","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"GIMP\">>\n\n* [[G'MIC - GREYC's Magic for Image Computing|https://gmic.eu/]] --- //Full-Featured Open-Source Framework for Image Processing//\n"}, @@ -1275,11 +1278,12 @@ {"title":"Issues of the Modern Web","created":"20230301080208442","creator":"Octt","modified":"20231107220850311","modifier":"Octt","tags":"Web Modern","text":"* ~~Just in, 2023/July:~~ [[Web Environment Integrity API Proposal|https://github.com/RupertBenWiser/Web-Environment-Integrity]] --- //[[This is scary. It's (strong) SafetyNet for websites [...]|https://mastodon.uno/@lina@vt.social/110755246339815796]]//\n** 2023/November update: [[Google bins integrity API that looked more than a bit like horrible DRM for websites|https://www.theregister.com/2023/11/02/google_abandons_web_environment_integrity/]]... but not completely: it will still be integrated into [[Android]] System Webview, for some reason\n* Reign of [[Surveillance Capitalism]].\n** Full of advertisements, and trackers.\n* Technically problematic:\n** Even simple text+images websites are full of megabytes of useless components.\n*** This wisdom tends to verify as more truthful the more you test it against websites of more big players, or entities that are on the web just for money.\n** Web Browsers are in themselves Operating Systems.\n*** Only [[The 3 Web Players]] can keep up with constantly evolving standards requiring corporate-level organization for development, and the risk for a [[Google]] monopoly is real.\n*** Every month or so each browser engine has a new critical vulnerability.\n* Has more noise than information:\n** Search engines are each day less effective, as pages/articles or full sites written to game SEO pop-up, sinking real information in noise - with entire industries dedicated to profiting this way.\n*** Real people who just want to create real content suffer the most.\n"}, {"title":"Italiano","created":"20220923052724501","icon":"$:/languages/it-IT/icon","modified":"20220923052724501"}, {"title":"Java","created":"20230211172153874","creator":"Octt","modified":"20231222121254624","modifier":"Octt","text":"\u003C\u003C^wikipediaframe \"Java (programming language)\" en>>\n\n* [[Java NullPointerException|https://www.digitalocean.com/community/tutorials/java-lang-nullpointerexception]]\n\n* [[Oracle Java Downloads Archive|https://www.oracle.com/java/technologies/downloads/archive/]] --- requires shitty account to download basically anything, but has everything\n* [[Install openjdk-6-jdk on Ubuntu/Xubuntu 16.04 |https://gist.github.com/bmaupin/ff99b0cc84dd3ad8c4600374f2473184]]\n"}, -{"title":"JavaScript","created":"20221110145611678","creator":"Octt","modified":"20240119004231712","modifier":"Octt","tags":"Development $:/i18n:en Web","text":"''JavaScript'', or \"JS\", is an high-level programming language. It constitutes a core technology of the Web, sitting optionally alongside HTML and CSS. In recent years, it has gotten more and more popular even for desktop app and backend development.\n\n\u003C\u003C^wikipediaframe JavaScript>>\n\n* [[Ecma International TC39|https://tc39.es/]] - Committee maintaining JS specifications\n\n* [[aem1k|https://aem1k.com/]] --- //JavaScript Hacks and Creative Coding Created by Martin Kleppe aka @aemkei.// --- \u003C\u003C[# Git\"https://github.com/aemkei/aemkei.github.io\">>\n\n!!! ''Resources''\n\n* [[The Modern JavaScript Tutorial (javascript.info)|https://javascript.info/]] --- //How it's done now. From the basics to advanced topics with simple, but detailed explanations.//\n* \u003C\u003ChttpsL JavaScriptTutorial.net>> --- //helps you learn JavaScript programming from scratch quickly and effectively//\n\n* //''[[JSFuck|https://jsfuck.com/]]'' is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.// --- \u003C\u003C[# Git+Guide \"https://github.com/aemkei/jsfuck\">>\n\n* [[Which equals operator (== vs ===) should be used in JavaScript comparisons?|https://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons]] (\"Good and bad twins\") --- `==` is bad unless explicitly needed, since it does type-coercion.\n** [[In theory === is faster, no type conversion takes place. Practically there's no performance difference.|https://stackoverflow.com/questions/12332855/which-javascript-equality-operator-or-is-faster]]\n** [[JavaScript-Equality-Table|https://dorey.github.io/JavaScript-Equality-Table/unified/]] - \u003C\u003C[ \"[[Git|https://github.com/dorey/JavaScript-Equality-Table]]\">>\n\n* [[Environment detection: node.js or browser|https://stackoverflow.com/a/57774317]]\n* [[Superpacking JS Demos|https://web.archive.org/web/20120919185414/http://daeken.com/superpacking-js-demos]]\n* [[\"Illegal invocation\" errors in JavaScript|https://mtsknn.fi/blog/illegal-invocations-in-js/]] --- //The error is thrown when calling a function whose `this` keyword isn't referring to the object where it originally did (when the context of the function is lost)//\n* [[Does JavaScript have a method like \"range()\" to generate a range within the supplied bounds?|https://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-a-range-within-the-supp]] --- `[...Array(5).keys()]`\n* [[Listen for triple clicks in JavaScript|https://stackoverflow.com/questions/6480060/how-do-i-listen-for-triple-clicks-in-javascript#6480113]]\n* [[Fastest method to escape HTML tags as HTML entities?|https://stackoverflow.com/questions/5499078/fastest-method-to-escape-html-tags-as-html-entities]] --- in the browser, `(html) => { var escape = document.createElement('textarea'); escape.textContent = html; return escape.innerHTML; }`\n* [[Get a random item from a JavaScript array|https://stackoverflow.com/questions/5915096/get-a-random-item-from-a-javascript-array#5915122]] : [[Getting a random value from a JavaScript array|https://stackoverflow.com/questions/4550505/getting-a-random-value-from-a-javascript-array]] --- `item = items[Math.floor(Math.random() * items.length)];`\n* [[Simplest code for array intersection in javascript|https://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript#1885569]] --- `arrayNew = array1.filter(value => array2.includes(value));`\n* [[Why is 'for (... in ...)' with arrays considered bad practice in JavaScript?|https://stackoverflow.com/questions/2265167/why-is-forvar-item-in-list-with-arrays-considered-bad-practice-in-javascript]] --- use `for (... of ...)` to iterate for values, the `in` form should only be used to iterate over indices\n* [[Why is extending native objects a bad practice?|https://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice]] --- it breaks everything for some objects.\n** see [[https://eslint.org/docs/latest/rules/no-extend-native]]\n* [[What does ~~ (\"double tilde\") do in Javascript?|https://stackoverflow.com/questions/4055633/what-does-double-tilde-do-in-javascript]] ; [[What is the \"double tilde\" (~~) operator in JavaScript? [duplicate]|https://stackoverflow.com/questions/5971645/what-is-the-double-tilde-operator-in-javascript]] --- double NOT logical operator, useful shorter and faster alternative to `Math.floor` for small numbers\n* [[How to convert uint8 Array to base64 Encoded String?|https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/66046176#66046176]]\n* [[What is the JavaScript version of sleep()?|https://stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep#39914235]] --- `await new Promise(r => setTimeout(r, milliseconds));`\n* [[Convert letter to number in JavaScript|https://stackoverflow.com/questions/27877197/convert-letter-to-number-in-javascript]] (or parse a String that contains a number and happens to contain letters as a Number) --- \u003C\u003CMDNLink Web/JavaScript/Reference/Global_Objects/parseInt parseInt()>>\n\n* [[How to get text from all descendents of an element (disregarding scripts)?|https://stackoverflow.com/questions/2532043/how-to-get-text-from-all-descendents-of-an-element-disregarding-scripts]]\n* [[Converting HTML string into DOM elements?|https://stackoverflow.com/questions/3103962/converting-html-string-into-dom-elements#3104237]] --- `doc = new DOMParser().parseFromString(htmlString, 'text/html')`\n* [[set doctype using javascript|https://stackoverflow.com/questions/21523487/set-doctype-using-javascript]]\n* [[JavaScript Regex Replace Tutorial|https://www.javascripttutorial.net/javascript-regex/replace/]]\n* [[Insert an element after another DOM element with JavaScript|https://attacomsian.com/blog/javascript-insert-element-after]] --- //`target.parentNode.insertBefore(elem, target.nextSibling)\n`//\n\n* [[Send POST data using XMLHttpRequest|https://stackoverflow.com/questions/9713058/send-post-data-using-xmlhttprequest]]\n* [[fetch API [and comparison with XMLHttpRequest]|https://davidwalsh.name/fetch]]\n* [[How do I upload a file with the JS fetch API?|https://stackoverflow.com/questions/36067767/how-do-i-upload-a-file-with-the-js-fetch-api#comment98412965_36082038]] --- pass the `file` object to the body, do NOT set Content-Type header\n* [[How to Use Fetch with async/await|https://dmitripavlutin.com/javascript-fetch-async-await/]]\n\n* [[String indexOf()|https://www.w3schools.com/jsref/jsref_indexof.asp]]\n* [[Array.prototype.splice()|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice]], [[JavaScript Array splice() (W3S)|https://www.w3schools.com/jsref/jsref_splice.asp]] --- //changes the contents of an array by removing or replacing existing elements and/or adding new elements in place//, useful alternative for a nonexistant remove function, with `.splice(index, amountToRemove)`\n* \u003C\u003CMDNLink Web/JavaScript/Reference/Global_Objects/Array/concat \"Array.prototype.concat()\">> --- //used to merge two or more arrays, does not change the existing arrays but instead returns a new one//\n* [[XMLHttpRequest|https://www.w3schools.com/xml/xml_http.asp]]\n** \u003C\u003CMDNLink Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests \"Synchronous and asynchronous requests\">>\n* [[HTML DOM Events|https://www.w3schools.com/jsref/dom_obj_event.asp]]\n\n* \u003C\u003ChttpsL tixy.land>> --- //(t,i,x,y) => \"creative code golfing\"// --- \u003C\u003C[# Git\"https://github.com/aemkei/tixy\">>\n\n!!! ''Tools''\n\n* [[jsPerf|https://jsperf.app/]] - //online JavaScript performance benchmark// - \u003C\u003C[ \"[[Git|https://github.com/rd13/jsperf.app]]\">>\n** Old source code: [[v2|https://github.com/jsperf]], [[v1|https://github.com/mathiasbynens/jsperf.com]]\n* [[MeasureThat.net|https://www.measurethat.net/]] - //measure performance of JavaScript code// - \u003C\u003C[ \"[[Git|https://github.com/thecoderok/MeasureThat.net]]\">>\n\n* [[UglifyJS|https://lisperator.net/uglifyjs/]] - //JavaScript parser / mangler / compressor / beautifier// - \u003C\u003C[ \"[[Git|https://github.com/mishoo/UglifyJS]]\">>\n** \u003C\u003Clinkdescgit \"UglifyJS 3: Online JavaScript minifier\" \"https://skalman.github.io/UglifyJS-online/\" \"JavaScript minifier in the browser\" \"https://github.com/Skalman/UglifyJS-online\">>\n* \u003C\u003Clinkdescgit de4js \"https://lelinhtinh.github.io/de4js\" \"JavaScript Deobfuscator and Unpacker\" \"https://github.com/lelinhtinh/de4js\">>\n\n* [[aaencode demo|https://utf-8.jp/public/aaencode.html]] --- //Encode any JavaScript program to Japanese style emoticons (^_^)//\n* [[jjencode demo|https://utf-8.jp/public/jjencode.html]] --- encode JS using limited symbols\n"}, +{"title":"JavaScript","created":"20221110145611678","creator":"Octt","modified":"20240130124051881","modifier":"Octt","tags":"Development $:/i18n:en Web","text":"''JavaScript'', or \"JS\", is an high-level programming language. It constitutes a core technology of the Web, sitting optionally alongside HTML and CSS. In recent years, it has gotten more and more popular even for desktop app and backend development.\n\n\u003C\u003C^wikipediaframe JavaScript>>\n\n* [[Ecma International TC39|https://tc39.es/]] - Committee maintaining JS specifications\n\n* [[aem1k|https://aem1k.com/]] --- //JavaScript Hacks and Creative Coding Created by Martin Kleppe aka @aemkei.// --- \u003C\u003C[# Git\"https://github.com/aemkei/aemkei.github.io\">>\n\n!!! ''Resources''\n\n* [[The Modern JavaScript Tutorial (javascript.info)|https://javascript.info/]] --- //How it's done now. From the basics to advanced topics with simple, but detailed explanations.//\n* \u003C\u003ChttpsL JavaScriptTutorial.net>> --- //helps you learn JavaScript programming from scratch quickly and effectively//\n\n* //''[[JSFuck|https://jsfuck.com/]]'' is an esoteric and educational programming style based on the atomic parts of JavaScript. It uses only six different characters to write and execute code.// --- \u003C\u003C[# Git+Guide \"https://github.com/aemkei/jsfuck\">>\n\n* [[Which equals operator (== vs ===) should be used in JavaScript comparisons?|https://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons]] (\"Good and bad twins\") --- `==` is bad unless explicitly needed, since it does type-coercion.\n** [[In theory === is faster, no type conversion takes place. Practically there's no performance difference.|https://stackoverflow.com/questions/12332855/which-javascript-equality-operator-or-is-faster]]\n** [[JavaScript-Equality-Table|https://dorey.github.io/JavaScript-Equality-Table/unified/]] - \u003C\u003C[ \"[[Git|https://github.com/dorey/JavaScript-Equality-Table]]\">>\n\n* [[Environment detection: node.js or browser|https://stackoverflow.com/a/57774317]]\n* [[Superpacking JS Demos|https://web.archive.org/web/20120919185414/http://daeken.com/superpacking-js-demos]]\n* [[\"Illegal invocation\" errors in JavaScript|https://mtsknn.fi/blog/illegal-invocations-in-js/]] --- //The error is thrown when calling a function whose `this` keyword isn't referring to the object where it originally did (when the context of the function is lost)//\n* [[Does JavaScript have a method like \"range()\" to generate a range within the supplied bounds?|https://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-a-range-within-the-supp]] --- `[...Array(5).keys()]`\n* [[Listen for triple clicks in JavaScript|https://stackoverflow.com/questions/6480060/how-do-i-listen-for-triple-clicks-in-javascript#6480113]]\n* [[Fastest method to escape HTML tags as HTML entities?|https://stackoverflow.com/questions/5499078/fastest-method-to-escape-html-tags-as-html-entities]] --- in the browser, `(html) => { var escape = document.createElement('textarea'); escape.textContent = html; return escape.innerHTML; }`\n* [[Get a random item from a JavaScript array|https://stackoverflow.com/questions/5915096/get-a-random-item-from-a-javascript-array#5915122]] : [[Getting a random value from a JavaScript array|https://stackoverflow.com/questions/4550505/getting-a-random-value-from-a-javascript-array]] --- `item = items[Math.floor(Math.random() * items.length)];`\n* [[Simplest code for array intersection in javascript|https://stackoverflow.com/questions/1885557/simplest-code-for-array-intersection-in-javascript#1885569]] --- `arrayNew = array1.filter(value => array2.includes(value));`\n* [[Why is 'for (... in ...)' with arrays considered bad practice in JavaScript?|https://stackoverflow.com/questions/2265167/why-is-forvar-item-in-list-with-arrays-considered-bad-practice-in-javascript]] --- use `for (... of ...)` to iterate for values, the `in` form should only be used to iterate over indices\n* [[Why is extending native objects a bad practice?|https://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice]] --- it breaks everything for some objects.\n** see [[https://eslint.org/docs/latest/rules/no-extend-native]]\n* [[What does ~~ (\"double tilde\") do in Javascript?|https://stackoverflow.com/questions/4055633/what-does-double-tilde-do-in-javascript]] ; [[What is the \"double tilde\" (~~) operator in JavaScript? [duplicate]|https://stackoverflow.com/questions/5971645/what-is-the-double-tilde-operator-in-javascript]] --- double NOT logical operator, useful shorter and faster alternative to `Math.floor` for small numbers\n* [[How to convert uint8 Array to base64 Encoded String?|https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/66046176#66046176]]\n* [[What is the JavaScript version of sleep()?|https://stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep#39914235]] --- `await new Promise(r => setTimeout(r, milliseconds));`\n* [[Convert letter to number in JavaScript|https://stackoverflow.com/questions/27877197/convert-letter-to-number-in-javascript]] (or parse a String that contains a number and happens to contain letters as a Number) --- \u003C\u003CMDNLink Web/JavaScript/Reference/Global_Objects/parseInt parseInt()>>\n* [[JavaScript Regex Replace Tutorial|https://www.javascripttutorial.net/javascript-regex/replace/]]\n\n* [[Send POST data using XMLHttpRequest|https://stackoverflow.com/questions/9713058/send-post-data-using-xmlhttprequest]]\n* [[fetch API [and comparison with XMLHttpRequest]|https://davidwalsh.name/fetch]]\n* [[How do I upload a file with the JS fetch API?|https://stackoverflow.com/questions/36067767/how-do-i-upload-a-file-with-the-js-fetch-api#comment98412965_36082038]] --- pass the `file` object to the body, do NOT set Content-Type header\n* [[How to Use Fetch with async/await|https://dmitripavlutin.com/javascript-fetch-async-await/]]\n\n* [[String indexOf()|https://www.w3schools.com/jsref/jsref_indexof.asp]]\n* [[Array.prototype.splice()|https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice]], [[JavaScript Array splice() (W3S)|https://www.w3schools.com/jsref/jsref_splice.asp]] --- //changes the contents of an array by removing or replacing existing elements and/or adding new elements in place//, useful alternative for a nonexistant remove function, with `.splice(index, amountToRemove)`\n* \u003C\u003CMDNLink Web/JavaScript/Reference/Global_Objects/Array/concat \"Array.prototype.concat()\">> --- //used to merge two or more arrays, does not change the existing arrays but instead returns a new one//\n* [[XMLHttpRequest|https://www.w3schools.com/xml/xml_http.asp]]\n** \u003C\u003CMDNLink Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests \"Synchronous and asynchronous requests\">>\n\n* \u003C\u003ChttpsL tixy.land>> --- //(t,i,x,y) => \"creative code golfing\"// --- \u003C\u003C[# Git\"https://github.com/aemkei/tixy\">>\n\n!!! ''Tools''\n\n* [[jsPerf|https://jsperf.app/]] - //online JavaScript performance benchmark// - \u003C\u003C[ \"[[Git|https://github.com/rd13/jsperf.app]]\">>\n** Old source code: [[v2|https://github.com/jsperf]], [[v1|https://github.com/mathiasbynens/jsperf.com]]\n* [[MeasureThat.net|https://www.measurethat.net/]] - //measure performance of JavaScript code// - \u003C\u003C[ \"[[Git|https://github.com/thecoderok/MeasureThat.net]]\">>\n\n* [[UglifyJS|https://lisperator.net/uglifyjs/]] - //JavaScript parser / mangler / compressor / beautifier// - \u003C\u003C[ \"[[Git|https://github.com/mishoo/UglifyJS]]\">>\n** \u003C\u003Clinkdescgit \"UglifyJS 3: Online JavaScript minifier\" \"https://skalman.github.io/UglifyJS-online/\" \"JavaScript minifier in the browser\" \"https://github.com/Skalman/UglifyJS-online\">>\n* \u003C\u003Clinkdescgit de4js \"https://lelinhtinh.github.io/de4js\" \"JavaScript Deobfuscator and Unpacker\" \"https://github.com/lelinhtinh/de4js\">>\n\n* [[aaencode demo|https://utf-8.jp/public/aaencode.html]] --- //Encode any JavaScript program to Japanese style emoticons (^_^)//\n* [[jjencode demo|https://utf-8.jp/public/jjencode.html]] --- encode JS using limited symbols\n"}, +{"title":"JavaScript HTML DOM API","created":"20240130123607678","creator":"Octt","modified":"20240130135809151","modifier":"Octt","tags":"JavaScript Web HTML","text":"Note that some of the following resources are still not copied from other pages.\n\n* [[HTML DOM Events|https://www.w3schools.com/jsref/dom_obj_event.asp]]\n* \u003C$let parentUrl=\"https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement\">\u003Ca href=\u003C\u003CparentUrl>>>HTMLInputElement\u003C/a>...\u003Cdiv>\n\n* \u003Ca href=`$(parentUrl)$/select`>select()\u003C/a> --- //selects all the text in a `\u003Ctextarea>` element or in an `\u003Cinput>` element that includes a text field.//\n\u003C/div>\u003C/$let>\n\n* [[How to get text from all descendents of an element (disregarding scripts)?|https://stackoverflow.com/questions/2532043/how-to-get-text-from-all-descendents-of-an-element-disregarding-scripts]]\n* [[Converting HTML string into DOM elements?|https://stackoverflow.com/questions/3103962/converting-html-string-into-dom-elements#3104237]] --- `doc = new DOMParser().parseFromString(htmlString, 'text/html')`\n* [[set doctype using javascript|https://stackoverflow.com/questions/21523487/set-doctype-using-javascript]]\n* [[Insert an element after another DOM element with JavaScript|https://attacomsian.com/blog/javascript-insert-element-after]] --- //`target.parentNode.insertBefore(elem, target.nextSibling)`//\n"}, {"title":"JavaScript/Frameworks","created":"20230429190756464","creator":"Octt","modified":"20231229012758540","modifier":"Octt","tags":"","text":"* ''[[Alpine.js|https://alpinejs.dev/]]'' - //Rugged, minimal\u003C\u003Cfnote \"15 attributes, 6 properties, 2 methods\">> framework for composing JavaScript behavior in the markup// - [[[Git|https://github.com/alpinejs/alpine]]]\n** [[HyperJS|https://js.hyperui.dev/]] - //Collection of Alpine JS components// - \u003C\u003C[ \"[[Git|https://github.com/markmead/hyperjs]]\">> \n* ''[[Electron|https://www.electronjs.org/]]'' - //Build cross-platform desktop apps with JavaScript, HTML, and CSS// - [[[Git|https://github.com/electron]]]\n* ''[[React|https://reactjs.org/]]'' - //Building UI-oriented apps with [[JSX|https://en.wikipedia.org/wiki/JSX_(JavaScript)]]// - [[[Git|https://github.com/facebook/react]]]\n** ''[[React Native|https://reactnative.dev/]]'' - //Compiling ReactJS apps to native ones// - [[[Git|https://github.com/facebook/react-native]]]\n* [[Preact|https://preactjs.com/]] --- //⚛️ Fast 3kB React alternative with the same modern API. Components & Virtual DOM.// --- \u003C\u003C[# Git\"https://github.com/preactjs\">>\n* ''[[Tauri|https://tauri.app/]]'' - //Use Rust to build desktop and mobile apps with a web frontend// - [[[Git|https://github.com/tauri-apps/]]]\n"}, -{"title":"JavaScript/Libraries","created":"20230429182925276","creator":"Octt","modified":"20240128184623406","modifier":"Octt","tags":"","text":"Note: some are still in [[Web/Development]]\n\n!!! ''Single-purpose''\n\n* [[FileSaver.js|https://github.com/eligrey/FileSaver.js]] --- //An HTML5 saveAs() FileSaver implementation//\n* `jsdom`: //JavaScript implementation of various web standards, for use with Node.js// --- \u003C\u003C[# Git \"https://github.com/jsdom/jsdom\">>\n* [[Axios|https://axios-http.com/]] --- //Promise based HTTP client for the browser and node.js// --- \u003C\u003C[# Git\"https://github.com/axios\">>\n** [[How to display response error message with axios|https://stackoverflow.com/questions/44385872/how-to-display-response-error-message-with-axios]] --- `try { ... } catch(err) { console.log(err.response.data.message) }`\n* [[cheerio|https://cheerio.js.org/]] --- //The fast, flexible & elegant library for parsing and manipulating HTML and XML.//\n\n!!! ''Do-all''\n\n* [[jQuery|https://jquery.com/]] --- //write less, do more// for general operations (has optional libraries for selectors and UI) --- \u003C\u003C[ \"[[Git|https://github.com/jquery]]\">>\n* [[Licia|https://licia.liriliri.io/]] - //utility library to get daily works done// - \u003C\u003C[ \"[[Git|https://github.com/liriliri/licia]]\">>\n* [[Lodash|https://lodash.com/]] - More modern fork of Underscore, useful for working with data objects - \u003C\u003C[ \"[[Git|https://github.com/lodash]]\">>\n* [[🐚 zx|https://google.github.io/zx/]] --- //A tool for writing better scripts//, it's like better sh scripting done via JavaScript. --- \u003C\u003C[# Git\"https://github.com/google/zx\">>\n\n!!! ''Polyfills''\n\nThese are for adding newer APIs to older browsers when making a webapp that uses them.\n\n* [[ECMAScript Shims|https://github.com/es-shims]] - Collection of compliant shims\n* [[core-js|https://github.com/zloirock/core-js]] - Pure JS Standard Library reimplementation\n* [[srcdoc-polyfill|https://github.com/jugglinmike/srcdoc-polyfill]] - //shim for the iFrame \"srcdoc\" attribute//\n* [[CSS Checkbox Hack|https://github.com/jamesl1001/checkbox-hack-polyfill]]\n* [[\u003Cdetails>|https://github.com/rstacruz/details-polyfill]]\n"}, +{"title":"JavaScript/Libraries","created":"20230429182925276","creator":"Octt","modified":"20240130163041628","modifier":"Octt","tags":"","text":"Note: some are still in [[Web/Development]]\n\n!!! ''Single-purpose''\n\n* [[FileSaver.js|https://github.com/eligrey/FileSaver.js]] --- //An HTML5 saveAs() FileSaver implementation//\n* `jsdom`: //JavaScript implementation of various web standards, for use with Node.js// --- \u003C\u003C[# Git \"https://github.com/jsdom/jsdom\">>\n* [[Axios|https://axios-http.com/]] --- //Promise based HTTP client for the browser and node.js// --- \u003C\u003C[# Git\"https://github.com/axios\">>\n** [[How to display response error message with axios|https://stackoverflow.com/questions/44385872/how-to-display-response-error-message-with-axios]] --- `try { ... } catch(err) { console.log(err.response.data.message) }`\n* [[DefiantJS|https://www.defiantjs.com/]] --- //provides the ability for you to build smart templates applicable on JSON structures, based upon proven & standardized technologies such as XSLT and XPath// (currently has some bugs, they can be accounted for in own code) --- \u003C\u003C[# Git \"https://github.com/hbi99/defiant.js\">>\n\n!!! ''Do-all''\n\n* [[jQuery|https://jquery.com/]] --- //write less, do more// for general operations (has optional libraries for selectors and UI) --- \u003C\u003C[ \"[[Git|https://github.com/jquery]]\">>\n** [[cheerio|https://cheerio.js.org/]] --- //The fast, flexible & elegant library for parsing and manipulating HTML and XML//, slimmer substitute for jQuery, works on Node\n* [[Licia|https://licia.liriliri.io/]] --- //utility library to get daily works done// --- \u003C\u003C[ \"[[Git|https://github.com/liriliri/licia]]\">>\n* [[Lodash|https://lodash.com/]] --- More modern fork of Underscore, useful for working with data objects ...supports \"[[Custom Builds|https://lodash.com/custom-builds]]\" that include only the functions you want --- \u003C\u003C[ \"[[Git|https://github.com/lodash]]\">>\n* [[🐚 zx|https://google.github.io/zx/]] --- //A tool for writing better scripts//, it's like better sh scripting done via JavaScript. --- \u003C\u003C[# Git\"https://github.com/google/zx\">>\n\n!!! ''Polyfills''\n\nThese are for adding newer APIs to older browsers when making a webapp that uses them.\n\n* [[ECMAScript Shims|https://github.com/es-shims]] - Collection of compliant shims\n* [[core-js|https://github.com/zloirock/core-js]] - Pure JS Standard Library reimplementation\n* [[srcdoc-polyfill|https://github.com/jugglinmike/srcdoc-polyfill]] - //shim for the iFrame \"srcdoc\" attribute//\n* [[CSS Checkbox Hack|https://github.com/jamesl1001/checkbox-hack-polyfill]]\n* [[\u003Cdetails>|https://github.com/rstacruz/details-polyfill]]\n"}, {"title":"johncena141:en","created":"20220923152137538","modified":"20230206111552176","modifier":"Octt","tags":"Gaming $:/i18n:en","text":"[[johncena141|https://github.com/jc141x]] (jc141) is specialized in the field of compiling and distributing free repacks of current PC games for GNU+Linux.\n\nBefore their arrival to the GNU+Linux gaming scene in 2020-2021, obtaining known-safe and working repacks of games for the platform was a challenge, with native Linux repacks being almost impossible to find and Windows ones often not working.\n\nIn just about a year, johncena141 has become the most trusted repacker among GNU+Linux gamers, by putting the focus of their work directly and exclusively on GNU+Linux, as well as proving transparency and efficiency in their operations."}, -{"title":"JSON","created":"20230202225750547","creator":"Octt","modified":"20230429224405395","modifier":"Octt","tags":"$:/i18n:en","text":"\u003C\u003C^WikipediaFrame JSON en>>\n\n* [[JSON Editor Online|https://jsoneditoronline.org]] + formatter, filterer, querier - \u003C\u003C[ \"[[Git|https://github.com/josdejong/jsoneditor]]\">>\n* [[JMESPath|https://jmespath.org/]] - cross-platform //query language for JSON// - \u003C\u003C[ \"[[Git|https://github.com/jmespath]]\">>\n"}, +{"title":"JSON","created":"20230202225750547","creator":"Octt","modified":"20240130162618573","modifier":"Octt","tags":"$:/i18n:en","text":"\u003C\u003C^WikipediaFrame JSON en>>\n\n* [[JSON Editor Online|https://jsoneditoronline.org]] + formatter, filterer, querier --- \u003C\u003C[ \"[[Git|https://github.com/josdejong/jsoneditor]]\">>\n* [[JMESPath|https://jmespath.org/]] --- cross-platform //query language for JSON// --- \u003C\u003C[ \"[[Git|https://github.com/jmespath]]\">>\n\n* [[XSLT equivalent for JSON|https://stackoverflow.com/questions/1618038/xslt-equivalent-for-json]]\n"}, {"title":"KDE:en","created":"20230130074356424","creator":"Octt","modified":"20230206111552179","modifier":"Octt","tags":"$:/i18n:en","text":"\u003C\u003CMediaWiki KDE en 3>>"}, {"title":"Keeping a KB","created":"20230217080132126","creator":"Octt","modified":"20230217081521659","modifier":"Octt","tags":"Octt","text":"I'm realizing that I'm doing everything kinda randomly, so it's probably good to define some points about keeping a personal knowledge base.\n\n; How are the others doing it?\n: It's good to find other personal wikis online, be they in Zettelkasten or tree form, and just browse them.\n: Is the TiddlyWiki-Zettelkasten method actually the best for me?\n: Who mantains paper-based personal wikis and why? Are others doing non-Zettelkasten paper wikis?\n\n; Defining objectives\n: What is the pratical reason of the KB?\n: Why keep one at all, instead of just a personal classic-style website for archiving and sharing complex information + simple and fast bookmarks for simple links?\n\n; Avoiding deviations?\n: With a digital system, which has full-text search, manually organizing information is wasting time if overdone.\n: Don't ever think for more than a few seconds on how to format something... Is this a good idea or can it make so knowledge is harder to absorb in the future (e.g. due to inconsistencies).\n: Is defining, once and for all, an efficient and fast modus operandi for everything, that covers everything, and then applying it mechanically every time, a good idea?\n"}, {"title":"Kernel postinst issue on Linux Mint","created":"20230816223835858","creator":"Octt","modified":"20230817225824818","modifier":"Octt","tags":"Linux","text":"The other day I got my Linux Mint system not booting anymore. I suspected this was due to [[my custom script|$:/Linux/Scripts/UpdateEfiBoot]] I placed in `/etc/kernel/postinst.d/` that is needed to copy the latest kernel in my EFI partition after an APT update, to allow boot via efistub bypassing grub. Maybe an unattended upgrade of my kernel failed.\n\nAfter manually fixing the EFI partition to boot again in the system, I tried manually to run `apt upgrade`, and saw that my postinst script threw an error due to not finding one of the files to copy from `/boot` to `/boot/efi`.\n\nAfter a quick web search, I saw that files in `/etc/kernel/postinst.d` should be numbered as they get run in the proper order by run-parts. I did `ls` on the directory where I've put my script to be certain that it was the very last, and actually it wasn't.\n\n```\n$ ls\ndkms\ninitramfs-tools\npm-utils\n---> UpdateEfiBoot \u003C--- My script\nxx-update-initrd-links\nzz-shim\nzz-update-grub\n```\n\nThis was ugly to fix since, as seen in this list, my distro's mantainers are geniuses and decided to get rid of numbers, and instead prefer to just use alphabetical ordered naming, falling back to ugly letter suffixes when that plan failed. I renamed my script from `UpdateEfiBoot` to `zzz-UpdateEfiBoot`, thus making it appear at the end of an alphabetical listing and sure enough that fixed the issue: running `apt upgrade` again completed the update without errors and my script did its job.\n"}, @@ -1328,8 +1332,8 @@ {"title":"Minesweeper","created":"20230111223018169","creator":"Octt","icon":"💣","modified":"20230919064930208","modifier":"Octt","page-cover":"https://plus.unsplash.com/premium_photo-1668046490523-6f4e603d446c","tags":"Puzzle $:/i18n:en Game Generic $:/Games","text":"\u003C\u003C^wikipediaframe \"Minesweeper (video game)\" en>>\n\n* [[Antimine|https://github.com/lucasnlm/antimine-android]] --- //open source minesweeper-like puzzle game for Android//\n\n!!! ''Gamin' Time''\n\n\u003C\u003CiFrameFixed \"https://vuesweeper.netlify.app\">>\n\n!! ''Paper Minesweeper''\n\n* https://www.gmpuzzles.com/blog/minesweeper-rules-and-info/\n* https://www.puzzle-book.co.uk/minesweepers-puzzle-book.php\n** http://www.clarity-media.co.uk/online-puzzles/sample-minesweeper-puzzle.php\n"}, {"title":"Minigame","created":"20231119163134278","creator":"Octt","modified":"20231119163812997","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Minigame>>\n\n* See [[Microgame|https://www.mariowiki.com/Microgame]] for the WarioWare kind\n** [[Dumb Ways to Die|https://www.dumbwaystodie.com/]], mobile microgames collection with minimalist graphics\n*** HTML5 builds playable: [[Original (1)|https://www.crazygames.com/game/dumb-ways-to-die-original]], [[2|https://www.crazygames.com/game/dumb-ways-to-die-2-the-games]]\n** [[NitorInc.: Touhou Microgames collaborative project|https://nitorincmicro.games/]] --- //Fast-paced, crazy fun microgames with your favorite Touhou characters! And YOU can help make them!// --- \u003C\u003C[# Git\"https://github.com/NitorInc\">>\n"}, {"title":"MIPS","created":"20231123184226189","creator":"Octt","modified":"20240130004109754","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"MIPS architecture\">>\n\n* [[MIPS Assembly (Wikibooks)|https://en.wikibooks.org/wiki/MIPS_Assembly]]\n* [[MIPS Reference Sheet|https://uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf]]\n* [[Jarrett Billingsley's Computer Organization & Assembly Materials|https://jarrettbillingsley.github.io/teaching/classes/cs0447/materials]] including MIPS pages\n* [[Abdelrahman Nasr's MIPS cheatsheet|https://t1m3m.github.io/posts/MIPS-cheatsheet/]]\n\n* [[Mipsdis: MIPS disassembler in the browser|https://blog.loadzero.com/blog/announcing-mipsdis/]] --- \u003C\u003C[# Demo\"https://blog.loadzero.com/demo/mipsdis/demo.html\">> \u003C\u003C[# Git\"https://github.com/loadzero/mipsdis\">>\n\n* [[represent a struct in mips32|https://stackoverflow.com/questions/60112137/represent-a-struct-in-mips32]] --- after analyzing the C struct declaration to understand how many bytes it requires, //a good idea here would be to allocate some `.space`//, e.g. `theStruct:\n .align 2 # MIPS needs word alignment\n .space 16 # Size of struct`, then use with `la $register,theStruct`\n* [[MIPS - Call C function in Assembly code|https://stackoverflow.com/questions/36980971/mips-call-c-function-in-assembly-code]] --- write values to stack if necessary, declare `.extern CFunctionName` in the ASM, use `jal CFunctionName` to call\n* [[MIPS function call with more than four arguments|https://stackoverflow.com/questions/2298838/mips-function-call-with-more-than-four-arguments]] --- first allocate stack memory (subtract 4*numberOfArguments to `sp`), then load the first 4 arguments normally in `$a#` registers, and store the others in `4*argumentNumber($sp)`\n* [[Why shift a bit using sll and such in MIPs Assembly?|https://stackoverflow.com/questions/32487502/why-shift-a-bit-using-sll-and-such-in-mips-assembly]] (and what actually shifting does)\n"}, -{"title":"Mirror's Edge","created":"20230129163138871","creator":"Octt","modified":"20230301121014329","modifier":"Octt","tags":"$:/i18n:en Game Proprietary","text":"\u003C\u003C^wikipediaframe \"Mirror's Edge\" en>>\n\n; What I like\n: Fast pacing mixed with parkour platforming and close-combat mechanics, gives you adrenaline.\n: The first game is more saturated, the second has more realistic graphics, however they are both very colorful.\n: Haven't played the first enough, but I can say the second is extremely immersive, even on a ~20\" 1360x768 monitor at mid details.\n"}, -{"title":"Misskey","created":"20221202225134930","creator":"Octt","modified":"20231112001653635","modifier":"Octt","tags":"Fediverse","text":"\u003C\u003C^wikipediaframe Misskey>>\n\n[[Misskey|https://misskey-hub.net/en]] is an open, semi-decentralized social media platform. Decentralization is founded on the [[ActivityPub|ActivityPub]] protocol.\n\n* [[https://github.com/misskey-dev]]\n\n[img[https://raw.githubusercontent.com/misskey-dev/misskey/develop/assets/title_float.svg]]\n"}, +{"title":"Mirror's Edge","created":"20230129163138871","creator":"Octt","modified":"20240130163630610","modifier":"Octt","tags":"$:/i18n:en Game Proprietary","text":"\u003C\u003C^wikipediaframe \"Mirror's Edge\" en>>\n\n; What I like\n: Fast pacing mixed with parkour platforming and close-combat mechanics, gives you adrenaline.\n: The first game is more saturated, the second has more realistic graphics, however they are both very colorful.\n: Haven't played the first enough, but I can say the second is extremely immersive, even on a ~20\" 1360x768 monitor at mid details.\n"}, +{"title":"Misskey","created":"20221202225134930","creator":"Octt","modified":"20240130152333354","modifier":"Octt","page-cover":"https://raw.githubusercontent.com/misskey-dev/misskey/develop/assets/title_float.svg","tags":"Fediverse","text":"\u003C\u003C^wikipediaframe Misskey>>\n\n[[Misskey|https://misskey-hub.net/en]] is an open, semi-decentralized social media platform. Decentralization is founded on the [[ActivityPub|ActivityPub]] protocol.\n\n* [[https://github.com/misskey-dev]]\n* [[藍: Misskey Artworks (Miss Ai)|https://xn--931a.moe/]]\n"}, {"title":"Miyoo","created":"20230130081721859","creator":"Octt","modified":"20230130081735692","modifier":"Octt","tags":"TODO"}, {"title":"Mobile Games","created":"20230206114218720","creator":"Octt","modified":"20230206211419055","modifier":"Octt","tags":"Gaming","text":"List of some mobile games to keep in mind.\n\n* Angry Birds\n* Jetpack Joyride\n* krassesSpiel\n* Subway Surfers\n* Temple Run\n* Zombie Tsunami"}, {"title":"Modding","created":"20230209151140437","creator":"Octt","modified":"20230209151240604","modifier":"Octt","tags":"","text":"\u003C\u003CMediaWiki Modding en 1>>"}, @@ -1356,7 +1360,7 @@ {"title":"Nintendo Switch","created":"20220925130302833","creator":"Octt","modified":"20231210220557478","modifier":"Octt","tags":"Nintendo Gaming NX Console","text":"''Nintendo Switch'' is a family of portable game consoles created by [[Nintendo|Nintendo]]. It is notorius for being made of [[papier-mâché|Papier-mâché]], essentially suffering from a variety of structural problems.\n\n\u003C\u003Cibox \"https://i.ytimg.com/vi_webp/Cb-srOfRqNc/maxresdefault.webp\" \"https://youtu.be/Cb-srOfRqNc\">>\n\nThe console's introduction was hyped due to it being the first ever Nintendo console to be created with both home and portable use in mind. The name itself comes from the fact that the console can //switch//, from being connected to a TV to being able to be used standalone.\n\n!!! Misc\n\n* [[Internet Browser [Switchbrew]|https://switchbrew.org/wiki/Internet_Browser]]\n** Apparently from FW 10.0, Nintendo being corporate shitlords added a [[Browser Timeout: \"This Screen will be closed.\"|https://browsedns.net/topic/25/browser-timeout-this-screen-will-be-closed]]\n\n!!! ''Emulators''\n\n* [[Yuzu|https://yuzu-emu.org/]] --- //experimental open-source Switch emulator from the creators of Citra// --- \u003C\u003C#[ Git \"https://github.com/yuzu-emu\">>\n* [[Ryujinx|https://ryujinx.org/]] --- //simple, experimental Nintendo Switch emulator// --- \u003C\u003C[# Git \"https://github.com/Ryujinx\">>\n* [[Skyline|https://skyline-emu.one/]] --- //Run Nintendo Switch homebrew & games on your Android device!// --- \u003C\u003C[# Git \"https://github.com/skyline-emu\">>\n** Abandoned due to the developers' irrational fear of a Nintendo takedown (in my view they were just tired of mantaining the project and didn't want to take the bad press of a standard resign, this was just an excuse to abandon the project... but at least it's open-source)\n** A slow-going fork has apparently started: [[Strato|https://github.com/strato-emu/strato]]\n\n!!! ''Homebrew, Tools, Hacks''\n\n* Alternative OSes: [[Ubuntu]] and [[LineageOS]] by ''[[switchroot|https://switchroot.org/]]''\n* Custom Firmware: The real best today is [[Atmosphère-NX|https://github.com/Atmosphere-NX]] + related libs.\n* Signature patches (needed to run unsigned NSPs, aka homebrew NSPs or pirated games): \u003C\u003C[ \"[[WiiDatabase|https://wiidatabase.de/switch-downloads/hacks/signatur-patches/]]\">> \u003C\u003C[ \"[[Hackintendo|https://hackintendo.com/download/sigpatches/?PageSpeed=noscript]]\">> \u003C\u003C[ \"[[ShadowOne333|https://gbatemp.net/threads/sigpatches-for-atmosphere-hekate-fss0-fusee-package3.571543/]]\">>. They were provided by various developers who want to remain mostly anonymous, and they are mostly compiled together by ITotalJustice.\n\n* \u003C\u003Clinkdesc nsz \"https://github.com/nicoboss/nsz\" \"Homebrew compatible NSP/XCI compressor/decompressor\">>\n\n* [[Goldleaf|https://gbatemp.net/download/goldleaf-nintendo-switch-title-installer-manager.35430/]] --- //🍂 Multipurpose homebrew tool for Nintendo Switch// --- \u003C\u003C[# Git \"https://github.com/XorTroll/Goldleaf\">>\n* [[Tinleaf|https://github.com/blawar/tinleaf]] --- //No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch// (forked from [[Awoo Installer|https://github.com/Huntereb/Awoo-Installer]] without the furry crap) --- \u003C\u003C[# Thread \"https://gbatemp.net/threads/tinleaf-installer-a-no-bullshit-no-bullshit-nsp-nsz-xci-xcz-installer.559892/\">>\n\n!!! Development\n\n* [[SwitchBrew Wiki|https://switchbrew.org/wiki/Main_Page]]\n** [[switchbrew/switch-examples|https://github.com/switchbrew/switch-examples]] --- //Switch examples for devkitA64 and libnx//\n"}, {"title":"Nitter:en","created":"20230110214847556","modified":"20230206111552254","modifier":"Octt","tags":"Internet $:/i18n:en","text":"''[[Nitter|https://github.com/zedeus/nitter]]'' is a free and open source alternative [[Twitter|Twitter:en]] front-end focused on privacy and performance.\n\nQuoting from the project's README:\n\n\u003C\u003C\u003C\nInspired by the Invidious project.\n\n* No JavaScript or ads\n* All requests go through the backend, client never talks to Twitter\n* Prevents Twitter from tracking your IP or JavaScript fingerprint\n* Uses Twitter's unofficial API (no rate limits or developer account required)\n* Lightweight (60KB vs 784KB from twitter.com)\n* RSS feeds\n* Themes\n* Mobile support (responsive design)\n* AGPLv3 licensed, no proprietary instances permitted\n\u003C\u003C\u003C\n"}, {"title":"Nix","created":"20230302114148119","creator":"Octt","modified":"20230302114846402","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Nix (package manager)\">>\n\n* [[Zero to Nix|https://zero-to-nix.com/]] - //An unofficial, opinionated, gentle introduction to Nix//\n* \u003C\u003CYouTubeL 2L2qHfNnXB4 \"NixOS: a sales pitch\">> - A 20-minutes introduction from the ground-up to Nix and [[NixOS]].\n"}, -{"title":"Node.js","created":"20230207185346822","creator":"Octt","modified":"20231213001702461","modifier":"Octt","tags":"JavaScript","text":"\u003C\u003C^wikipediaframe Node.js>>\n\n!!! ''Resources''\n\n* [[Node.js check if path is file or directory|https://stackoverflow.com/a/43701801]]\n* [[How to copy files and folders in Node.js?|https://javascript.plainenglish.io/how-to-copy-files-and-folders-in-node-js-e37394fdf4c0]] --- //Multiple ways to copy files in Node.js//\n\n; Docs\n: [[Node.js HTTP Module|https://www.w3schools.com/nodejs/nodejs_http.asp]]\n\n; Libraries\n: [[ink|https://github.com/vadimdemedes/ink]] - //🌈 React for interactive command-line apps//\n"}, +{"title":"Node.js","created":"20230207185346822","creator":"Octt","modified":"20240130143901325","modifier":"Octt","tags":"JavaScript","text":"\u003C\u003C^wikipediaframe Node.js>>\n\n!!! ''Resources''\n\n* [[Node.js check if path is file or directory|https://stackoverflow.com/a/43701801]]\n* [[How to copy files and folders in Node.js?|https://javascript.plainenglish.io/how-to-copy-files-and-folders-in-node-js-e37394fdf4c0]] --- //Multiple ways to copy files in Node.js//\n* [[How To Get the MIME Type of a File in Node.js|https://dev.to/victrexx2002/how-to-get-the-mime-type-of-a-file-in-nodejs-p6c]]\n\n; Docs\n: [[Node.js HTTP Module|https://www.w3schools.com/nodejs/nodejs_http.asp]]\n\n; Libraries\n: [[ink|https://github.com/vadimdemedes/ink]] - //🌈 React for interactive command-line apps//\n"}, {"title":"NodeMCU:en","created":"20230203222119146","creator":"Octt","modified":"20230206111552260","modifier":"Octt","tags":"MCU $:/i18n:en","text":"\u003C\u003CMediaWiki NodeMCU en 1>>\n\n* https://www.nodemcu.com/index_en.html"}, {"title":"Nokia","created":"20230302113045494","creator":"Octt","modified":"20230305000826195","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Nokia>>\n\n!!! ''News''\n\n; February 2023\n: [[Nokia launches DIY repairable budget Android phone|https://www.theguardian.com/technology/2023/feb/25/nokia-launches-diy-repairable-budget-android-phone]] - [\u003C\u003CYoutubeL Y6EovOcblIM \"Analysis by Louis Rossmann\">>] \u003Cdd>\nNokia G22 has removable back and standard screws allowing battery swap in less than five minutes at home\n\u003C/dd>\n"}, {"title":"Nonogram","created":"20230111120518929","creator":"Octt","modified":"20230927231246694","modifier":"Octt","tags":"Puzzle $:/i18n:en Game Generic Digital Analog $:/Games","text":"\u003C\u003C^wikipediaframe Nonogram en >>\n\nPrintables:\n\n* \u003C\u003ChttpL www.nonograms.org>>\n* [[https://www.printable-puzzles.com/printable-numbergrid-puzzles.php]]\n\n!! ''Gamin' Time''\n\n\u003C\u003CiFrameFixed \"https://jokude.github.io/react-nonogram\">>\n\n!! ''Software Implementations''\n* \u003C\u003ChttpL Nonogram.com>>\n"}, @@ -1365,7 +1369,7 @@ {"title":"NumWorks","created":"20230202110151955","creator":"Octt","modified":"20231223223656445","modifier":"Octt","tags":"$:/i18n:en Calculator","text":"* https://www.numworks.com/\n* https://github.com/numworks\n\n\u003C\u003C^wikipediaframe NumWorks en>>\n\n* [[Numworks Hacks Guide|https://guide.getomega.dev/]]\n* [[Omega|https://getomega.dev/]] Custom Firmware, abandoned --- \u003C\u003C[ \"[[Git|https://github.com/Omega-Numworks]]\">>\n** ... including [[Phi|https://phi.getomega.dev/]], //jailbreak for the Numworks calculator with Epsilon 16 and higher. It brings back custom firmwares.//\n** [[Upsilon|https://getupsilon.web.app/]] --- CFW forked from Omega and mantained --- \u003C\u003C[ \"[[Git|https://github.com/UpsilonNumworks]]\">>\n\n* [[Nwagyu|https://www.nwagyu.com/]] --- //Collection of free nwa apps that you can install on your NumWorks calculator//\n* [[Templates to Plot Functions, Parametric Equations, and Sequences|https://edspi31415.blogspot.com/2021/01/numworks-templates-to-plot-functions.html]]\n* [[Version 16 bêta : verrouillage NumWorks anti Omega / KhiCAS|https://tiplanet.org/forum/viewtopic.php?t=24968&p=261770&lang=en#p261770]]\n"}, {"title":"Octt","caption":"Me","created":"20230206204149478","creator":"Octt","icon":"😼","modified":"20231105222046315","modifier":"Octt","tags":"$:/ToC","text":"''Octt'', aka ''OctoSpacc'', or ''Andrea'', is me, the living entity who primarily maintains the [[OcttKB]]. I am powered by a natural neural network running on a meat machine, in case that wasn't obvious, but I plan of making a copy (or multiple?) of myself that will live in silicon machines.\n\nSome info about me should go here, I suppose, so here are some points:\n\n* I can program enough things in [[vanilla JavaScript|JavaScript]], [[Python]], `sh`, [[C|C Language]] and some [[Java]], and [[TiddlyWiki]] (wow). I will also say: I can program with HTML and CSS, just to make you cry with \"they're not programming languages!!1!\".\n** I've had to use C++, well I hate it. Never had to use Rust, and I'm happy because that syntax //scares me//.\n* I can solve some puzzle games (very little in the grand scheme of all puzzles of this world, but still fun) and play some card games, they fun sometimes.\n* Here is my [[#ShowYourStripes|https://showyourstripes.info/l/europe/italy/all/]] if you're curious --- aka the climate change situation also where I live.\n\nAfter this, there's not a lot more info about me here for now. Tough luck. Maybe go read the about page on my [[sitoctt]] in the meantime, there's something more in there: [[https://sitoctt.octt.eu.org/Chi-Sono.html]].\n\nHere are some things I like or do or whatever, that I'm putting here honestly just to get some tiddlers connected together, because I like graphs like the ''Focus'' one on the sidebar.\n\n* Graphs.. I just said I like them. Some others are at [[OcttKB/Data]].\n* [[Gaming]], but I have special tastes probably.\n** This not only includes videogames, but also puzzle games.\n** [I should write my best picks here...]\n* [[Writing]], like on my [[sitoctt]] or here.\n* Software [[Development]], mostly frontend ([[CSS]] is crappy but epic).\n** My [[Web]] places wouldn't be as unique if this wasn't the case and I were to only write content.\n"}, {"title":"OcttKB","created":"20220920160811383","creator":"Octt","icon":"🐙","modified":"20240128002941990","modifier":"Octt","page-cover":"https://source.unsplash.com/random?inkling,octopus","tags":"$:/ToC $:/i18n:en Octt","text":"!! Welcome to my Personal {[[Personal Knowledge Base]] \\ Public Notebook}!\n\nGeneral information about the site will soon be available. Licensing information is available [[here|OcttKB/Licensing]]. This is \"OcttKB\" because I'm [[Octt]]. With this thing, I'm [[learning and thinking in public|https://www.swyx.io/learn-in-public]].\n\n\u003C!--\nApart from the usual [[TiddlyWiki]] ones, there are many methods of navigation on this wiki. For one, try clicking on the big name line on top of of this [[OcttKB]] tiddler.\n-->\n\n!!! ''Tips''\n* Click on tag pills, often as present on top of a tiddler frame, just below the title, to navigate to all tiddlers that are tagged with that tag.\n** Unlike with folders, a tiddler can have many tags at the same time, allowing for non-linear navigation.\n* Click on different parts of the title of an open tiddler to navigate between children, both in a folder-like structure (other tiddlers present as path children of the current one, thanks to slash (`/`) separation), and with the tag structure (tiddlers tagged with the name of the current one).\n\n!!! ''Table of Contents''\n{{$:/OcttKB/ToC}}\n{{$:/OcttKB/WikiThings}}\n\n!!! ''External Links''\n\n; ''My Hub'', Global Home Page: [[Hub.Octt.EU.org|https://hub.octt.eu.org]]\n: Links to my blogs, webapps, and social profiles or places\n\n* ''KB Git Repo'' (deploy scripts, + limited commit history): [[GitLab.com/octtspacc/OcttKB|https://gitlab.com/octtspacc/OcttKB]]\n** Mirrors (''don't send issues/PRs'' there): [[GitHub.com|https://github.com/octospacc/OcttKB]] | [[Gitea.it|https://gitea.it/octospacc/OcttKB]]\n\n* ''Public Statistics'': [[https://octtkb.goatcounter.com/]]\n\n//\u003Csmall>Note: The KB is also served in plain, unencrypted HTTP at the `http` 5th-level subdomain: `http://http.kb.octt.eu.org`.\u003C/small>//\n\n!!! ''Other Wiki Things''\n\nI have made the following into links as they were making this tiddler very laggy, to the point of causing hanging issues on my mobile. Hold thight when opening them (if you're using the JavaScript-rich app, otherwise you're golden).\n\n* [[All Tiddlers|$:/OcttKB/AllTiddlers]]\n* [[Tag Cloud|$:/OcttKB/TagCloud]]\n\n\u003Chr>\n\n(Partial) [[Copyright © 2022, OctoSpacc|OcttKB/Licensing]] || OcttKB is powered by [[TiddlyWiki|TiddlyWiki]].\n\n\u003Csmall>//As with any TiddlyWiki, you can make your own changes right here and save them locally for yourself.//\u003C/small>"}, -{"title":"OcttKB/Data","created":"20230109220804304","creator":"Octt","modified":"20240129095852920","modifier":"Octt","tags":"OcttKB $:/i18n:en","text":"\u003C!--\n!! Clouds!\n\nAre these useless? ''Yes!'' But they are so pretty...\n\n{{$:/OcttKB/TagCloud}}\n--->\n\n\u003Cdiv style=\"height: 200px; max-width: 800px; margin: auto;\">\n\u003C$echarts $tiddler=\"$:/plugins/Gk0Wk/echarts/addons/GitHubHeatMap.js\" $width=\"100%\" $height=\"100%\" />\n\u003C/div>\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\n\u003Cdiv class=\"my-8\">\n\u003Cdiv class=\"dark:hidden\">\n\u003C$echarts $tiddler=\"$:/addon/sevenday.js\" $theme='light' days=60 title=\"最近文章数量\"/>\n\u003C/div>\n\u003C/div>\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\n\u003Cdiv class=\"NoSelect PIP-Select\">\n \u003C!--\n \u003Cspan>PIP (WIP): \u003C/span>\n \u003Cinput type=\"radio\" class=\"Radio-Btn PIP-Select\" name=\"PIP-20230202-2637\" value=\"↗️\" />\n \u003Clabel>↗️\u003C/label>\n \u003Cinput type=\"radio\" class=\"Radio-Btn PIP-Select\" name=\"PIP-20230202-2637\" value=\"↘️\" />\n \u003Clabel>↘️\u003C/label>\n \u003Cinput type=\"radio\" class=\"Radio-Btn PIP-Select\" name=\"PIP-20230202-2637\" value=\"❎\" checked=\"true\" />\n \u003Clabel>❎\u003C/label>\n -->\n \u003C!-- \u003Cdiv> -->\n {{$:/OcttKB/TheBrain/Levels.cfg}}\n {{$:/OcttKB/TheBrain/Tiddler-Manual.wgt}}\n \u003C!-- \u003C/div> -->\n\u003C/div>\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\n\u003C$echarts $tiddler=\"$:/plugins/Gk0Wk/echarts/addons/TagCloud.js\" />\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\nI still have to put a lot of stuff here... see [[OcttKB/WIP]]"}, +{"title":"OcttKB/Data","created":"20230109220804304","creator":"Octt","modified":"20240130121203024","modifier":"Octt","page-cover":"https://source.unsplash.com/random?data","tags":"OcttKB $:/i18n:en","text":"\u003C!--\n!! Clouds!\n\nAre these useless? ''Yes!'' But they are so pretty...\n\n{{$:/OcttKB/TagCloud}}\n--->\n\n\u003Cdiv style=\"height: 200px; max-width: 800px; margin: auto;\">\n\u003C$echarts $tiddler=\"$:/plugins/Gk0Wk/echarts/addons/GitHubHeatMap.js\" $width=\"100%\" $height=\"100%\" />\n\u003C/div>\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\n\u003Cdiv class=\"my-8\">\n\u003Cdiv class=\"dark:hidden\">\n\u003C$echarts $tiddler=\"$:/addon/sevenday.js\" $theme='light' days=60 title=\"最近文章数量\"/>\n\u003C/div>\n\u003C/div>\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\n\u003Cdiv class=\"NoSelect PIP-Select\">\n \u003C!--\n \u003Cspan>PIP (WIP): \u003C/span>\n \u003Cinput type=\"radio\" class=\"Radio-Btn PIP-Select\" name=\"PIP-20230202-2637\" value=\"↗️\" />\n \u003Clabel>↗️\u003C/label>\n \u003Cinput type=\"radio\" class=\"Radio-Btn PIP-Select\" name=\"PIP-20230202-2637\" value=\"↘️\" />\n \u003Clabel>↘️\u003C/label>\n \u003Cinput type=\"radio\" class=\"Radio-Btn PIP-Select\" name=\"PIP-20230202-2637\" value=\"❎\" checked=\"true\" />\n \u003Clabel>❎\u003C/label>\n -->\n \u003C!-- \u003Cdiv> -->\n {{$:/OcttKB/TheBrain/Levels.cfg}}\n {{$:/OcttKB/TheBrain/Tiddler-Manual.wgt}}\n \u003C!-- \u003C/div> -->\n\u003C/div>\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\n\u003C$echarts $tiddler=\"$:/plugins/Gk0Wk/echarts/addons/TagCloud.js\" />\n\n\u003Cbr/>\u003Chr/>\u003Cbr/>\n\nI still have to put a lot of stuff here... see [[OcttKB/WIP]]"}, {"title":"OcttKB/Hacks","created":"20220920160642961","creator":"Octt","modified":"20230219103824938","modifier":"Octt","tags":"TiddlyWiki OcttKB $:/i18n:en","text":"; Macros\n: \u003C\u003Cdirtreelist $:/Macros>>\n\u003C!-- > \u003C\u003CTDirList $:/Macros 4>> -->\n\n; Theming\n: \u003C\u003Cdirtreelist $:/Styles>>\n: [[$:/palettes/Octt Light]]\n\u003C!-- > \u003C\u003CTDirList $:/Styles 4>> -->\n\n!!! Modified system and plugin files\n\n; $:/StaticBanner\n: (Shown as banner in statically exported pages)\n\n; $:/core/templates/static.content\n: (Shown as static HTML content in the standard TiddlyWiki file)\n\n; $:/core/templates/exporters/StaticRiver\n: (Added meta viewport for correct viewing on mobile) [[[Pull Request|https://github.com/Jermolene/TiddlyWiki5/pull/6953]]]\n\n; $:/plugins/kookma/refnotes/ui/bibtexlibrary\n: Remove this applet from the sidebar since I don't use it\n\n\u003C!--\n* ~~$:/themes/tiddlywiki/vanilla (Changed paddings)~~\n-->"}, {"title":"OcttKB/Index","caption":"Index","created":"20230109112202970","creator":"Octt","list-before":"$:/core/ui/SideBar/Open","modified":"20231105104112366","modifier":"Octt","tags":"$:/tags/SideBar","text":"{{$:/OcttKB/StartButton}}\n\n{{$:/OcttKB/ToC}}\n\n{{$:/OcttKB/WikiThings}}\n\n{{$:/OcttKB/LicensingButtons}}\n\n\u003Cdiv style=\"margin-top: 16px\">\n''Last edit at'' {{$:/OcttKB/LastEditTime}} \u003C\u003C#[ Activity \"https://gitlab.com/octtspacc/OcttKB/-/commits\">>\n\u003C/div>"}, {"title":"OcttKB/Licensing","created":"20220924173239034","creator":"Octt","modified":"20230206113209759","modifier":"Octt","tags":"OcttKB Legal $:/i18n:en","text":"All my //original content// on this website, unless where otherwise specified, is licensed under [[CC BY-SA 4.0|Creative Commons/BY-SA 4.0:en]].\n\nIt is a [[free culture]] license that promotes the benefits of making information available for anyone to learn from and build upon. However, be sure to know its terms before doing anything other than just consuming the site!\n\nYou can easily recognize which of the directly hosted (entirely contained in a //tiddler// itself, like text, string-encoded files, or standalone files in the file system) content is my original creation: it's anything that features no indication of source or license.\n\nUnless I forget to do so in specific instances, I always credit the source and/or specify the original license for anything upon which I don't hold 100% of the rights (even public domain content) and is a straight copy. I may not do so if the content in question is not directly copied //into// my site, but instead embedded from a Web space which is the property of another entity - in which case, a clickable link directing to the source will be present; if not, you can click the pencil-shaped (edit) button to read the source code for a specific //tiddler//, to discover possible external embed URLs.\n\nThe above is valid for all //content tiddlers// (those whose name does not start with `$:/`) and all //system tiddlers// created by me (not part of standard [[TiddlyWiki|TiddlyWiki]] or any of my [[installed plugins|$:/core/ui/ControlPanel/Plugins]]).\n\n//Non-original system tiddlers// which I never touched, obviously fall under their own license; but, for simplicity of operations, as well as to avoid accidentally claiming ownership on code not written by me, I hereby explicitly give away my copyright for //non-original system tiddlers// that I modified from their original state. This means you can consider those as always falling under their original license, even if I touched them; From another point of view, you can effectively consider any //diff// generated between the original version of a //system tiddler// and my modified version of the same file as falling under public domain.\n\n{{$:/OcttKB/LicensingButtons}}"}, @@ -1375,7 +1379,7 @@ {"title":"OpenVPN","created":"20230213172417684","creator":"Octt","modified":"20230823233016191","modifier":"Octt","tags":"VPN Libre","text":"\u003C\u003C^wikipediaframe OpenVPN en>>\n\n* https://openvpn.net/\n* https://github.com/OpenVPN\n* [[Android]] Client: [\u003C\u003CFDroidLink de.blinkt.openvpn>>] [\u003C\u003CGPlayLink de.blinkt.openvpn>>] [[[Git|https://github.com/schwabe/ics-openvpn]]]\n\n* [[OpenVPN for Docker|https://github.com/lisenet/docker-openvpn]] --- [[lisenet/openvpn|https://hub.docker.com/r/lisenet/openvpn]]\n** [[HowTo on old repo: README.md|https://github.com/kylemanna/docker-openvpn/blob/master/README.md#quick-start]]\n"}, {"title":"Optical disc","created":"20230217075315783","creator":"Octt","modified":"20230217075836498","modifier":"Octt","tags":"Light","text":"\u003C\u003C^wikipediaframe \"Optical disc\">>\n\n* \u003C\u003CYouTubeL Jw8-sbcvtiA \"Business card CD DIY - NES classic compilation on Playstation one (PSX) in form of credit card\">>\n"}, {"title":"Oracle VirtualBox","created":"20230605213202506","creator":"Octt","modified":"20230605213648753","modifier":"Octt","tags":"[[Virtual Machine]]","text":"* https://www.virtualbox.org/\n\n\u003C\u003C^wikipediaframe VirtualBox>>\n\n* [[I hid the menu bar in VirtualBox, how to show it again?|https://superuser.com/a/1176589]]: //Open virtual machine's settings, then User Interface page...//\n** If this doesn't immediately work, it must be tried various times, settings closed, and again until it works.\n"}, -{"title":"Palette","created":"20230227073605348","creator":"Octt","modified":"20230227074002723","modifier":"Octt","tags":"Color","text":"\u003C\u003C^wikipediaframe \"Color scheme\" en>>\n\n* [[Solarized|https://ethanschoonover.com/solarized/]] - //Precision colors for machines and people// - \u003C\u003C[ \"[[Git|https://github.com/altercation/solarized]]\">>\n"}, +{"title":"Palette","created":"20230227073605348","creator":"Octt","modified":"20240130121821679","modifier":"Octt","page-cover":"https://source.unsplash.com/random?palette","tags":"Color","text":"\u003C\u003C^wikipediaframe \"Color scheme\" en>>\n\n* [[Solarized|https://ethanschoonover.com/solarized/]] - //Precision colors for machines and people// - \u003C\u003C[ \"[[Git|https://github.com/altercation/solarized]]\">>\n"}, {"title":"Papier-mâché","created":"20230109105615720","creator":"Octt","modified":"20230206211440622","modifier":"Octt","tags":"$:/i18n:en DIY","text":"\u003C\u003CMediaWiki Papier-mâché en 2>>"}, {"title":"Pastebin","created":"20231211234531423","creator":"Octt","modified":"20231211234717114","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Pastebin>>\n\n* \u003C\u003ChttpsL termbin.com>> --- //Netcat-based command line pastebin// --- \u003C\u003C[# Git\"https://github.com/solusipse/fiche\">>\n"}, {"title":"PC","created":"20230513221600144","creator":"Octt","modified":"20230513222118668","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Personal computer\">>\n\n* [[Ventoy|https://www.ventoy.net/en/index.html]] - //A new bootable USB solution// --- \u003C\u003C#[ Git \"https://github.com/ventoy\">>\n** [[Medicat USB|https://medicatusb.com/]] --- //Multiboot Linux USB for PC Repair// --- \u003C\u003C#[ Thread \"https://gbatemp.net/threads/medicat-usb-a-multiboot-linux-usb-for-pc-repair.361577/\">>\n"}, @@ -1417,7 +1421,7 @@ {"title":"Regex","created":"20231103222629549","creator":"Octt","modified":"20231220004122736","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Regex>>\n\n* [[regex101|https://regex101.com]] --- webapp to //build, test, and debug regex//\n* [[RegexOne|https://regexone.com/]] --- //Learn Regular Expressions with simple, interactive exercises.//\n\n* [[You can't parse [X]HTML with regex|https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454]]\n"}, {"title":"Ren'Py","created":"20230404140555044","creator":"Octt","modified":"20230920155143729","modifier":"Octt","tags":"Python [[Visual novel]]","text":"\u003C\u003C^wikipediaframe \"Ren'Py\">>\n\n* [[unrpa|https://www.lattyware.co.uk/projects/unrpa/]] --- //Program to extract files from the RPA archive format// --- \u003C\u003C[# Git \"https://github.com/Lattyware/unrpa\">>\n* [[unrpyc|https://github.com/CensoredUsername/unrpyc]] --- //A Ren'Py script decompiler//\n** [[madeddy's fork|https://github.com/madeddy/unrpyc]], to work with newer games, since original seems abandoned since 2022\n\n!!! ''Notes''\n\n* The last version that builds for [[Android]] Gingerbread is [[7.2.2 (2019, Py 2.7)|https://www.renpy.org/release/7.2.2]]\n"}, {"title":"Retrodevelopment","created":"20231108230902146","creator":"Octt","modified":"20231211004306252","modifier":"Octt","tags":"","text":"* \u003C\u003Clinkdescgit 8bitworkshop \"https://8bitworkshop.com/\" \"web-based IDE for 8-bit programming and Verilog development\" \"https://github.com/sehugg/8bitworkshop\">>\n\n* [[Yandex Retro Games|https://rgb.yandex.ru/?lang=en]] --- //Yandex Museum's competition dedicated to game development for retro platforms//\n"}, -{"title":"Retrogaming","created":"20221102121324531","creator":"Octt","modified":"20231223211424877","modifier":"Octt","tags":"Emulation Retro $:/i18n:en Gaming","text":"\u003C\u003C^wikipediaframe Retrogaming en>>\n\n!! ''Resources''\n\n!!! Play online\n\n* [[Let's Play GBA|https://www.letsplaygba.com/]] --- //Play All Game Boy Advance Games Online// --- shitty JS emulation but offers a Flash emulator, curious\n\n!!! Emulators\n\n* [[Mesen|https://www.mesen.ca/]] --- //Mesen is a multi-system emulator for Windows and Linux. It supports NES, SNES, Game Boy (Color) and PC Engine games. It also includes an extensive set of debugging tools for homebrew development and romhacking.// --- \u003C\u003C[# Git\"https://github.com/SourMesen\">>\n\n!!! ''ROMs and various archives''\n\n* [[r/Roms Megathread|https://r-roms.github.io]]\n* [[No-Intro Romsets|https://archive.org/details/no-intro_romsets]]\n* [[Redump Romsets|https://archive.org/details/redump]]\n* [[Myrient|https://myrient.erista.me/]] --- //Where sharing is a priority//\n* [[MarioCube|https://mariocube.com/]] --- //Repository focused on preserving Wii and GameCube goodies//\n* [[Vimm's Lair|https://vimm.net/]] --- //Preserving the classics since 1997//\n\n!!! ''Misc''\n\n* \u003C\u003Clinkdescgit \"RetroReversing\" \"https://www.retroreversing.com/\" \"Awesome website for reverse engineering retro games\" \"https://github.com/RetroReversing\">>\n* [[Decompiled Retail Console Games [Retro Reversing]|https://www.retroreversing.com/source-code/decompiled-retail-console-games]]\n* [[Zelda Reverse Engineering Team (Git)|https://github.com/zeldaret]]\n\n* [[retrobrews|https://retrobrews.github.io]] --- //Free game collections for easy installing/playing on RetroPie// (abandoned?)\n\n* [[Anton Retro|https://www.antonretro.com]]\n"}, +{"title":"Retrogaming","created":"20221102121324531","creator":"Octt","modified":"20240130121451980","modifier":"Octt","page-cover":"https://source.unsplash.com/random?retrogaming","tags":"Emulation Retro $:/i18n:en Gaming","text":"\u003C\u003C^wikipediaframe Retrogaming en>>\n\n!! ''Resources''\n\n!!! Play online\n\n* [[Let's Play GBA|https://www.letsplaygba.com/]] --- //Play All Game Boy Advance Games Online// --- shitty JS emulation but offers a Flash emulator, curious\n\n!!! Emulators\n\n* [[Mesen|https://www.mesen.ca/]] --- //Mesen is a multi-system emulator for Windows and Linux. It supports NES, SNES, Game Boy (Color) and PC Engine games. It also includes an extensive set of debugging tools for homebrew development and romhacking.// --- \u003C\u003C[# Git\"https://github.com/SourMesen\">>\n\n!!! ''ROMs and various archives''\n\n* [[r/Roms Megathread|https://r-roms.github.io]]\n* [[No-Intro Romsets|https://archive.org/details/no-intro_romsets]]\n* [[Redump Romsets|https://archive.org/details/redump]]\n* [[Myrient|https://myrient.erista.me/]] --- //Where sharing is a priority//\n* [[MarioCube|https://mariocube.com/]] --- //Repository focused on preserving Wii and GameCube goodies//\n* [[Vimm's Lair|https://vimm.net/]] --- //Preserving the classics since 1997//\n\n!!! ''Misc''\n\n* \u003C\u003Clinkdescgit \"RetroReversing\" \"https://www.retroreversing.com/\" \"Awesome website for reverse engineering retro games\" \"https://github.com/RetroReversing\">>\n* [[Decompiled Retail Console Games [Retro Reversing]|https://www.retroreversing.com/source-code/decompiled-retail-console-games]]\n* [[Zelda Reverse Engineering Team (Git)|https://github.com/zeldaret]]\n\n* [[retrobrews|https://retrobrews.github.io]] --- //Free game collections for easy installing/playing on RetroPie// (abandoned?)\n\n* [[Anton Retro|https://www.antonretro.com]]\n"}, {"title":"Rewriting server service scripts from sh to zx","created":"20231001092636240","creator":"Octt","modified":"20231008224707260","modifier":"Octt","tags":"WIP","text":"..."}, {"title":"Rockchip:en","created":"20230130082004553","creator":"Octt","modified":"20230206111552356","modifier":"Octt","tags":"$:/i18n:en","text":"\u003C\u003CWikipediaFrame Rockchip en 5>>"}, {"title":"RSS","created":"20230417102825671","creator":"Octt","modified":"20231221221113254","modifier":"Octt","tags":"Web","text":"\u003C\u003C^wikipediaframe RSS>>\n\n!! ''Resources''\n\n* [[RSSHub|https://docs.rsshub.app/]] --- //🍰 Everything is RSSible// --- \u003C\u003C[ \"[[Git|https://github.com/DIYgod/RSSHub]]\">>\n* [[RSS-Bridge|https://rss-bridge.github.io/rss-bridge]] \u003C\u003C[# \"Main Instance\" \"https://rss-bridge.org/bridge01/\">> --- //The RSS feed for websites missing it// --- \u003C\u003C[# Git\"https://github.com/RSS-Bridge\">>\n* [[RSS 2 HTML|https://rss.bloople.net/]] --- //PHP script to convert RSS feeds into HTML, suitable for embedding in webpages// --- \u003C\u003C#[ Git \"https://github.com/bloopletech/rss2html\">>\n\n* [[Are there any constantly updating RSS feed services to use for testing, or just very active RSS feeds?|https://stackoverflow.com/questions/18202048/are-there-any-constantly-updating-rss-feed-services-to-use-for-testing-or-just]]\n** [[Lorem RSS|https://lorem-rss.herokuapp.com/]] //Generates RSS feeds with content updated at regular intervals// --- \u003C\u003C[# Git\"https://github.com/mbertolacci/lorem-rss\">>\n"}, @@ -1474,7 +1478,7 @@ {"title":"Stable Diffusion","created":"20230404134923351","creator":"Octt","modified":"20231222225618518","modifier":"Octt","tags":"[[Artificial intelligence]] Art","text":"!!! ''Resources''\n\n* [[Stable Diffusion Art|https://stable-diffusion-art.com/]]\n\n---\n\n* [[How to run Stable Diffusion on Google Colab (AUTOMATIC1111)|https://stable-diffusion-art.com/automatic1111-colab/]]\n** [[Quick Start Guide|https://sleet-bugle-0cd.notion.site/Stable-Diffusion-Quick-Start-Guide-a49bb03dbce04462a09d57bd2198f088]]\n** [[Colab Notebook|https://colab.research.google.com/github/sagiodev/stablediffusion_webui/blob/master/StableDiffusionUI_ngrok_sagiodev.ipynb]]\n"}, {"title":"Standard Notes","created":"20230113230249689","creator":"Octt","modified":"20230221221847294","modifier":"Octt","tags":"App $:/i18n:en","text":"An encrypted open-source notes app with a very clean UX.\n\n* Website: [[standardnotes.com|https://standardnotes.com]]\n* Git Repos: [[github.com/standardnotes|https://github.com/standardnotes]]\n\n!!! ''Listed''\n\n''Listed'' is a blogging platform developed by the Standard Notes team, that strongly integrates into the app.\n\n* Website: [[listed.to|https://listed.to]]\n\n!!! ''Other''\n\n; [[Using Standard Notes as a Personal Knowledge Base|https://technosoof.wordpress.com/2020/04/10/using-standard-notes-as-a-personal-knowledge-base/]] - \u003C\u003Cmywarc 466>>\n: Need of coping with lack of text-search scoped to only the current note. \u003Cdd>\nBrowser's integrated search is a decent solution.\n\u003C/dd>\n: No actual hyperlinks will force you to manually craft a compact GUID system. \u003Cdd>\nGUIDs can't be changed later, so using dates + single letters for types is a needed thing.\n\u003C/dd> \u003Cdd>\nSeparating drafts from normal notes, WIP, etc... is optimal too.\n\u003C/dd>\n\n; [[Why Encrypted - Standard Notes|https://standardnotes.com/why-encrypted]] - \u003C\u003Cmywarc 409>>\n: Today's popular tech is far from private by default.\n: The lack of actual privacy often makes us self-censor, making us lose ourselves in our writing.\n: When you get privacy, and finally //write like it's nobody's business//, you will have peace of mind.\n"}, {"title":"Starbucks","created":"20230305195429422","creator":"Octt","modified":"20230305195825406","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Starbucks>>\n\n!!! ''News''\n\n; March 2023\n: [[Starbucks illegally fired US workers over union, judge rules|https://www.bbc.co.uk/news/business-64819774]].\n"}, -{"title":"Static site generator","created":"20230905232949767","creator":"Octt","modified":"20240128180642888","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Static site generator\">>\n\n* \u003C\u003Clinkdescgit Docusaurus \"https://docusaurus.io\" \"Easy to maintain open source documentation websites.\" \"https://github.com/facebook/docusaurus\">>\n** [[Support Relative Path|https://github.com/facebook/docusaurus/issues/448#issuecomment-908777029]]\n** [[Option to generate offline static HTML files usable without server|https://github.com/facebook/docusaurus/issues/3825]]\n*** [[Docusaurus-Static|https://octospacc.gitlab.io/editocttrialTools/docusaurus-static/]] --- my hack for solving the problem\n** [[@easyops-cn/docusaurus-search-local|https://github.com/easyops-cn/docusaurus-search-local]] --- //Offline/local search for Docusaurus v2/v3// --- \u003C\u003C[# Demo\"https://easyops-cn.github.io/docusaurus-search-local/\">>\n* \u003C\u003Clinkdescgit Hugo \"https://gohugo.io\" \"The world’s fastest framework for building websites\" \"https://github.com/gohugoio/hugo\">>\n\n* [[Hexo|https://hexo.io/]] --- //A fast, simple & powerful blog framework//\n** //[[NexT|https://theme-next.js.org/]] is a high quality elegant theme for Hexo. It is crafted from scratch, with love.// --- \u003C\u003C[# Git \"https://github.com/next-theme\">>\n\n* [[Jekyll|https://jekyllrb.com]] (+ docs) --- //🌐 Jekyll is a blog-aware static site generator in Ruby// --- \u003C\u003C#[ Git\"https://github.com/jekyll\">>\n** [[Jekyll Themes|http://jekyllthemes.org/]] --- //A directory of the best-looking themes for Jekyll blogs// --- \u003C\u003C#[ Git\"https://github.com/mattvh/jekyllthemes\">>\n*** \u003C\u003Clinkdescgit \"So Simple [Theme]\" \"https://mmistakes.github.io/so-simple-theme\" \" A simple Jekyll theme for words and pictures.\" \"https://github.com/mmistakes/so-simple-theme\">>\n*** \u003C\u003Clinkdescgit \"Jekflix Template\" \"https://jekflix.rossener.com/\" \"A Jekyll theme inspired by Netflix. 🎬\" \"https://github.com/thiagorossener/jekflix-template\">>\n*** [[TeXt Theme|https://kitian616.github.io/jekyll-TeXt-theme/]] --- //💎 🐳 A super customizable Jekyll theme for personal site, team site, blog, project, documentation, etc. // --- \u003C\u003C[# Git\"https://github.com/kitian616/jekyll-TeXt-theme\">>\n** [[Working with upcoming posts in Jekyll|https://www.fizerkhan.com/blog/posts/working-with-upcoming-posts-in-jekyll]]\n\n* [[Pelican|https://getpelican.com/]]\n** [[Eevee|https://kura.gg/eevee/]] --- //A Material Design theme for Pelican//\n\n* \u003C\u003Clinkdescgit Retype \"https://retype.com\" \"ultra-high-performance ✨ static website generator that builds a website based on simple Markdown text files\" \"https://github.com/retypeapp\">> --- seems catered towards docs/notes sites\n"}, +{"title":"Static site generator","created":"20230905232949767","creator":"Octt","modified":"20240130161941155","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Static site generator\">>\n\n* \u003C\u003Clinkdescgit Docusaurus \"https://docusaurus.io\" \"Easy to maintain open source documentation websites.\" \"https://github.com/facebook/docusaurus\">> (website contains a Showcase section with many sites)\n** [[Support Relative Path|https://github.com/facebook/docusaurus/issues/448#issuecomment-908777029]]\n** [[Option to generate offline static HTML files usable without server|https://github.com/facebook/docusaurus/issues/3825]]\n*** [[Docusaurus-Static|https://octospacc.gitlab.io/editocttrialTools/docusaurus-static/]] --- my hack for solving the problem\n** [[@easyops-cn/docusaurus-search-local|https://github.com/easyops-cn/docusaurus-search-local]] --- //Offline/local search for Docusaurus v2/v3// --- \u003C\u003C[# Demo\"https://easyops-cn.github.io/docusaurus-search-local/\">>\n** [[How to use math equations in Docusaurus|https://aloci.me/mathjax-katex/]] --- a KaTeX integration is officially aknowledged, unfortunately for my experience alignment and spacing of some symbols is broken; better to just inject MathJax\n\n* [[mdBook|https://rust-lang.github.io/mdBook/]] --- //command line tool to create books with Markdown. It is ideal for creating product or API documentation, tutorials, course materials or anything that requires a clean, easily navigable and customizable presentation.// --- \u003C\u003C[# Git \"https://github.com/rust-lang/mdBook\">>\n\n* \u003C\u003Clinkdescgit Retype \"https://retype.com\" \"ultra-high-performance ✨ static website generator that builds a website based on simple Markdown text files\" \"https://github.com/retypeapp\">> --- seems catered towards docs/notes sites\n\n* \u003C\u003Clinkdescgit Hugo \"https://gohugo.io\" \"The world’s fastest framework for building websites\" \"https://github.com/gohugoio/hugo\">>\n\n* [[Hexo|https://hexo.io/]] --- //A fast, simple & powerful blog framework//\n** //[[NexT|https://theme-next.js.org/]] is a high quality elegant theme for Hexo. It is crafted from scratch, with love.// --- \u003C\u003C[# Git \"https://github.com/next-theme\">>\n\n* [[Jekyll|https://jekyllrb.com]] (+ docs) --- //🌐 Jekyll is a blog-aware static site generator in Ruby// --- \u003C\u003C#[ Git\"https://github.com/jekyll\">>\n** [[Jekyll Themes|http://jekyllthemes.org/]] --- //A directory of the best-looking themes for Jekyll blogs// --- \u003C\u003C#[ Git\"https://github.com/mattvh/jekyllthemes\">>\n*** \u003C\u003Clinkdescgit \"So Simple [Theme]\" \"https://mmistakes.github.io/so-simple-theme\" \" A simple Jekyll theme for words and pictures.\" \"https://github.com/mmistakes/so-simple-theme\">>\n*** \u003C\u003Clinkdescgit \"Jekflix Template\" \"https://jekflix.rossener.com/\" \"A Jekyll theme inspired by Netflix. 🎬\" \"https://github.com/thiagorossener/jekflix-template\">>\n*** [[TeXt Theme|https://kitian616.github.io/jekyll-TeXt-theme/]] --- //💎 🐳 A super customizable Jekyll theme for personal site, team site, blog, project, documentation, etc. // --- \u003C\u003C[# Git\"https://github.com/kitian616/jekyll-TeXt-theme\">>\n** [[Working with upcoming posts in Jekyll|https://www.fizerkhan.com/blog/posts/working-with-upcoming-posts-in-jekyll]]\n\n* [[Pelican|https://getpelican.com/]]\n** [[Eevee|https://kura.gg/eevee/]] --- //A Material Design theme for Pelican//\n"}, {"title":"Strange things","created":"20231105150445511","creator":"Octt","modified":"20240129000235450","modifier":"Octt","tags":"","text":"* [[https://venkivasamsetti.github.io/ebookworm.github.io/csehome.html]] --- this strange half-constructed half-recycled website hides copies of some CS books in PDF among generic pages, among with unrelated things like HTML5 games?\n\n* [[StudyPlan.dev|https://www.studyplan.dev/]] --- strange C++ tutorials website with random, out-of-context (probably AI-generated?) cover pictures of random characters concept artworks...\n\n* [[^^^^^~ ░ ui▀┳╲ ☺ .info|https://yyyyyyy.info/]] --- just a mess collage of images, and the content changes at every site visit\n* [[Smokepowered - 煙霧動力.com|https://smokepowered.com/]] --- strange site with weed background and video of Valve characters smoking\n** [[Epic Blazed|https://epicblazed.com/]] --- same thing above, but for Epic Games, Unreal Engine, Fortnite\n\n* [[ICCIVITELLA|https://iccivitella.it/]], \u003C\u003ChttpsL it.knowledgr.com>> ... --- SEO spamming websites with fake content... which sometimes seem to have more actual content than real sites?\n\n* \u003C\u003ChttpsL www.chimica-online.it>>, \u003C\u003ChttpsL www.scuola-e-cultura.it>>, ... --- sites that seem like SEO spamming but they seem to be administered by actual writers? they're kinda the most confusing\n\n* [[AssemblyLT (Assembly Language Tuts)|https://www.assemblylanguagetuts.com/]], ... --- websites that seem to be constructed upon stolen domains, bought after expiration for no real good reason other than filling them with useless SEO-spam content; sometimes they seem to keep a part of the old content (or, more likely, made to look like the previous) present, but the most recent posts are always spam\n\n* [[Questions LLC|https://questions.llc/]] --- //Use AI to answer\nyour questions. Our AI bots will answer your questions in seconds.// --- it's a Q/A website where supposedly bots answer the questions, and it's full of spam and useless shit, what's the point of it even? I found it coming from the footer of these oddly-specific websites, which only makes everything stranger:\n** [[allowfullscreen|https://www.allowfullscreen.com/]] --- //an HTML attribute for the iframe tag// --- a website with some basic information about the attribute, but with some strange details, and some actually decent examples\n** [[querySelectorAll()|https://www.queryselectorall.com/]] --- //a website dedicated to the best JavaScript function in the world!// --- some generic ass information about that JS function, with a home page full of cringey AI-generated SEO bullshit telling of the subject as if they were trying to sell the thing to a child... also includes information on partially unrelated things that maybe could have something to do with querySelectorAll but really not\n\n* [[Toire no Hanako-san (folclore)|https://it.wikipedia.org/wiki/Toire_no_Hanako-san_(folclore)]]\n\n* [[PassSource|https://www.passsource.com/]] --- apparently something to create demo/dummy Apple Wallet passes? I have no use for it but they are very colorful\n\n* [[Library of Babel|https://libraryofbabel.info/]] --- contains every kind of data that exists, will exist, and will not exist, all generated through randomness but it contains anything.\n** Alternative version: \u003C\u003CYoutubeL w0XJ8D-TJtM \"Database of Damascus - This Database Contains All YOUR Files (and Everyone Else's too)\">>\n\n* [[https://www.playemulator.io/]] --- very strange-feeling site with online ROMs emulators, due to all the SEO crap, and possibly wrong thumbnails applied to misleadingly titled games\n\n* [[Pra' - Le Lavatrici|https://it.wikipedia.org/wiki/Pra%27#Le_Lavatrici]] --- un quartiere che sembra una mezza piramide fatta di lavatrici giganti\n\n* [[The Living Moka|https://www.thregr.org/wavexx/fun/tlm/]] --- letteralmente cosplay di una Moka lol\n"}, {"title":"Super Mario 64","created":"20230202232653119","creator":"Octt","modified":"20240118233234375","modifier":"Octt","tags":"Nintendo $:/i18n:en Game Proprietary","text":"\u003C\u003C^WikipediaFrame \"Super Mario 64\">>\n\n* \u003C\u003CYoutubeL _5IDmXNS14I \"UNDETECTABLE Cheats Jeopardize Super Mario 64 Speedrunning!?\">>\n\n!!! Mods\n\n* [[Shotgun Mario 64|https://romhacking.com/hack/shotgun-mario-64]] --- [\u003C\u003CYoutubeL YHdUHSv2lPc>>]\n"}, {"title":"Super Mario Bros.","created":"20230209153716905","creator":"Octt","modified":"20240119011227992","modifier":"Octt","tags":"Game","text":"\u003C\u003C^wikipediaframe Super_Mario_Bros. en>>\n\n* [[SMBDIS.ASM - A Comprehensive Super Mario Bros. Disassembly|https://gist.github.com/1wErt3r/4048722]]\n\n* [[Super Mario Bros. 3Mix|https://www.sonicepoch.com/sm3mix/]] --- //The spectacular, full-scale hack of SMB3! Implementing concepts from many games that came well after the original title.// --- \u003C\u003C[# Thread\"https://www.romhacking.net/forum/index.php?topic=14049.0\">> \u003C\u003C[# Release\"https://www.romhacking.net/hacks/2068/\">> \u003C\u003C[# Git\"https://github.com/captainsouthbird/3Mix\">> \u003C\u003C[# ROM\"https://archive.org/details/super-mario-bros.-3-mix\">>\n"}, @@ -1505,7 +1509,7 @@ {"title":"The World Factbook","created":"20230208214932674","creator":"Octt","modified":"20230208215147789","modifier":"Octt","tags":"USA Gov. Book Site Web","text":"\u003C\u003CMediaWiki The_World_Factbook en 5>>"}, {"title":"Thioacetone","created":"20230302113309813","creator":"Octt","modified":"20230302114235452","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Thioacetone en>>\n\n* [[Things I Won't Work With: Thioacetone|https://www.science.org/content/blog-post/things-i-won-t-work-thioacetone]]\n* \u003C\u003CYoutubeL LmAG8-V_WQY \"Making the stinkiest chemical known to man [NileRed]\">>\n"}, {"title":"TIC-80","created":"20230215213023824","creator":"Octt","modified":"20231122002929792","modifier":"Octt","tags":"Libre Fantasy Console Gaming","text":"* https://tic80.com/\n* https://github.com/nesbox/TIC-80\n\n\u003C\u003CWikipediaFrame TIC-80 en>>\n\n* [[Making fifty TIC-80 carts in a weekend|https://blinry.org/50-tic80-carts/]] \n* [[TIC80 - A Better Pico8?|https://8bitnews.io/article/tic80-a-better-pico8]]\n\n* [[TIC-80 Manual & Cheat Sheet|https://skyelynwaddell.github.io/tic80-manual-cheatsheet/]]\n"}, -{"title":"TiddlyWiki","created":"20220924193842295","creator":"Octt","icon":"🐈","modified":"20240130003932997","modifier":"Octt","page-cover":"https://source.unsplash.com/random/?computer-cat","tags":"TiddlyWiki Wiki Zettelkasten Libre","text":"\\define TwLL(Tid) [[$Tid$|https://tiddlywiki.com/#$Tid$]]\n\n\\define TwL(List)\n|\n\u003C$list filter=\"$List$\">\n \u003C$macrocall $name=\"TwLL\" Tid=\u003C\u003CcurrentTiddler>> />\n |\n\u003C/$list>\n\\end\n\n[[TiddlyWiki|https://tiddlywiki.com]] is the software upon which this website is built.\n\nIt is a libre, JavaScript-rich, non-linear notebook, that can well adapt to anyone's way of building a logically interconnected information database.\n\n\u003C\u003C^wikipediaframe TiddlyWiki en>>\n\n; What I like\n: All your content and app runtime can stay inside a single HTML file; it will probably work fine in browsers in the decades to come.\n: The base software runs both in the web browser (ES5 or higher?) and [[Node.js]]; the latter makes it possibile to export tiddlers to a file system programmatically, generate static sites, etc...\n: Feature-rich and powerful out of the box, with (up to a certain point) high extensibility.\n: Big community, meaning you can often get help with problems, and many third-party plugins are available.\n: The default configuration works fine on mobile devices, unlike what happens with some plugins.\n\n; What I don't like\n: The Widgets/Filters/Macros systems is based on proprietary paradigms; they are made to allow people without programming experience to do great things, but are cumbersome and hard to learn if you already have common programming experience.\n: [[JavaScript]] extensions are cumbersome, requiring a page reload to work after an edit\n: It's not easy, or sometimes it's not possibile, to extend TiddlyWiki with just pure JavaScript, and trying to do so always requires ugly hacks.\n: Widgets and Filters are essentially an interpreted language working on top of an interpreted language (JS); Since even the app core makes heavy use of them, it suffers from microlags even on modern devices, and can be's almost unusable on very old ones.\n: No built-in tiddler compression and decompression means the HTML file is big by default (~2.3 MB as of v5.2.3) and can get worse with many plugins, causing slow loading and saving.\n\n!! ''Useful Resources''\n\n* Official Git Repos: [[TiddlyWiki5 Source|https://github.com/Jermolene/TiddlyWiki5]], [[Others|https://github.com/TiddlyWiki]]\n* Official Docs: [[Standard|https://tiddlywiki.com]], [[Dev|https://tiddlywiki.com/dev]]\n* [[Links Aggregator|https://links.tiddlywiki.org]]\n* [[Grok TiddlyWiki|https://groktiddlywiki.com]] - //Build a deep, lasting understanding of TiddlyWiki//\n* [[TiddlyWiki Toolmap|https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM]]\n\n!!! Notes about ''official plugins''\n\n* There exists the useful [[BrowserStorage plugin|https://tiddlywiki.com/static/BrowserStorage%2520Plugin.html]], good when working on browsers that crash or when tabs reload themselves.\n** For optimal extra features like status indicators on tiddlers, or list of in-storage tiddlers, there exists the [[tw-browser-storage|https://btheado.github.io/tw-browser-storage]] plugin to extend the official one \u003C\u003C[# Git \"https://github.com/btheado/tw-browser-storage\">>. It has some technical issues so I made some edits: [[$:/plugins/btheado/BrowserStorage (drag to install)|$:/plugins/btheado/BrowserStorage]].\n\n!!! Misc\n\n* [[Fun with Feeds (a proof of concept RSS reader)|https://talk.tiddlywiki.org/t/fun-with-feeds-a-proof-of-concept-rss-reader/6490]] --- \u003C\u003C[# TiddlyWiki\"https://saqimtiaz.github.io/sq-tw/temp/feedreader.html\">> (use CTRL+Shift+L to switch to normal UI)\n\n* [[Has anyone generated an RSS feed from TiddlyWiki?|https://talk.tiddlywiki.org/t/has-anyone-generated-an-rss-feed-from-tiddlywiki/966/25]]\n** [[RSS and Atom Feeds for your TiddlyWiki|https://techlifeweb.com/tiddlywiki/tw5tribalknowledge/static/RSS%2520and%2520Atom%2520Feeds%2520for%2520your%2520TiddlyWiki.html]]\n\n* [[Sttot Stack|https://gk0wk.github.io/]] --- gk0wk wiki displayed with a particular tiddler reader web-app, not based on the real TW app\n\n\u003C\u003C{\u003C TiddlyWiki/ThirdParty>>\n\n!!! ''Useful Documentation or Articles''\n* \u003C\u003CTwL \" DateFormat \">>\n* \u003C\u003CTwL \" [[Filter Operators]] \">>\n** \u003C\u003CTwLL \"search Operator\">>: uses the inbuilt search engine to retrieve data\n** \u003C\u003CTwLL \"contains Operator\">>: checks if some name is contained in a list-formatted field (`list` by default)\n* \u003C\u003CTwLL \"DraggableWidget\">> --- to create custom draggables, for copying specific data to other wikis by drag-n-drop\n* \u003C\u003CTwL \" MacroCallWidget SetWidget VarsWidget\">>\n* \u003C\u003CTwL \" EditTextWidget RangeWidget CheckboxWidget\">>\n* \u003C\u003CTwL \" [[Table-of-Contents Macros (Examples)]] \">>\n* \u003C\u003CTwL \" [[How to create dynamic editor toolbar buttons]] [[How to create keyboard shortcuts]] \">>\n* [[How to Use Unicode Character (emoji) as Icon of Tags|https://dmitryrck.com/unicode-character-icon-of-tags-tiddlywiki/]] \u003C\u003CTwL \" [[How to create a custom tiddler icon rule]] \">>\n* [[How To Use Tiddlywiki as a Static Site Generator|https://rpdillon.net/how-to-use-tiddlywiki-as-a-static-site-generator.html]]\n\n\u003C\u003C{\u003C TiddlyWiki/Notes 3>>\n\n!! ''Notes/Personal''\n* [[OcttKB/WIP]]"}, +{"title":"TiddlyWiki","created":"20220924193842295","creator":"Octt","icon":"🐈","modified":"20240130141118491","modifier":"Octt","page-cover":"https://source.unsplash.com/random/?computer-cat","tags":"TiddlyWiki Wiki Zettelkasten Libre","text":"\\define TwLL(Tid) [[$Tid$|https://tiddlywiki.com/#$Tid$]]\n\n\\define TwL(List)\n|\n\u003C$list filter=\"$List$\">\n \u003C$macrocall $name=\"TwLL\" Tid=\u003C\u003CcurrentTiddler>> />\n |\n\u003C/$list>\n\\end\n\n[[TiddlyWiki|https://tiddlywiki.com]] is the software upon which this website is built.\n\nIt is a libre, JavaScript-rich, non-linear notebook, that can well adapt to anyone's way of building a logically interconnected information database.\n\n\u003C\u003C^wikipediaframe TiddlyWiki en>>\n\n; What I like\n: All your content and app runtime can stay inside a single HTML file; it will probably work fine in browsers in the decades to come.\n: The base software runs both in the web browser (ES5 or higher?) and [[Node.js]]; the latter makes it possibile to export tiddlers to a file system programmatically, generate static sites, etc...\n: Feature-rich and powerful out of the box, with (up to a certain point) high extensibility.\n: Big community, meaning you can often get help with problems, and many third-party plugins are available.\n: The default configuration works fine on mobile devices, unlike what happens with some plugins.\n\n; What I don't like\n: The Widgets/Filters/Macros systems is based on proprietary paradigms; they are made to allow people without programming experience to do great things, but are cumbersome and hard to learn if you already have common programming experience.\n: [[JavaScript]] extensions are cumbersome, requiring a page reload to work after an edit\n: It's not easy, or sometimes it's not possibile, to extend TiddlyWiki with just pure JavaScript, and trying to do so always requires ugly hacks.\n: Widgets and Filters are essentially an interpreted language working on top of an interpreted language (JS); Since even the app core makes heavy use of them, it suffers from microlags even on modern devices, and can be's almost unusable on very old ones.\n: No built-in tiddler compression and decompression means the HTML file is big by default (~2.3 MB as of v5.2.3) and can get worse with many plugins, causing slow loading and saving.\n\n!! ''Useful Resources''\n\n* Official Git Repos: [[TiddlyWiki5 Source|https://github.com/Jermolene/TiddlyWiki5]], [[Others|https://github.com/TiddlyWiki]]\n* Official Docs: [[Standard|https://tiddlywiki.com]], [[Dev|https://tiddlywiki.com/dev]]\n* [[Links Aggregator|https://links.tiddlywiki.org]]\n* [[Grok TiddlyWiki|https://groktiddlywiki.com]] - //Build a deep, lasting understanding of TiddlyWiki//\n* [[TiddlyWiki Toolmap|https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM]]\n\n!!! Notes about ''official plugins''\n\n* There exists the useful [[BrowserStorage plugin|https://tiddlywiki.com/static/BrowserStorage%2520Plugin.html]], good when working on browsers that crash or when tabs reload themselves.\n** For optimal extra features like status indicators on tiddlers, or list of in-storage tiddlers, there exists the [[tw-browser-storage|https://btheado.github.io/tw-browser-storage]] plugin to extend the official one \u003C\u003C[# Git \"https://github.com/btheado/tw-browser-storage\">>. It has some technical issues so I made some edits: [[$:/plugins/btheado/BrowserStorage (drag to install)|$:/plugins/btheado/BrowserStorage]].\n\n!!! Misc\n\n* [[TiddlyWiki Sharing Edition|https://tiddlywiki.com/share]] --- //allows users to create links to wikis with the special capability of containing embedded tiddlers that are loaded into the target wiki at startup//, all content encoded in the URL hash, by using the experimental Share plugin\n\n* [[Fun with Feeds (a proof of concept RSS reader)|https://talk.tiddlywiki.org/t/fun-with-feeds-a-proof-of-concept-rss-reader/6490]] --- \u003C\u003C[# TiddlyWiki\"https://saqimtiaz.github.io/sq-tw/temp/feedreader.html\">> (use CTRL+Shift+L to switch to normal UI)\n\n* [[Has anyone generated an RSS feed from TiddlyWiki?|https://talk.tiddlywiki.org/t/has-anyone-generated-an-rss-feed-from-tiddlywiki/966/25]]\n** [[RSS and Atom Feeds for your TiddlyWiki|https://techlifeweb.com/tiddlywiki/tw5tribalknowledge/static/RSS%2520and%2520Atom%2520Feeds%2520for%2520your%2520TiddlyWiki.html]]\n\n* [[Sttot Stack|https://gk0wk.github.io/]] --- gk0wk wiki displayed with a particular tiddler reader web-app, not based on the real TW app\n\n\u003C\u003C{\u003C TiddlyWiki/ThirdParty>>\n\n!!! ''Useful Documentation or Articles''\n* \u003C\u003CTwL \" DateFormat \">>\n* \u003C\u003CTwL \" [[Filter Operators]] \">>\n** \u003C\u003CTwLL \"search Operator\">>: uses the inbuilt search engine to retrieve data\n** \u003C\u003CTwLL \"contains Operator\">>: checks if some name is contained in a list-formatted field (`list` by default)\n* \u003C\u003CTwLL \"DraggableWidget\">> --- to create custom draggables, for copying specific data to other wikis by drag-n-drop\n* \u003C\u003CTwL \" MacroCallWidget SetWidget VarsWidget\">>\n* \u003C\u003CTwL \" EditTextWidget RangeWidget CheckboxWidget\">>\n* \u003C\u003CTwL \" [[Table-of-Contents Macros (Examples)]] \">>\n* \u003C\u003CTwL \" [[How to create dynamic editor toolbar buttons]] [[How to create keyboard shortcuts]] \">>\n* [[How to Use Unicode Character (emoji) as Icon of Tags|https://dmitryrck.com/unicode-character-icon-of-tags-tiddlywiki/]] \u003C\u003CTwL \" [[How to create a custom tiddler icon rule]] \">>\n* [[How To Use Tiddlywiki as a Static Site Generator|https://rpdillon.net/how-to-use-tiddlywiki-as-a-static-site-generator.html]]\n\n\u003C\u003C{\u003C TiddlyWiki/Notes 3>>\n\n!! ''Notes/Personal''\n* [[OcttKB/WIP]]"}, {"title":"TiddlyWiki/Notes","created":"20230127155833205","creator":"Octt","modified":"20240129135702958","modifier":"Octt","tags":"TiddlyWiki $:/i18n:en Discussion","text":"!!! ''Discussions and Solutions''\n\nDiscussions that helped or might help me solve problems, some started by me. And also some that are just plain interesing.\n\n* [[How do you edit your wiki with both the web app and external editors?|https://talk.tiddlywiki.org/t/how-do-you-edit-your-wiki-with-both-the-web-app-and-external-editors/6320]]\n* [[Multilanguage Wiki - Found a solution, but need help for improving it|https://talk.tiddlywiki.org/t/multilanguage-wiki-found-a-solution-but-need-help-for-improving-it/4672]]\n\n\u003Cdiv/>\n\n* [[Date time wiki last updated or saved?|https://groups.google.com/g/TiddlyWiki/c/RxJdciY7yZY]]\n* [[Disable CodeMirror when on Mobile|https://github.com/Jermolene/TiddlyWiki5/issues/2730]]\n* [[Footnotes|https://groups.google.com/g/tiddlywiki/c/u5A6qK7CmrY]]\n* [[I want to edit something, oh no that's a transclusion|https://groups.google.com/g/TiddlyWiki/c/tYgM6kh9lNA]] | [[How do I transclude an edit window of a tiddler?|https://groups.google.com/g/tiddlywiki/c/GsMkfxSPkmA/m/cxGdAieIBgAJ]] | [[How to quickly navigate to a transcluded tiddler?|https://talk.tiddlywiki.org/t/how-to-quickly-navigate-to-a-transcluded-tiddler/4535/5]]\n* [[Is there way to make TiddlyWiki system-wide case insensitive?|https://groups.google.com/g/tiddlywiki/c/BcEF4fTzCj8]]\n* [[Macro to Create TOC Like Table with Dot Leader|https://talk.tiddlywiki.org/t/a-macro-to-create-toc-like-table-with-dot-leader/1232]]\n* [[Simple Javascript insertion in tiddlers (text/vnd.tiddlywiki)|https://groups.google.com/g/tiddlywiki/c/NwOI-QER2ig/m/lSLS3XolwDoJ]]\n* [[[TW5] Tag (Text) Cloud for TW5?|https://groups.google.com/g/tiddlywiki/c/_YE1pjZMFkg]] | [[TagCloud plugin|https://groups.google.com/g/tiddlywiki/c/VQPaJC6yyWM]]\n* [[Setting HTML attributes with a macro?|https://groups.google.com/g/tiddlywiki/c/Qp8Fzi0BR5I/m/N65Q6thTEwAJ]]\n* [[[Plugin] Presenting TW5-Uglify! Plugin compression the TiddlyWIki way!|https://groups.google.com/g/tiddlywiki/c/-kIVw00crRQ]]\n* [[TiddlyWiki Tiddler Editor: How to Improve the Usability?|https://talk.tiddlywiki.org/t/tiddlywiki-tiddler-editor-how-to-improve-the-usability/4657]]\n* [[Using conditional assignment mode of SetWidget to check empty strings|https://groups.google.com/g/tiddlywiki/c/Pzv5FDb9oHE/m/mh5Pzm7xAgAJ]]\n* [[Notes on handling variables in TiddlyWiki|https://www.chrisnicoll.net/2020/02/notes-on-handling-variables-in-tiddlywiki/]]\n* [[Macros are not functions (Grok TW)|https://groktiddlywiki.com/static/Macros%2520are%2520not%2520functions.html]]\n* [[Wikification (Grok TW)|https://groktiddlywiki.com/static/Wikification.html]]\n\n!!! Filters\n\n* [[Filter based on integer field values less than or equal to|https://groups.google.com/g/Tiddlywiki/c/EfRToFFXCh0]] --- `[...]compare:integer:lteq[num]then[...]`\n"}, {"title":"TiddlyWiki/ThirdParty","created":"20230206113426599","creator":"Octt","modified":"20240129233143233","modifier":"Octt","tags":"","text":"!!! ''Other Wikis, Plugin Collections''\n\n* [[BrainTest|https://braintest.tiddlyspot.com]] --- //tools for a digital brain//\n* [[Calendar|https://tabbed-calendar.tiddlyspot.com]] --- //a tabbed picture calendar//\n* [[Formulas for TiddlyWiki|https://chronicles.wiki/TiddlyWikiFormula/]] --- //spreadsheet-inspired number crunching//\n* [[Joe's Blog|https://joearms.github.io]] --- Contains the [[Chandler|https://joearms.github.io/#2018-12-26%20Fun%20with%20the%20TiddlyWiki]] prototype time-management tool\n* [[kookma's codes, macros, and solutions in TW|https://kookma.github.io/TW-Scripts]]\n** Kookma Plugin Library --- \u003C\u003C[ \"[[Drag To Install|$:/config/KookmaPluginLibrary]]\">>\n** [[Shiraz|https://kookma.github.io/TW-Shiraz/]] --- //small framework of stylesheets, templates and macros to create stylish contents in Tiddlywiki//\n* [[NoteSelf|https://noteself.org]] --- TiddlyWiki fork/flavor with interesting features built-in - [[[Git|https://github.com/NoteSelf]]]\n* [[Projectify|https://thaddeusjiang.github.io/Projectify]] --- //Project management for TiddlyWiki// - [[[Git|https://github.com/ThaddeusJiang/Projectify]]]\n* [[RR-TW5|https://rr-tw5.github.io/]] --- //A Roam Research Styled TiddlyWiki//\n* [[Saq's TW5 Sandbox|https://saqimtiaz.github.io/tw5-plugins-sandbox]] --- //Experimental doodads//\n* [[Stroll|https://giffmex.org/stroll/stroll.html]] --- //A Roam-like experience in a free, downloadable file//\n* [[The public musings of Soren Bjornstad (Zettelkasten)|https://zettelkasten.sorenbjornstad.com]]\n* [[TiddlyMap|http://tiddlymap.org]] --- //Map drawing and topic visualization for your wiki!// --- [[[Git|https://github.com/felixhayashi/TW5-TiddlyMap]]]\n* [[TiddlySeq|https://gk0wk.github.io/TiddlySeq/]] --- //Logseq-like TiddlyWiki Template// --- \u003C\u003C[ \"[[Git|https://github.com/Gk0Wk/TiddlySeq]]\">>\n* [[TiddlyTools for TW5|https://tiddlytools.com/]] --- //Small Tools for Big Ideas!™//\n* [[Tobias Beer's Plugins and Resources|https://tobibeer.github.io]] --- [[[Profile|https://tobibeer.github.io/tb5/#Tobias%20Beer]]] [[[Git|https://github.com/tobibeer]]]\n* [[TW5 CPL Wiki|https://tw-cpl.netlify.app]] --- //TiddlyWiki5 Plugin Library for TiddlyWiki Chinese Communities// --- \u003C\u003C[ \"[[Drag to install|$:/config/TiddlyWiki-CPL/GitHub]]\">>\n* [[TW5 Magick|https://tw5magick.tiddlyspot.com]] --- //Some tricks and snippets for TiddlyWiki 5//\n* [[TW5 Plugins, Themes, Hacks by Thomas Elmiger|https://tid.li/tw5/]] --- //Build or optimise your own application for notetaking, writing or a ToDo-list system with these tools//\n** [[Presenting the Details Widget|https://groups.google.com/g/tiddlywiki/c/sRUVnlIaT3E]]\n* [[ZemoxWiki|https://zemox.tiddlyspot.com]] --- //a haphazard meandering of notes, thoughts, experiments, links...//\n\n!!!! Starter Kits, themed wikis for use\n\n* [[TiddlyWiki Starter Kit 📦|https://tiddlywiki-starter-kit.oeyoews.top/]]\n\n!!!! ''More personal TiddlyWikis''\n* [[Dave and Blanca Gifford's homepage|https://giffmex.org/Welcome.html]]\n* [[Eberron Tiddlywiki|https://eberron.tiddlyhost.com/]] --- //campaign setting for D&D designed for telling fantastical pulp and noir stories// --- \u003C\u003C[ \"[[Git|https://github.com/wccbuck/eberron_tw/]]\">>\n* [[ℍ𝕪𝕡𝕖𝕣𝔱𝔢𝔵𝔱: h0p3|https://h0p3.neocities.org/]] (old domain: [[philosopher.life|https://web.archive.org/web/20221227170107/https://philosopher.life/]])\n* [[makiaea|https://makiaea.org/00045/20230414makiaea.html]] --- contains a cool/strange choose-your-own-adventure thing\n\n!!!! ''Individual Plugins''\n\n* [[Archipel|https://archipel.tiddlyspot.com/]] --- //Data visualization Knowledge map of tiddler's ToC, as zoomable circle packs// --- [[[Discussion|https://groups.google.com/g/tiddlywiki/c/wZZ-84FV0-k]]]\n* [[CodeMirrorPlus|https://adithya-badidey.github.io/TW5-codemirror-plus/]] --- //A better editor for TW5, based on ~CodeMirror// --- [[Demo|https://adithya-badidey.github.io/TW5-codemirror-plus/wiki.html]] | [[Git|https://github.com/adithya-badidey/TW5-codemirror-plus]]\n* [[[Release] Codemirror6 Plugin|https://talk.tiddlywiki.org/t/release-codemirror6-plugin/8843]] \u003C\u003C[# Git \"https://github.com/oeyoews/tiddlywiki-codemirror6\">> \u003C\u003C[# Demo \"https://oeyoews.github.io/tiddlywiki-codemirror6/#%24%3A%2Fplugins%2Foeyoews%2Ftiddlywiki-codemirror-6\">>\n* [[Command Palette|https://souk21.github.io/TW-commandpalette/]] --- \u003C\u003C[# Git \"https://github.com/Souk21/TW-commandpalette\">>\n* [[Context Plugin|https://contextplugin.tiddlyspot.com]] --- //search with context//\n* [[Daily Notes|https://github.com/akhater/Daily-Notes-for-TW5]] - //Interstitial Journaling plugin//\n* [[ECharts|https://tiddly-gittly.github.io/tw-echarts]] [[[Git|https://github.com/tiddly-gittly/tw-echarts]], [[Thread|https://talk.tiddlywiki.org/t/echarts-bringing-amazing-visualization-tools-to-tiddlywiki/1944]]] --- //An All-in-one Visualization Framework for TiddlyWiki5 based on ECharts//\n* [[enable-js|http://tobibeer.github.io/tw/enable-js]] --- //using inline script tags//\n* [[find-in-page-plugin|https://tiddlywiki-find-in-page-plugin.tiddlyhost.com/]] --- //finds text in tiddlers currently view//, basically replicates the browser CTRL+F feature but integrates it with the wiki search box\n* [[ibox|https://tobibeer.github.io/tw/ibox]] - //pretty-show images in tw5//\n* [[TW5 Locator|https://bimlas.gitlab.io/tw5-locator/]] --- //discover and search by context//, with polished field filtering features --- \u003C\u003C[ \"[[Git|https://gitlab.com/bimlas/tw5-locator]]\">>\n* [[Notion-like Icon And PageCover|https://gk0wk.github.io/TiddlySeq/#Notion-like%20Icon%20And%20PageCover]] --- \u003C\u003C[ \"[[Thread|https://talk.tiddlywiki.org/t/notion-like-icon-and-pagecover/1741]]\">>\n* [Kookma] [[Refnotes|https://kookma.github.io/TW-Refnotes/]] --- //references, citations, footnotes and abbreviations// --- [[[Git|https://github.com/kookma/TW-Refnotes]]]\n* \u003C\u003Clinkdescgit Relink \"https://flibbles.github.io/tw5-relink\" \"flexibility when relinking renamed tiddlers\" \"https://github.com/flibbles/tw5-relink\">>\n* [[Section Editor|https://kookma.github.io/TW-Section]] --- //create, edit, fold, manage sections// --- [[Git|https://github.com/kookma/TW-Section]] | [[Prototype discussion|https://talk.tiddlywiki.org/t/section-editor-prototype/951]]\n* \u003C\u003Clink+desc+git Streams \"https://saqimtiaz.github.io/streams/\" \"Streams is a keyboard friendly way to write and easily divide your text into separate tiddlers while writing.\" \"https://github.com/saqimtiaz/streams\">> --- Adds a structural-visual hierarchy system to TiddlyWiki like Notion/Logseq.\n* [[NotoWritey|https://marxsal.github.io/various/notowritey.html]] --- //text editor and outliner for ~TiddlyWiki that allows you to concentrate on writing documents one section (tiddler) at a time//\n* [[Syntax-Highlighting Tiny Editor|https://talk.tiddlywiki.org/t/tw5-ready-to-play-prototype-syntax-highlighting-tiny-editor/4569]] (Ready-to-play prototype) --- [[Download|https://talk.tiddlywiki.org/uploads/short-url/853ile3OvoeJ9uowpv0YYXnKhSe.json]]\n\n* [[Keyboard Navigation|https://keynav.tiddlyhost.com/]] --- //A plugin to add keyboard navigation of TiddlyWiki's Story River.//\n* [[tw5-keyboard-navigation|https://maximilian-schillinger.de/tw5-keyboard-navigation-plugin.html]] --- //Navigate through your TiddlyWiki5 with your keyboard: jump to next/previous tiddler, edit or close tiddler// --- \u003C\u003C[# Git\"https://github.com/MaxGyver83/tw5-keyboard-navigation\">>\n\n* [[TWCrossLinks|https://github.com/akhater/TWCrossLinks]] --- //Discover all your intra-tiddlers links//\n\n!!!! ''Individual Themes''\n\n* [[Notebook theme|https://nicolas.petton.fr/tw/notebook.html]] --- //clean, uncluttered theme for TiddlyWiki// --- \u003C\u003C[# Git\"https://github.com/NicolasPetton/notebook\">>\n* [[👻✨ whitespace theme|http://j.d.whitespace.tiddlyspot.com/]] --- //negative-spacious, webapp-nostalgic theme for TiddlyWiki//\n"}, {"title":"TiddlyWiki/TipsAndTricks","created":"20240128224928644","creator":"Octt","modified":"20240129005505907","modifier":"Octt","tags":"","text":"* [[A Beautiful Searchbox in Tiddlywiki|https://talk.tiddlywiki.org/t/a-beautiful-searchbox-in-tiddlywiki-5-2-0/1476]]\n* [[A Notebox Example ii: A Little More WikText and CSS|https://talk.tiddlywiki.org/t/a-notebox-example-ii-a-little-more-wiktext-and-css/6640]]\n* [[Create a Searchable FAQ Page|https://talk.tiddlywiki.org/t/create-a-searchable-faq-page/6406]]\n* [[Ribbon Title Using Modern CSS|https://talk.tiddlywiki.org/t/ribbon-title-using-modern-css/6957]]\n* [[Search your nodejs wiki in Google (and other engines)|https://talk.tiddlywiki.org/t/search-your-nodejs-wiki-in-google/8195]] --- \u003C\u003C[# Userscript \"https://openuserjs.org/scripts/linonetwo/TiddlyWiki5_Combine_TW5_and_search_engine_results\">>\n** it's broken on many engines other than Google, I will probably upload a patch for some when I have time\n* [[Tiddler Ribbon Using Pure CSS and Simple Macro|https://talk.tiddlywiki.org/t/tiddler-ribbon-using-pure-css-and-simple-macro/6999]]\n"}, @@ -1523,7 +1527,7 @@ {"title":"Unix","created":"20230202232344991","creator":"Octt","modified":"20230608141303707","modifier":"Octt","tags":"$:/i18n:en","text":"\u003C\u003C^wikipediaframe Unix>>\n\n* [[MINIX From Scratch|https://github.com/o-oconnell/minixfromscratch]] - //Development and compilation setup for the book version of MINIX 3//\n\n!!! ''How-to''\n\n* [[Make subdirectory writable by anyone even if parent folder is not|https://unix.stackexchange.com/a/490082]]\n"}, {"title":"UNIX desktop","created":"20240128234422056","creator":"Octt","modified":"20240128234502543","modifier":"Octt","tags":"","text":"Things related to the UNIX desktop world...\n\n* [[How to prevent Gnome-shell's Alt+Tab from grouping windows from similar apps?|https://superuser.com/questions/394376/how-to-prevent-gnome-shells-alttab-from-grouping-windows-from-similar-apps]]\n"}, {"title":"Unix/Shell","created":"20230605214923345","creator":"Octt","modified":"20231119150258479","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Unix Shell\">>\n\n* [[Input Field Separators|https://en.wikipedia.org/wiki/Input_Field_Separators]]\n* [[$PWD vs. pwd regarding portability|https://stackoverflow.com/questions/10795014/pwd-vs-pwd-regarding-portability]] --- `$(pwd)` has issues with paths with newline chars, `$PWD` is fine but can be wrongly reset by badly-made programs; all appear to be available on all good shells.\n\n* [[Get/use exit code of command|https://www.cyberciti.biz/faq/bash-get-exit-code-of-command/]] --- Variable `$?`\n\n* [[Split string with symbol|https://stackoverflow.com/a/10638555]]\n* [[How to find the last field using 'cut'|https://stackoverflow.com/questions/22727107/how-to-find-the-last-field-using-cut]] --- `echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev`\n* [[Check if a string begins with some value|https://stackoverflow.com/questions/2172352/in-bash-how-can-i-check-if-a-string-begins-with-some-value#18558871]] --- `beginswith(){ case $2 in \"$1\"*) true;; *) false;; esac; }`\n* [[Remove the extension of a filename, get filename path, ... using POSIX's built-in script only|https://gist.github.com/nimula/385938957bb96234aa62abc6ed8f950e]]\n** [[How can I remove the extension of a filename in a shell script?|https://stackoverflow.com/questions/12152626/how-can-i-remove-the-extension-of-a-filename-in-a-shell-script]]\n\n* \"error: arithmetic expression: expecting primary\"... --- happens when calling an arithmetic expression (e.g. `$(( 5 * 7 ))`) with a missing parameter, or with quotes, in `sh`; `bash` accepts quotes and doesn't error instead. Don't use quotes in mathexps in `sh`.\n"}, -{"title":"Unsplash","created":"20230114161806791","creator":"Octt","icon":"🎆","modified":"20230221195107270","modifier":"Octt","page-cover":"https://source.unsplash.com/random?web-design","tags":"Internet $:/i18n:en $:/Apps","text":"\u003C!--\n\\define URLRnd() https://source.unsplash.com/random?\u003C$macrocall $name=\"now\"/>\u003C\u003Cnow \"hh.mm.ss.XXX\">>\n--->\n\n''[[Unsplash|https://unsplash.com]]'' provides royalty-free and credit-free pictures, sorted by category and easily obtainable trough both a webapp and an HTTP GET API (even without authentication), under the \"Unsplash license\".\n\n\u003C\u003C^wikipediaframe Unsplash en>>\n\nMany decorative images on this KB are hotliked from Unsplash; some randomly, some not.\n\n!!! ''Unauthenticated API''\n\nThe base URL for all following endpoints is `https://source.unsplash.com`.\n\n\u003C\u003C\u003C\n(Adapted from [[Generate Random Images From Unsplash Without Using The API|https://awik.io/generate-random-images-unsplash-without-using-api/]])\n\nThe URL schema is the following:\n\n```txt\nhttps://source.unsplash.com/{From}/[Size]/?[Keywords]\n```\n\n; `{From}`\n: `/random` - Image from a random user\n: `/user/{Username}` - Image from a specific user\n; `[Size]`\n: `{Width}x{Height}` - Image of specific size of width * height\n; `[Keywords]` - Image with certain keyword[s]; Multiple can be specified by separation with:^^[citation needed]^^\n: `Word1[,...]` - Comma: meaning AND\n: `Word1[-...]` - Dash: meaning OR\n\n\u003C\u003C\u003C\n\n!!! ''Random Picture from the Gallery''\n\n\u003Ca href=\"https://unsplash.com\" rel=\"noopener noreferrer\" target=\"_blank\">\u003Cimg class=\"Img90\" src=\"https://source.unsplash.com/random\">\u003C/a>\n\n\u003C!--\n\u003Ca href=\"https://source.unsplash.com/random?{{{[\u003Cnow hh.mm.ss.XXX>]}}}\">a\u003C/a>\n--->"}, +{"title":"Unsplash","created":"20230114161806791","creator":"Octt","icon":"🎆","modified":"20240130121733694","modifier":"Octt","page-cover":"https://source.unsplash.com/random?web-design","tags":"Internet $:/i18n:en $:/Apps","text":"\u003C!--\n\\define URLRnd() https://source.unsplash.com/random?\u003C$macrocall $name=\"now\"/>\u003C\u003Cnow \"hh.mm.ss.XXX\">>\n--->\n\n''[[Unsplash|https://unsplash.com]]'' provides royalty-free and credit-free pictures, sorted by category and easily obtainable trough both a webapp and an HTTP GET API (even without authentication), under the \"Unsplash license\".\n\n\u003C\u003C^wikipediaframe Unsplash en>>\n\nMany decorative images on this KB are hotliked from Unsplash; some randomly, some not.\n\n!!! ''Unauthenticated API''\n\nThe base URL for all following endpoints is `https://source.unsplash.com`.\n\n\u003C\u003C\u003C\n(Adapted from [[Generate Random Images From Unsplash Without Using The API|https://awik.io/generate-random-images-unsplash-without-using-api/]])\n\nThe URL schema is the following:\n\n```txt\nhttps://source.unsplash.com/{From}/[Size]/?[Keywords]\n```\n\n; `{From}`\n: `/random` - Image from a random user\n: `/user/{Username}` - Image from a specific user\n; `[Size]`\n: `{Width}x{Height}` - Image of specific size of width * height\n; `[Keywords]` - Image with certain keyword[s]; Multiple can be specified by separation with:^^[citation needed]^^\n: `Word1[,...]` - Comma: meaning AND\n: `Word1[-...]` - Dash: meaning OR\n\n\u003C\u003C\u003C\n\n!!! ''Random Picture from the Gallery''\n\n\u003Ca href=\"https://unsplash.com\" rel=\"noopener noreferrer\" target=\"_blank\">\n\t\u003Cimg class=\"Img90\" src=\"https://source.unsplash.com/random\">\n\u003C/a>\n\n\u003C!--\n\u003Ca href=\"https://source.unsplash.com/random?{{{[\u003Cnow hh.mm.ss.XXX>]}}}\">a\u003C/a>\n--->"}, {"title":"URL shortening","created":"20230823100404453","creator":"Octt","modified":"20240127213352039","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"URL shortening\">>\n\n* \u003C\u003ChttpsL bit.ly>> --- Classic shortener, but got shitty in recent years and demands and account be made for creating more than 1 link (unless you clear browser site storage)\n* \u003C\u003ChttpsL goo.gl>> --- Shortener which has been #KilledBy[[Google]]\n* \u003C\u003ChttpsL t.ly>> --- Apparently the //World's Shortest Link Shortener//\n* \u003C\u003ChttpsL tinyurl.com>> --- A shortener that I think is standing the test of time, but recently the retro site was replaced with a full-blown webapp\n"}, {"title":"USB","created":"20230205142939788","creator":"Octt","modified":"20231105001706951","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe USB>>\n\n* (even low-power) [[USB storage devices disconnecting without apparent reason|https://askubuntu.com/questions/1266583/usb-storage-devices-disconnecting-without-apparent-reason]] --- short answer: probably the master controller not supplying enough power in bursts and so making the slave crash, some PC motherboards are shit enough to make this happen even with pendrives (which work normally until they draw a lot of current in an instant)\n** \u003C\u003CRedditL r/MSI_Gaming/comments/uqlzk5/b450_gaming_plus_max_usb_ports_not_working \"B450 Gaming Plus Max USB ports not working properly\">>: personal issue of mine\n"}, {"title":"Userscript","created":"20230513220204210","creator":"Octt","modified":"20240128225300389","modifier":"Octt","tags":"Web Hacking","text":"\u003C\u003C^wikipediaframe Userscript>>\n\n* [[Greasy Fork|https://greasyfork.org/]] --- Best site for userscripts --- \u003C\u003C#[ Git \"https://github.com/JasonBarnabe/greasyfork\">>\n* [[Violentmonkey|https://violentmonkey.github.io/]] --- //open-source userscript manager for browsers with WebExtensions support// (the best today) --- \u003C\u003C#[ Git \"https://github.com/violentmonkey\">>\n* Old US managers: [[Greasemonkey|https://www.greasespot.net/]], [[Tampermonkey|https://www.tampermonkey.net/]]\n\n* [[Greasemonkey: \"GM_xmlhttpRequest is not defined\" with the new update|https://stackoverflow.com/questions/49365651/greasemonkey-gm-xmlhttprequest-is-not-defined-with-the-new-update#54456646]] --- change `@grant` and all uses in code from `GM_thing` to `GM.thing`.\n"}, @@ -1545,7 +1549,7 @@ {"title":"Web Browser","created":"20230217100639349","creator":"Octt","modified":"20240128004734394","modifier":"Octt","tags":"Web","text":"\u003C\u003C^wikipediaframe \"Web Browser\">>\n\n* [[Fulguris|https://slions.net/resources/fulguris.10/]] --- webview-based //Sparkling Android Web Browser// --- \u003C\u003C[# Git\"https://github.com/Slion/Fulguris\">>\n* [[Via Browser|https://viayoo.com/en/]] --- //lite browser with powerful functions. Designed on geek thinking.//\n\n!!! [[Chromium|https://chromium.org]]\n\n* [[Website by woolyss|https://chromium.woolyss.com/]] --- //created in 2013 because there was no easy way to download good and stable releases of Chromium, on Windows// ... also indexes other Chromium downloads\n\n* [[Remote debug Android devices (Chrome for Developers)|https://developer.chrome.com/docs/devtools/remote-debugging/]]\n* [[How to manage service workers in chrome?|https://stackoverflow.com/questions/40041401/how-to-manage-service-workers-in-chrome#40046012]] --- `chrome://serviceworker-internals`\n\n; Forks\n: [[Ungoogled Chromium|https://github.com/ungoogled-software]]\n: [[Bromite|https://bromite.org]] (Android) --- \u003C\u003C[# Git\"https://github.com/bromite\">>\n\n!!! [[Firefox|https://firefox.com]]\n\n* [[How to Install Any Add-on in Firefox for Android|https://www.maketecheasier.com/install-addon-firefox-android]] (Firefox Beta is needed)\n** [[Usando Firefox Beta, è possibile aggiungere una lista custom di #addons...|https://mastodon.uno/@octo/111064836718607256]]\n* [[Why Extensions can't modify Mozilla sites (like AMO)|https://ninetailed.ninja/extensions-modify-mozilla-sites.html]]\n* [[How to increase Firefox scrollbar width?|https://unix.stackexchange.com/questions/304711/how-to-increase-firefox-scrollbar-width]] --- set `widget.non-native-theme.scrollbar.size.override` to number in `about:config`\n\n; Forks\n: [[LibreWolf|https://librewolf.net]] (Desktop)\n: \u003C\u003CFDroidLink org.mozilla.fennec_fdroid \"Fennec F-Droid\">> (Android)\n: [[CENO Browser|https://censorship.no/en/index.html]] (Android) --- //Short for censorship.no!, is the world’s first mobile browser that side-steps current Internet censorship methods. Its peer-to-peer backbone allows people to access and share web information in and across regions where connectivity has been interrupted or compromised.// --- \u003C\u003C[ \"[[Git|https://gitlab.com/censorship-no]]\">>\n\n; Forks of the old codebase, Mozilla Suite\n: [[Mypal|https://www.mypal-browser.org/]] --- //Mypal is a current and maintained browser for Windows XP. Turn that old PC into something useful!// --- \u003C\u003C[# \"Old Sources\" \"https://github.com/Feodor2/Mypal/tags\">>\n: [[Pale Moon|https://www.palemoon.org/]]\n: //''[[SeaMonkey project|https://www.seamonkey-project.org/]]'' is a community effort to develop the SeaMonkey Internet Application Suite//\n\n!!! \u003C\u003CFlathubLink org.gnome.Epiphany \"Epiphany\">>\n\n* https://gitlab.gnome.org/GNOME/epiphany\n\n!!! Misc\n\n* //''[[Falkon|https://www.falkon.org/]]'' is a KDE web browser using QtWebEngine rendering engine// (same as Chromium, but the overall base is different)\n* //''[[K-Meleon|http://kmeleonbrowser.org/]]'' is a lightweight, customizable, open-source web browser designed for Microsoft Windows (Win32) operating systems. Support for legacy operating systems, low RAM usage, a macro language to customize the browser, and privacy-respecting defaults are among K-Meleon's unique features.//\n* [[Konqueror|https://apps.kde.org/konqueror/]] --- //Konqueror is KDE's Webbrowser and swiss-army-knife for any kind of file-management and file previewing.// --- basically the Internet Explorer 4 of Linux, a file manager with built-in browser and advanced features... seems to be maintained currently, but all my distros ship an ancient version with HTML 4 (no 5) support\n\n!! Extensions / Add-ons\n\n* [[octollection|https://addons.mozilla.org/en-US/firefox/collections/18049170/octollection]] --- my add-ons collection for Firefox\n* [[Redirector|https://einaregilsson.com/redirector/]]\n"}, {"title":"Web design ideas","created":"20221103223952562","modified":"20230206111552426","modifier":"Octt","tags":"Internet $:/i18n:en","text":"Some ideas on //how// and //into what// to make a website I want to collect. Some I gather from other people's sites.\n\n* Site Changelog on Home page\n* Animated/Static Image Buttons for expressing ideas or linking to other websites\n* Shrines\n* Vast photo Galleries"}, {"title":"Web/Design","created":"20231224172607192","creator":"Octt","modified":"20231224172753668","modifier":"Octt","tags":"","text":"\u003C\u003C^WikipediaFrame \"Web design\">>\n\n* [[Codrops|https://tympanus.net/codrops/]] --- //Keeping web professionals inspired & up-to-date since 2009// --- \u003C\u003C[# Git\"https://github.com/codrops\">>\n** [[Text Input Effects|https://tympanus.net/Development/TextInputEffects/]] --- //Simple styles and effects for enhancing text input interactions.// --- \u003C\u003C[# Git\"https://github.com/codrops/TextInputEffects\">>\n\n!!! Other misc libraries and designs\n\n* [[Typo|https://neatnik.net/typo/]] --- //Typo types the way a real person types. There are subtle variations in speed, occasional errors that are corrected, and a general feeling of humanity.// --- \u003C\u003C[# Git\"https://github.com/neatnik/typo\">>\n"}, -{"title":"Web/Development","created":"20230221204801305","creator":"Octt","modified":"20240119001119592","modifier":"Octt","tags":"","text":"\u003C\u003C^WikipediaFrame \"Web development\">>\n\n!!! ''References''\n\n; Misc\n: [[Window: postMessage()|https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage]]\n: [[Proxy Auto-Configuration (PAC) file|https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file]]\n\n; DOM querying\n: [[Find all text nodes in HTML page|https://stackoverflow.com/a/10730777]]\n: [[Find the closest ancestor element that has a specific class|https://stackoverflow.com/a/49516201]] | [[Element.closest()|https://developer.mozilla.org/en-US/docs/Web/API/Element/closest]]\n\n; DOM manipulation\n: [[Insert a childNode to a specific position|https://stackoverflow.com/a/26259544]]\n: [[Prepend/append childNode to beginning/end of element|https://stackoverflow.com/a/45656684]]\n: [[Replace a DOM Element|https://www.javascripttutorial.net/dom/manipulating/replace-a-dom-element/]]\n\n; Embeds\n: [[From object to iframe — other embedding technologies|https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Other_embedding_technologies]]\n: [[Alternative to iFrames with HTML5?|https://stackoverflow.com/questions/8702704/alternative-to-iframes-with-html5#31845361]]\n: [[Why are iframes considered dangerous and a security risk?|https://stackoverflow.com/questions/7289139/why-are-iframes-considered-dangerous-and-a-security-risk]]\n: [[4 IFrame Security Concerns You Should Know|https://blog.bitsrc.io/4-security-concerns-with-iframes-every-web-developer-should-know-24c73e6a33e4?gi=2c961c6663da]]\n\n!!! ''Tools and similar''\n\n* https://github.com/csstools/oldie - //tranforms CSS to be compatible with old Internet Explorer//\n* [[CORS Anywhere|https://github.com/Rob--W/cors-anywhere]] - //Server proxy which adds CORS headers to the request//\n* [[Web developer tools (mothereff.in)|https://mothereff.in/]] --- \u003C\u003C[# Git\"https://github.com/mathiasbynens/mothereff.in\">>\n\n!!!! Minification\n\n* ~~[[node-minify|https://github.com/srod/node-minify]] - //Light Node.js module and CLI app that compress javascript, css and html files//~~\n\n!!! ''Misc''\n\n* [[web.dev|https://web.dev/]] - //Guidance to build modern web experiences that work on any browser// (?)\n* [[Go Make Things|https://gomakethings.com/]] - //how to build a simpler, more resilient web//\n** [[The Vanilla JS Toolkit|https://vanillajstoolkit.com/]] - //tools and snippets for working with JavaScript// (libraries, functions, polyfills, learning)\n* [[Web Accessibility Developer Guide|https://www.accessibility-developer-guide.com/]]\n* [[Using \u003Cstyle> tags in the \u003Cbody> with other HTML|https://stackoverflow.com/questions/2830296/using-style-tags-in-the-body-with-other-html]] --- there once was a `scoped` attribute for `\u003Cstyle>` blocks, but it's nowadays deprecated and styles apply to all document elements despite their own position in the tree\n\n* [[Convert any website into a PWA in just 3 simple steps|https://dev.to/developertharun/convert-any-website-into-a-pwa-in-just-3-simple-steps-35pp]]\n* [[SPA source code recovery by un-Webpacking source maps|https://medium.com/@rarecoil/spa-source-code-recovery-by-un-webpacking-source-maps-ef830fc2351d]] - ''[[unwebpack-sourcemap|https://github.com/rarecoil/unwebpack-sourcemap]]''\n* [[How to inject service-worker.js to a webpage via Chrome Extension? I want to add offline functionality to the existing page|https://stackoverflow.com/questions/72356003/how-to-inject-service-worker-js-to-a-webpage-via-chrome-extension-i-want-to-add]]\n* [[Convert HTML5 Canvas Sequence to a Video File|https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/62065826#62065826]]\n** customize video quality by changing codec: \u003C\u003CMDNLink Web/API/MediaRecorder/mimeType#examples MediaRecorder/mimeType>>\n\n* [[Hail, Babel! The Transpiling Overlord|https://www.telerik.com/blogs/hail-babel-the-transpiling-overlord]]\n** [[Using babel to transpile to es3 (safari compliant)|https://stackoverflow.com/questions/40205547/using-babel-to-transpile-to-es3-safari-compliant]]\n** [[How to Convert ES6 into ES5 using Babel|https://medium.com/@SunnyB/how-to-convert-es6-into-es5-using-babel-1b533d31a169]]\n\n* [[How to add full text search to your website|https://medium.com/dev-channel/how-to-add-full-text-search-to-your-website-4e9c80ce2bf4]]\n** [[BlogSearch|https://github.com/kbumsik/blogsearch]]\n** [[MiniSearch, a client-side full-text search engine|https://lucaongaro.eu/blog/2019/01/30/minisearch-client-side-fulltext-search-engine.html]]\n** [[Client-side full-text search in CSS|https://www.redotheweb.com/2013/05/15/client-side-full-text-search-in-css.html?]] (+ a bit of JS :c)\n** [[Lunr.js|https://github.com/olivernn/lunr.js/]]\n*** [[Add Search to Your Static Site with Lunr.js (Hugo, Vanilla JS)|https://aaronluna.dev/blog/add-search-to-static-site-lunrjs-hugo-vanillajs/]]\n*** [[Adding Super Fast Frontend Search in Rails with Lunr|https://blog.cloud66.com/adding-super-fast-frontend-search-in-rails-with-lunr]]\n"}, +{"title":"Web/Development","created":"20230221204801305","creator":"Octt","modified":"20240130151210109","modifier":"Octt","tags":"","text":"\u003C\u003C^WikipediaFrame \"Web development\">>\n\n* [[Ravelrumba - Blogging design and front end development|https://www.ravelrumba.com/]]\n\n!!! ''References''\n\n; Misc\n: [[Window: postMessage()|https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage]]\n: [[Proxy Auto-Configuration (PAC) file|https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file]]\n\n; DOM querying\n: [[Find all text nodes in HTML page|https://stackoverflow.com/a/10730777]]\n: [[Find the closest ancestor element that has a specific class|https://stackoverflow.com/a/49516201]] | [[Element.closest()|https://developer.mozilla.org/en-US/docs/Web/API/Element/closest]]\n\n; DOM manipulation\n: [[Insert a childNode to a specific position|https://stackoverflow.com/a/26259544]]\n: [[Prepend/append childNode to beginning/end of element|https://stackoverflow.com/a/45656684]]\n: [[Replace a DOM Element|https://www.javascripttutorial.net/dom/manipulating/replace-a-dom-element/]]\n\n; Embeds\n: [[From object to iframe — other embedding technologies|https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Other_embedding_technologies]]\n: [[Alternative to iFrames with HTML5?|https://stackoverflow.com/questions/8702704/alternative-to-iframes-with-html5#31845361]]\n: [[Why are iframes considered dangerous and a security risk?|https://stackoverflow.com/questions/7289139/why-are-iframes-considered-dangerous-and-a-security-risk]]\n: [[4 IFrame Security Concerns You Should Know|https://blog.bitsrc.io/4-security-concerns-with-iframes-every-web-developer-should-know-24c73e6a33e4?gi=2c961c6663da]]\n\n!!! ''Tools and similar''\n\n* https://github.com/csstools/oldie - //tranforms CSS to be compatible with old Internet Explorer//\n* [[CORS Anywhere|https://github.com/Rob--W/cors-anywhere]] - //Server proxy which adds CORS headers to the request//\n* [[Web developer tools (mothereff.in)|https://mothereff.in/]] --- \u003C\u003C[# Git\"https://github.com/mathiasbynens/mothereff.in\">>\n\n!!!! Minification\n\n* ~~[[node-minify|https://github.com/srod/node-minify]] - //Light Node.js module and CLI app that compress javascript, css and html files//~~\n\n!!! ''Misc''\n\n* [[web.dev|https://web.dev/]] - //Guidance to build modern web experiences that work on any browser// (?)\n* [[Go Make Things|https://gomakethings.com/]] - //how to build a simpler, more resilient web//\n** [[The Vanilla JS Toolkit|https://vanillajstoolkit.com/]] - //tools and snippets for working with JavaScript// (libraries, functions, polyfills, learning)\n* [[Web Accessibility Developer Guide|https://www.accessibility-developer-guide.com/]]\n* [[Using \u003Cstyle> tags in the \u003Cbody> with other HTML|https://stackoverflow.com/questions/2830296/using-style-tags-in-the-body-with-other-html]] --- there once was a `scoped` attribute for `\u003Cstyle>` blocks, but it's nowadays deprecated and styles apply to all document elements despite their own position in the tree\n\n* [[Convert any website into a PWA in just 3 simple steps|https://dev.to/developertharun/convert-any-website-into-a-pwa-in-just-3-simple-steps-35pp]]\n* [[SPA source code recovery by un-Webpacking source maps|https://medium.com/@rarecoil/spa-source-code-recovery-by-un-webpacking-source-maps-ef830fc2351d]] - ''[[unwebpack-sourcemap|https://github.com/rarecoil/unwebpack-sourcemap]]''\n* [[How to inject service-worker.js to a webpage via Chrome Extension? I want to add offline functionality to the existing page|https://stackoverflow.com/questions/72356003/how-to-inject-service-worker-js-to-a-webpage-via-chrome-extension-i-want-to-add]]\n* [[Convert HTML5 Canvas Sequence to a Video File|https://stackoverflow.com/questions/19235286/convert-html5-canvas-sequence-to-a-video-file/62065826#62065826]]\n** customize video quality by changing codec: \u003C\u003CMDNLink Web/API/MediaRecorder/mimeType#examples MediaRecorder/mimeType>>\n\n* [[Convert Images to Data URIs for Faster Page Loads|https://jeffreyeverhart.com/2016/04/30/images-data-uris-faster-page-loads/]]\n** [[Data URIs for CSS Images: More Tests, More Questions|https://www.ravelrumba.com/blog/data-uris-for-css-images-more-tests-more-questions/]]\n\n* [[Hail, Babel! The Transpiling Overlord|https://www.telerik.com/blogs/hail-babel-the-transpiling-overlord]]\n** [[Using babel to transpile to es3 (safari compliant)|https://stackoverflow.com/questions/40205547/using-babel-to-transpile-to-es3-safari-compliant]]\n** [[How to Convert ES6 into ES5 using Babel|https://medium.com/@SunnyB/how-to-convert-es6-into-es5-using-babel-1b533d31a169]]\n\n* [[How to add full text search to your website|https://medium.com/dev-channel/how-to-add-full-text-search-to-your-website-4e9c80ce2bf4]]\n** [[BlogSearch|https://github.com/kbumsik/blogsearch]]\n** [[MiniSearch, a client-side full-text search engine|https://lucaongaro.eu/blog/2019/01/30/minisearch-client-side-fulltext-search-engine.html]]\n** [[Client-side full-text search in CSS|https://www.redotheweb.com/2013/05/15/client-side-full-text-search-in-css.html?]] (+ a bit of JS :c) --- \u003C\u003C[# Gist \"https://gist.github.com/alisonailea/6527599\">>\n** [[Lunr.js|https://github.com/olivernn/lunr.js/]]\n*** [[Add Search to Your Static Site with Lunr.js (Hugo, Vanilla JS)|https://aaronluna.dev/blog/add-search-to-static-site-lunrjs-hugo-vanillajs/]]\n*** [[Adding Super Fast Frontend Search in Rails with Lunr|https://blog.cloud66.com/adding-super-fast-frontend-search-in-rails-with-lunr]]\n\n* [[PDFObject|https://pdfobject.com/]] --- //An open-source standards-friendly JavaScript utility for embedding PDF files into HTML documents.//\n** the site also contains general tips and alternatives, such as \"[[Embedding PDFs without using JavaScript|https://pdfobject.com/static/]]\"\n"}, {"title":"Webmaster\\Sysadmin Resources","created":"20230207175931355","creator":"Octt","modified":"20230207185026793","modifier":"Octt","tags":"","text":"!!! ''Network''\n\n* [[ping]]\n* [[traceroute]]"}, {"title":"Webrings","created":"20221103220025295","modified":"20230206111552433","modifier":"Octt","tags":"Internet TODO $:/i18n:en","text":"\u003C\u003CMediaWiki Webring en 4>>\n\n!!! ''List of many Webrings''\n\n//I should ask some for joining (with the sitoctt or the octt hub? or the octtkb?)//\n\nLegend:\n\n* ✅: Joined\n* 📅: Waiting\n* ❓: Asked for joining but got ignored (verified through page changes and stuff across weeks/months)\n* ❌: Got rejected\n* ✏️ (or empty): Noted only\n\n---\n\n* ✏️ https://250kb.club, https://512kb.club, https://1mb.club\n* ✅ https://fediring.net\n* ✏️ https://hotlinewebring.club\n* ✏️ https://xhtml.club\n* ✏️ https://webring.xxiivv.com\n* ❓ https://yesterweb.org/webring\n"}, {"title":"Website","created":"20230217225430678","creator":"Octt","modified":"20230217225540214","modifier":"Octt","tags":"Web","text":"\u003C\u003C^wikipediaframe Website>>"}, @@ -1564,7 +1568,7 @@ {"title":"WinWorld","created":"20230209101937765","creator":"Octt","modified":"20230209102412747","modifier":"Octt","tags":"TODO Abandonware","text":"* https://winworldpc.com/home"}, {"title":"WireGuard","created":"20230213171505875","creator":"Octt","modified":"20230213172848043","modifier":"Octt","tags":"VPN Libre Protocol","text":"\u003C\u003CMediaWiki WireGuard en 2>>\n\n* https://www.wireguard.com/\n* https://github.com/WireGuard\n"}, {"title":"Word","created":"20230216193546517","creator":"Octt","modified":"20231220235833698","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Word en>>\n\n!!! Useful, to be remembered\n\n* [[What do you call a member of a federation?|https://english.stackexchange.com/questions/253334/what-do-you-call-a-member-of-a-federation]] (\"federate\")\n\n!!! ''//Interesting// Words/Expressions''\n\nSome words and expressions I discovered and found so interesing I want to save them, ok?\n\n* \u003C\u003CWikipediaL \"Bob's your uncle\">>\n** \"Bob's still your dad's brother\" is an epic way to avoid too many further repetitions.\n* \u003C\u003CWiktionaryL \"ワープロ馬鹿\">> (wāpurobaka)\n* [[The vodka is good, but the meat is rotten|https://www.everything2.com/title/The+vodka+is+good%252C+but+the+meat+is+rotten]]\n"}, -{"title":"WordPress","created":"20230206192842398","creator":"Octt","modified":"20240119172421330","modifier":"Octt","tags":"Web PHP CMS","text":"\\define lwplug(slug, title) [[$title$|https://wordpress.org/plugins/$slug$]]\n\n* \u003C\u003ChttpsL WordPress.com>> --- Corporate site and home page of the SaaS service\n* \u003C\u003ChttpsL WordPress.org>> --- Home page of the open source project\n** [[WordPress Developer Resources|https://developer.wordpress.org]] --- Development resources, guides, references\n** //''[[WordPress Codex|https://codex.wordpress.org/]]'', the online manual for WordPress and a living repository for WordPress information and documentation.//\n\n\u003C\u003C^wikipediaframe WordPress en>>\n\n* [[Stupid WordPress Tricks|https://perishablepress.com/stupid-wordpress-tricks]] (with PHP)\n* [[How to Add Code to WordPress Header and Footer|https://kinsta.com/knowledgebase/add-code-wordpress-header-footer/]]\n\n* [[Wordpress API json, how to get prev and next posts in single post?|https://stackoverflow.com/questions/42546957/wordpress-api-json-how-to-get-prev-and-next-posts-in-single-post/70410781#70410781]] --- not explicitly possible, but achievable for ordering by date, by using exclude of a pivot post id, order asc/desc, and using query after/before a certain date edge\n\n* [[WP Database Description|https://codex.wordpress.org/Database_Description]] --- //outline and description of the database tables created during the standard installation//\n\n* [[WordPress Plugins SVN Mirror|http://web.archive.org/web/20200805015358/http://www.pluginmirror.com/]] (apparently website is dead?) --- //Say hello to fully automated GitHub mirrors of every plugin in the WordPress.org plugin repository.// --- \u003C\u003C[# Git\"https://github.com/wp-plugins\">>\n\n!!! Plugins\n\n* \u003C\u003Clwplug activitypub ActivityPub>> --- //Enter the fediverse with ActivityPub, broadcasting your blog to a wider audience!// --- \u003C\u003C[# Git\"https://github.com/automattic/wordpress-activitypub\">>\n* \u003C\u003Clwplug press-this \"Press This\">> (once part of WP, now an official plugin) --- //Posting images, links, and cat gifs will never be the same.// --- \u003C\u003C[# Support\"https://wordpress.com/support/press-this/\">> \u003C\u003C[# Codex\"https://codex.wordpress.org/Press_This\">>\n** [[Creating Quick Blog Posts with Press This|https://make.wordpress.org/support/user-manual/posts/creating-quick-blog-posts-with-press-this/]]\n* \u003C\u003Clwplug writing-on-github \"Writing On GitHub\">> --- //A WordPress plugin to allow you writing on GitHub (or Jekyll site)//, and vice-versa --- \u003C\u003C[# Git\"https://github.com/litefeel/writing-on-github\">>\n* \u003C\u003Clwplug url-params \"URL Params\">> --- allows you to access URL parameters in the Query String of the URL via shortcodes\n\n!!! Themes\n\n* [[BSoJ|https://wordpress.org/themes/bsoj/]] //(Blue Screen of Joy) is a blog theme inspired by the infamous Blue Screen of Death//\n* [[Stewart|https://wordpress.org/themes/stewart/]] is a modern blogging theme with a left sidebar. Its default color scheme is a striking combination of orange and light gray, to give your blog a sophisticated appearance from day one.\n* [[Tomoni|https://wordpress.org/themes/tomoni/]] is a //theme that displays a use case of multilingual content with Japanese//, with many color palettes\n"}, +{"title":"WordPress","created":"20230206192842398","creator":"Octt","modified":"20240130121341180","modifier":"Octt","page-cover":"https://source.unsplash.com/random?wordpress","tags":"Web PHP CMS","text":"\\define lwplug(slug, title) [[$title$|https://wordpress.org/plugins/$slug$]]\n\n* \u003C\u003ChttpsL WordPress.com>> --- Corporate site and home page of the SaaS service\n* \u003C\u003ChttpsL WordPress.org>> --- Home page of the open source project\n** [[WordPress Developer Resources|https://developer.wordpress.org]] --- Development resources, guides, references\n** //''[[WordPress Codex|https://codex.wordpress.org/]]'', the online manual for WordPress and a living repository for WordPress information and documentation.//\n\n\u003C\u003C^wikipediaframe WordPress en>>\n\n* [[Stupid WordPress Tricks|https://perishablepress.com/stupid-wordpress-tricks]] (with PHP)\n* [[How to Add Code to WordPress Header and Footer|https://kinsta.com/knowledgebase/add-code-wordpress-header-footer/]]\n\n* [[Wordpress API json, how to get prev and next posts in single post?|https://stackoverflow.com/questions/42546957/wordpress-api-json-how-to-get-prev-and-next-posts-in-single-post/70410781#70410781]] --- not explicitly possible, but achievable for ordering by date, by using exclude of a pivot post id, order asc/desc, and using query after/before a certain date edge\n\n* [[WP Database Description|https://codex.wordpress.org/Database_Description]] --- //outline and description of the database tables created during the standard installation//\n\n* [[WordPress Plugins SVN Mirror|http://web.archive.org/web/20200805015358/http://www.pluginmirror.com/]] (apparently website is dead?) --- //Say hello to fully automated GitHub mirrors of every plugin in the WordPress.org plugin repository.// --- \u003C\u003C[# Git\"https://github.com/wp-plugins\">>\n\n!!! Plugins\n\n* \u003C\u003Clwplug activitypub ActivityPub>> --- //Enter the fediverse with ActivityPub, broadcasting your blog to a wider audience!// --- \u003C\u003C[# Git\"https://github.com/automattic/wordpress-activitypub\">>\n* \u003C\u003Clwplug press-this \"Press This\">> (once part of WP, now an official plugin) --- //Posting images, links, and cat gifs will never be the same.// --- \u003C\u003C[# Support\"https://wordpress.com/support/press-this/\">> \u003C\u003C[# Codex\"https://codex.wordpress.org/Press_This\">>\n** [[Creating Quick Blog Posts with Press This|https://make.wordpress.org/support/user-manual/posts/creating-quick-blog-posts-with-press-this/]]\n* \u003C\u003Clwplug writing-on-github \"Writing On GitHub\">> --- //A WordPress plugin to allow you writing on GitHub (or Jekyll site)//, and vice-versa --- \u003C\u003C[# Git\"https://github.com/litefeel/writing-on-github\">>\n* \u003C\u003Clwplug url-params \"URL Params\">> --- allows you to access URL parameters in the Query String of the URL via shortcodes\n\n!!! Themes\n\n* [[BSoJ|https://wordpress.org/themes/bsoj/]] //(Blue Screen of Joy) is a blog theme inspired by the infamous Blue Screen of Death//\n* [[Stewart|https://wordpress.org/themes/stewart/]] is a modern blogging theme with a left sidebar. Its default color scheme is a striking combination of orange and light gray, to give your blog a sophisticated appearance from day one.\n* [[Tomoni|https://wordpress.org/themes/tomoni/]] is a //theme that displays a use case of multilingual content with Japanese//, with many color palettes\n"}, {"title":"X11/Snippets","created":"20220920144224759","modified":"20230206111552465","modifier":"Octt","tags":"Snippets $:/i18n:en","text":"!! Multi-Screen Fixes\n\n!!! LG Flatron W1943SS (R) + TV Toshiba (L)\n\n```sh\nxrandr --output DVI-D-0 --addmode DVI-D-0 1920x1080\nxrandr --output DVI-D-0 --mode 1920x1080 -r 60.00\nxrandr --output DVI-D-0 --left-of HDMI-A-0\n```"}, {"title":"x86_64","created":"20231027105227448","creator":"Octt","modified":"20231027105633633","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe x86_64>>\n\n* \u003C\u003Clinkdesc \"x86-64 Simplified\"\"https://treeniks.github.io/x86-64-simplified\" \"opinionated alternative Instruction Set Reference for the x86-64 Architecture to prioritize readability and simplicity over accuracy or completeness\">>"}, {"title":"XDA Developers:en","created":"20230202230631376","creator":"Octt","modified":"20230206111552467","modifier":"Octt","tags":"$:/i18n:en","text":"\u003C\u003CMediaWiki XDA_Developers en 3>>"}, @@ -1572,7 +1576,7 @@ {"title":"Xiaomi","created":"20230207191250602","creator":"Octt","modified":"20230207191924416","modifier":"Octt","tags":"Company China","text":"\u003C\u003CMediaWiki Xiaomi en 3>>\n\n!!! ''Resources''\n\n!!!! ''Mobile devices''\n\n!!!!! ''Firmwares and tools''\n\n* https://xiaomifirmwareupdater.com/\n* https://xiaomirom.com/en/\n* https://mifirm.net/\n"}, {"title":"Xiaomi Redmi 9T","created":"20230205143148006","creator":"Octt","modified":"20230207191007063","modifier":"Octt","tags":"Android Xiaomi","text":"\u003C\u003CiFrameBypass \"https://www.gsmarena.com/xiaomi_redmi_9t-10670.php\">>\n\u003C!-- \u003C\u003CiFrameBypass \"https://html.duckduckgo.com/html?q=! Redmi 9T site:gsmarena.com\">> -->\n\n!!! ''Resources'' (for `lime`, tested working on `lemon`)\n\n* [[TWRP 3.5.A10 Unofficial (BETA)|https://forum.xda-developers.com/t/recovery-3-5-a10-twrp-unnoficial-for-lime-redmi9t-beta.4233045/]] - [[[Download latest|https://androidfilehost.com/?fid=2188818919693773061]]] [[[Git|https://github.com/geoanto555/android_device_xiaomi_lime]]]\n* [[Project Elixir (Android 13)|https://forum.xda-developers.com/t/rom-12-1-juice-chime-project-elixir-v2-x-official.4413741/]] - [[[Downloads|https://www.pling.com/p/1723537/]]]\n"}, {"title":"XML","created":"20230202225649145","creator":"Octt","modified":"20230823101857409","modifier":"Octt","tags":"$:/i18n:en Markup WIP","text":"\u003C\u003C^WikipediaFrame XML en>>\n\n* [[The XML FAQ|https://xml.silmaril.ie]] --- //Frequently-Asked Questions about the Extensible Markup Language//\n"}, -{"title":"XPath","created":"20230817233205916","creator":"Octt","modified":"20240118233818349","modifier":"Octt","tags":"XML WIP","text":"\u003C\u003C^wikipediaframe XPath>>\n\n* [[XPather|http://xpather.com/]] --- //XPath online real-time tester, evaluator and generator for XML & HTML//\n"}, +{"title":"XPath","created":"20230817233205916","creator":"Octt","modified":"20240130162351619","modifier":"Octt","tags":"XML WIP","text":"\u003C\u003C^wikipediaframe XPath>>\n\n* [[XPather|http://xpather.com/]] --- //XPath online real-time tester, evaluator and generator for XML & HTML//\n\n* [[Getting attribute using XPath|https://stackoverflow.com/questions/4531995/getting-attribute-using-xpath#4532084]] --- `query/to/element/`''`@attribute`''\n"}, {"title":"XSL","created":"20230818075543447","creator":"Octt","modified":"20230818075558395","modifier":"Octt","tags":"XML","text":"\u003C\u003C^wikipediaframe XSL>>\n\n"}, {"title":"XSLT","created":"20230818075444257","creator":"Octt","modified":"20231224001236299","modifier":"Octt","tags":"XSL","text":"\u003C\u003C^wikipediaframe XSLT>>\n\n* [[XSL if test with multiple test conditions|https://stackoverflow.com/questions/21381055/xsl-if-test-with-multiple-test-conditions]] --- `\u003Cxsl:choose> \u003Cxsl:when test=\"expression\"> ...`\n* [[how to check with 2 conditions for test in xsl if\\when|https://stackoverflow.com/questions/1654082/how-to-check-with-2-conditions-for-test-in-xslwhen#1654104]] --- `\u003Cxsl:when test=\"$test1 = 'Yes' or $test1 = 'yes'\">`\n"}, {"title":"YouTube","created":"20230109104559438","creator":"Octt","modified":"20231223000105506","modifier":"Octt","tags":"Internet TODO $:/i18n:en","text":"\u003C\u003C^wikipediaframe YouTube>>\n\n* [[/watch?v=|https://www.youtube.com/watch?v=]] --- as of December 2023, this URL loads the video \u003C\u003CYoutubeL 9xp1XWmJ_Wo \"YouTube is not currently available on this device.\">> (directly, without redirects)\n* [[Infinite-Storage-Glitch|https://github.com/DvorakDwarf/Infinite-Storage-Glitch]] - //Use YouTube as cloud storage for any files// - \u003C\u003C[ \"[[Mirror|https://gitea.it/octo/Infinite-Storage-Glitch]]\">>\n"}, diff --git a/-2.html b/-2.html index 6e2e0d6e..2d4a843c 100644 --- a/-2.html +++ b/-2.html @@ -252,14 +252,15 @@ {"title":"$:/Apps","created":"20230221195029004","creator":"Octt","modified":"20230225144031829","modifier":"Octt","tags":"$:/ToC"}, {"title":"$:/Apps/Dashboard/index.html","text":"\u003C!DOCTYPE html>\n\u003Chtml>\n\u003Chead>\n\u003Cstyle>\n:Root {\n\t--BodyMargin: 8px;\n}\n\nBody {\n\tText-Align: Center;\n\tUser-Select: None;\n\tFont-Family: Sans-Serif;\n\tMargin: Var(--BodyMargin);\n}\n\nA {\n\tColor: #000000;\n\tText-Decoration: None;\n}\nUl {\n\tText-Align: Left;\n\tList-Style: None;\n\tColumn-Count: 1;\n\tMargin-Top: 8px;\n\tMargin-Bottom: 8px;\n\tPadding-Left: 0px;\n\tPadding-Right: 0px;\n}\nLi {\n\tLine-Height: 1.75em;\n\tFont-Size: Larger;\n\tPadding-Left: 8px;\n\tPadding-Right: 8px;\n}\nLi:Hover {\n\tBackground: LightGray;\n}\n\n.SimpleList Li {\n\tWidth: Fit-Content;\n\tWhite-Space: NoWrap;\n}\n\n.TextLineImg {\n\tWidth: 1em;\n\tHeight: 1em;\n\tVertical-Align: Text-Top;\n\tPadding-Right: 8px;\n}\n.Margin4 {\n\tMargin: 4px;\n}\n\n.Dropdown {\n\t/*Position: Relative;*/\n\t/*Display: Inline-Block;*/\n}\n.DropdownBtn {\n\tCursor: Pointer;\n\tBackground: LightGray;\n\tColor: Black;\n}\n.DropdownBody {\n\tDisplay: None;\n\tPosition: Absolute;\n\tWidth: Max-Content;\n\tBackground: White;\n\tBox-Shadow: 0px 8px 8px 0px RGBA(0,0,0,0.2);\n\tZ-Index: 1;\n}\n.DropdownBtn:Hover ~ .DropdownBody,\n.DropdownBody:Hover {\n\tDisplay: Block;\n\t/*Position: Absolute;*/\n}\n.Dropdown Li {\n\tCursor: Pointer;\n\tText-Align: Center;\n}\n.SearchDiv {\n\tWidth: Max-Content;\n}\n.DropdownBtn, Input[Type=\"Text\"] {\n\tFont-Size: Larger;\n}\n\u003C/style>\n\u003C/head>\n\u003Cbody>\n\u003Cdiv id=\"ClockDiv\" style=\"/*Margin: Calc(Var(--BodyMargin) * -1); Background:Black; Color: White;*/\">\n\t\u003Ch2 id=\"ClockTime\" class=\"Margin4\">\u003C/h2>\n\t\u003Cp id=\"ClockDate\" class=\"Margin4\">\u003C/p>\n\u003C/div>\n\u003Chr>\n\u003Ctable id=\"SearchDiv\">\u003Ctr>\n\u003Ctd>\n\t\u003Cdiv class=\"Dropdown\">\n\t\t\u003Cbutton class=\"DropdownBtn\" id=\"EnginesBtn\" style=\"Width:Max-Content;\">\u003Cimg id=\"EnginesCurrentIcon\" class=\"TextLineImg\" style=\"Vertical-Align:Sub;\">\u003Cspan id=\"EnginesCurrent\">\u003C/span>\u003C/button>\n\t\t\u003Cdiv class=\"DropdownBody\" id=\"EnginesDropdown\">\n\t\t\t\u003Cul id=\"EnginesList\">\u003C/ul>\n\t\t\u003C/div>\n\t\u003C/div>\n\u003C/td>\u003Ctd style=\"Width:100%;\">\n\t\u003Cinput type=\"text\" id=\"SearchInput\" onfocus=\"this.select();\" style=\"Width:Calc(100% - Var(--BodyMargin));\">\n\u003C/td>\n\u003C/tr>\u003C/table>\n\u003Cul id=\"BookmarksList\" class=\"SimpleList\">\u003C/ul>\n\n\u003Cscript>\nconst SearchEngines = {\n\t\"Whoogle\": \"https://www.whoogle.click/search?q=\",\n\t\"Wikipedia [\u003Ctt>EN\u003C/tt>]\": \"https://en.wikipedia.org/w/index.php?search=\",\n\t\"Wikipedia [\u003Ctt>IT\u003C/tt>]\": \"https://it.wikipedia.org/w/index.php?search=\",\n\t\"Invidious\": \"https://invidious.baczek.me/search?q=\",\n\t\"WordReference [\u003Ctt>EN->IT\u003C/tt>]\": \"https://www.wordreference.com/enit/\",\n\t\"WordReference [\u003Ctt>IT->EN\u003C/tt>]\": \"https://www.wordreference.com/iten/\"\n};\n\nconst Bookmarks = `\nhttp://octt.ddns.net:8017 FreshRSS;\nhttp://octt.ddns.net:8036 Wallabag;\nhttps://cryptpad.devol.it/drive CryptPad;\nhttps://www.deepl.com/translator DeepL;\nhttps://gitea.it Gitea;\nhttps://github.com GitHub;\nhttps://gitlab.com GitLab;\nhttps://librespeed.org LibreSpeed;\nhttps://odysee.com Odysee;\nhttps://www.openstreetmap.org OpenStreetMap;\nhttps://app.standardnotes.com Standard Notes;\nhttps://temp-mail.org/en Temp Mail;\nhttps://voidlinux.org/packages Void Linux/Packages;\nhttps://www.wikipedia.org Wikipedia;\nhttps://mail.yahoo.com Yahoo Mail;\n`;\n\nfunction GetImgAverageColor(Img) {\n\tconst colorThief = new ColorThief();\n\tif (Img.complete) {\n\t\treturn colorThief.getColor(Img);\n\t} else {\n\t\timage.addEventListener(\"load\", function() {\n\t\t\treturn colorThief.getColor(Img);\n\t\t});\n\t};\n};\n\n/* https://stackoverflow.com/a/2998874 */\nfunction ZeroPad(Num, Pad) {\n\tvar Zero = Pad - Num.toString().length + 1;\n\treturn Array(+(Zero > 0 && Zero)).join(\"0\") + Num;\n};\nfunction TimePad(Num) {\n\treturn ZeroPad(Num, 2);\n};\n\nfunction SetTime() {\n\tlet Time = new Date();\n\tlet Y = Time.getFullYear();\n\tlet M = TimePad(Time.getMonth() + 1);\n\tlet D = TimePad(Time.getDate()); /* Month day */\n\tlet N = Time.getDay(); /* Week day */\n\tlet h = TimePad(Time.getHours());\n\tlet m = TimePad(Time.getMinutes());\n\tlet s = TimePad(Time.getSeconds());\n\tClockTime.textContent = h + \":\" + m + \":\" + s;\n\tClockDate.textContent = Y + \"-\" + M + \"-\" + D;\n};\n\nfunction GetFavicon(URL) {\n\treturn \"https://icons.duckduckgo.com/ip3/\" + URL.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] + \".ico\";\n};\nfunction GetLineFavicon(URL) {\n\treturn '\u003Cimg class=\"TextLineImg\" src=\"' + GetFavicon(URL) + '\">'\n};\n\nfunction LoadBookmarks() {\n\tlet UlURLs = \"\";\n\tlet List = Bookmarks.trim().split(\";\");\n\tfor (let i=0; i\u003CList.length; i++) {\n\t\tlet Item = List[i].trim();\n\t\tif (Item) {\n\t\t\tlet Split = Item.indexOf(\" \");\n\t\t\tlet Href = Item.substring(0, Split);\n\t\t\tlet Name = Item.substring(Split+1);\n\t\t\tUlURLs += '\u003Cli>\u003Ca href=\"' + Href + '\" target=\"_blank\" rel=\"noopener\">' + GetLineFavicon(Href) + Name + '\u003C/a>\u003C/li>';\n\t\t};\n\t};\n\tBookmarksList.innerHTML += UlURLs;\n};\n\nfunction LoadSearchEngines() {\n\tEnginesCurrent.innerHTML = Object.keys(SearchEngines)[0];\n\tEnginesCurrentIcon.src = GetFavicon(SearchEngines[EnginesCurrent.innerHTML]);\n\tObject.keys(SearchEngines).forEach(function(Key) {\n\t\tEnginesList.innerHTML += \"\u003Cli onclick=\\\"EnginesCurrent.innerHTML=`\" + Key + \"`; EnginesCurrentIcon.src=`\" + GetFavicon(SearchEngines[Key]) + \"`;\\\">\" + GetLineFavicon(SearchEngines[Key]) + Key + \"\u003C/li>\";\n\t});\n};\n\nfunction ClockDateToggle() {\n\tClockDate.hidden = !ClockDate.hidden;\n};\nClockDiv.onclick = ClockDateToggle;\n\nSearchInput.onkeydown = function(e) {\n\tif (e.keyCode == 13) {\n\t\t// Only open search URL if textbox contains text, else open parent path (often site root)\n\t\twindow.open(SearchInput.value ? SearchEngines[EnginesCurrent.innerHTML] + SearchInput.value : SearchEngines[EnginesCurrent.innerHTML].split(\"/\").slice(0,-1).join(\"/\"));\n\t};\n};\n\nEnginesBtn.onclick = function() {\n\t\n};\nEnginesBtn.onmouseenter = function() {\n\t\n};\nEnginesBtn.onmouseleave = function() {\n\t\n};\n\nsetInterval(() => {\n\tSetTime();\n}, 150);\n\nLoadBookmarks();\nLoadSearchEngines();\n\u003C/script>\n\u003C/body>\n\u003C/html>","type":"text/html","created":"20221108215403917","modified":"20230108130553489","tags":""}, {"title":"$:/Apps/Dashboard/Style.css","text":":Root {\n\t--BodyMargin: 8px;\n}\n\nBody {\n\tText-Align: Center;\n\tUser-Select: None;\n\tFont-Family: Sans-Serif;\n\tMargin: Var(--BodyMargin);\n}\n\nA {\n\tColor: Black;\n\tText-Decoration: None;\n}\nUl {\n\tText-Align: Left;\n\tList-Style: None;\n\tColumn-Count: 1;\n\tMargin-Top: 8px;\n\tMargin-Bottom: 8px;\n\tPadding-Left: 0px;\n\tPadding-Right: 0px;\n}\nLi {\n\tLine-Height: 1.75em;\n\tFont-Size: Larger;\n\tPadding-Left: 8px;\n\tPadding-Right: 8px;\n}\nLi:Hover {\n\tBackground: LightGray;\n}\n\n.SimpleList Li {\n\tWidth: Fit-Content;\n}\n\n.TextLineImg {\n\tWidth: 1em;\n\tHeight: 1em;\n\tVertical-Align: Text-Top;\n\tPadding-Right: 8px;\n}\n.Margin4 {\n\tMargin: 4px;\n}\n\n.Dropdown {\n\tPosition: Relative;\n\tDisplay: Inline-Block;\n}\n.DropdownBtn {\n\tCursor: Pointer;\n\tBackground: LightGray;\n\tColor: Black;\n}\n.DropdownBody {\n\tDisplay: None;\n\tPosition: Absolute;\n\tWidth: Max-Content;\n\tBackground: White;\n\tBox-Shadow: 0px 8px 8px 0px RGBA(0,0,0,0.2);\n\tZ-Index: 1;\n}\n.DropdownBtn:Hover ~ .DropdownBody,\n.DropdownBody:Hover {\n\tDisplay: Block;\n\tPosition: Absolute;\n}\n.Dropdown Li {\n\tCursor: Pointer;\n\tText-Align: Center;\n}\n.SearchDiv {\n\tWidth: Max-Content;\n}\n.DropdownBtn, Input[Type=\"Text\"] {\n\tFont-Size: Larger;\n}","created":"20221108222403364","modified":"20221108222437545","tags":"","type":"text/css"}, -{"title":"$:/Apps/MagicBox",".context":"1",".type":"masonry",".width":"33","created":"20240129095948486","creator":"Octt","modified":"20240129171354932","modifier":"Octt","tags":"$:/Apps","text":"\\define SearchResults(fields)\n\u003C$list filter=\"[!is[system]search:$fields${$:/temp/MagicBox!!.input}sort[title]limit[150]]\">\n\t\u003Cdiv class=`MagicBoxApplet result ${[{$:/Apps/MagicBox!!.type}]}$` style=`background-image: url(\"${[{!!page-cover}]}$\");`>\n\t\t\u003C$button class=\"tc-btn-invisible\">\n\t\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CcloseOnChoose>>/>\n\t\t\t\u003C$action-navigate $to={{!!title}}/>\n\t\t\t\u003C!--\u003C$link to={{!!title}}>-->\n\t\t\t\t\u003Ch3>\n\t\t\t\t\t\u003C$link to={{!!title}} tabindex=\"-1\"/>\n\t\t\t\t\u003C/h3>\n\t\t\t\t\u003C$if value={{$:/Apps/MagicBox!!.context}}>\n\t\t\t\t\t\u003C$context term={{$:/temp/MagicBox!!.input}} $tabindex=\"-1\"/>\n\t\t\t\t\u003C/$if>\n\t\t\t\u003C!--\u003C/$link>-->\n\t\t\u003C/$button>\n\t\u003C/div>\n\u003C/$list>\n\\end\n\n\u003Cdiv class=\"MagicBoxApplet options\">\n\t\u003C$edit-text tiddler=\"$:/temp/MagicBox\" field=\".input\" class=\"_input\" placeholder=\"Search...\" tabindex=\"0\"/>\n\t\u003C$checkbox field=\".context\" checked=\"1\">Context\u003C/$checkbox>\n\t\u003C!--\u003C$edit-text field=\".type\" placeholder=\"Display Type\"/>-->\n\t\u003C$checkbox field=\".type\" checked=\"grid\" unchecked=\"masonry\">Fixed Grid\u003C/$checkbox>\n\t\u003C$range field=\".width\" min=\"24\" max=\"49\"/>{{!!.width}}%\n\u003C/div>\n\n\u003C$action-sendmessage $message=\"tm-focus-selector\" $param=\".MagicBoxApplet.options > ._input\"/>\n\u003C\u003Cscript script='try {\n\tdocument.querySelector(\".MagicBoxApplet.options > ._input\")?.focus();\n\tdocument.querySelector(\"div.tc-tiddler-frame.tc-tiddler-view-frame[data-tiddler-title=\\\"$:/Apps/MagicBox/Overlay\\\"] .MagicBoxApplet.options > ._input\")?.focus();\n} catch(e) { $OcttKB.ErrAtLine(e) }'>>\u003C\u003Cscript off>>\n\n\u003Cstyle>\n\t.MagicBoxApplet.result {\n\t\tmargin: 8px;\n\t\tdisplay: inline-block;\n\t\tbackground-color: lightgray;\n\t\tbackground-size: cover;\n\t\tbackground-position: center;\n\t}\n\t.MagicBoxApplet.result.grid {\n\t\twidth: calc({{!!.width}}% - 16px);\n\t\taspect-ratio: 16/9;\n\t\tvertical-align: top;\n\t}\n\t.MagicBoxApplet.result.masonry {\n\t\tmax-width: calc({{!!.width}}% - 16px);\n\t}\n\t.MagicBoxApplet.result h3 {\n\t\tmargin-top: 25%;\n\t\tpadding: 8px;\n\t\tbackground-color: rgba(255, 255, 255, 0.75);\n\t\ttext-align: center;\n\t}\n\t.MagicBoxApplet.result pre {\n\t\tcolor: initial;\n\t\tmax-height: 7em;\n\t\toverflow-y: auto;\n\t\tmargin: 0;\n\t\ttop: 1em;\n\t\tposition: relative;\n\t\ttext-align: initial;\n\t}\n\t.MagicBoxApplet.result h3 > a {\n\t\tpointer-events: none;\n\t}\n\t.MagicBoxApplet.result > a,\n\t.MagicBoxApplet.result > button {\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\t.MagicBoxApplet.result > a:after {\n\t\tcontent: \"\" !important;\n\t}\n\u003C/style>\n\n\u003C$if value={{{ [{$:/temp/MagicBox!!.input}split[]count[]compare:integer:gteq[3]then[1]] }}}>\n\tTitle or Caption matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"title,caption\">>\n\n\t\u003Cdiv>\u003Cbr/>\u003Chr/>\u003Cbr/>\u003C/div>\n\n\tTags or Text matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"tags,text\">>\n\u003C/$if>"}, -{"title":"$:/Apps/MagicBox/Buttons/Open-MagicBox","created":"20240129160009781","creator":"Octt","list-before":"$:/core/ui/Buttons/more-page-actions","modified":"20240129165212023","modifier":"Octt","tags":"$:/tags/PageControls","text":"\u003C$button tooltip=\"Open MagicBox\" class=\"tc-btn-invisible\">\n\t🪟️\n\t\u003C!--\u003C$action-navigate $to=\"$:/Apps/MagicBox/Overlay\"/>-->\n\t{{$:/Apps/MagicBox/Shortcuts/Open-MagicBox}}\n\u003C/$button>"}, +{"title":"$:/Apps/MagicBox",".context":"1",".type":"masonry",".width":"33","created":"20240129095948486","creator":"Octt","modified":"20240129234018781","modifier":"Octt","tags":"$:/Apps","text":"\\define SearchResults(fields)\n\u003C$list filter=\"[!is[system]search:$fields${$:/temp/MagicBox!!.input}sort[title]limit[100]]\">\n\t\u003Cdiv class=`MagicBoxApplet result ${[{$:/Apps/MagicBox!!.type}]}$` style=`background-image: url(\"${[{!!page-cover}]}$\");`>\n\t\t\u003C$button class=\"tc-btn-invisible\">\n\t\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CcloseOnChoose>>/>\n\t\t\t\u003C$action-navigate $to={{!!title}}/>\n\t\t\t\u003C!--\u003C$link to={{!!title}}>-->\n\t\t\t\t\u003Ch3>\n\t\t\t\t\t\u003C$link to={{!!title}} tabindex=\"-1\"/>\n\t\t\t\t\u003C/h3>\n\t\t\t\t\u003C$if value={{$:/Apps/MagicBox!!.context}}>\n\t\t\t\t\t\u003C$context term={{$:/temp/MagicBox!!.input}} tabindex=\"-1\"/>\n\t\t\t\t\u003C/$if>\n\t\t\t\u003C!--\u003C/$link>-->\n\t\t\u003C/$button>\n\t\u003C/div>\n\u003C/$list>\n\\end\n\n\u003Cdiv class=\"MagicBoxApplet options\">\n\t\u003C$checkbox field=\".context\" checked=\"1\">Context\u003C/$checkbox>\n\t \n\t\u003C!--\u003C$edit-text field=\".type\" placeholder=\"Display Type\"/>-->\n\t\u003C$checkbox field=\".type\" checked=\"grid\" unchecked=\"masonry\">Fixed Grid\u003C/$checkbox>\n\t \n\t\u003C$range field=\".width\" min=\"19\" max=\"49\"/>{{!!.width}}\n\t \n\t\u003C$edit-text tiddler=\"$:/temp/MagicBox\" field=\".input\" class=\"_input\" placeholder=\"Search...\" tabindex=\"0\"/>\n\u003C/div>\n\n\u003C$action-sendmessage $message=\"tm-focus-selector\" $param=\".MagicBoxApplet.options > ._input\"/>\n\u003C\u003Cscript script='try {\n\tdocument.querySelector(\".MagicBoxApplet.options > ._input\")?.focus();\n\tdocument.querySelector(\"div.tc-tiddler-frame.tc-tiddler-view-frame[data-tiddler-title=\\\"$:/Apps/MagicBox/Overlay\\\"] .MagicBoxApplet.options > ._input\")?.focus();\n} catch(e) { $OcttKB.ErrAtLine(e) }'>>\u003C\u003Cscript off>>\n\n\u003Cstyle>\n\t@media (max-width: 500px) {\n\t\t.MagicBoxApplet.result {\n\t\t\tmin-width: calc(({{!!.width}}% * 2) - 16px) !important;\n\t\t\tmax-width: calc(({{!!.width}}% * 3) - 16px) !important;\n\t\t}\n\t}\n\t.MagicBoxApplet.result {\n\t\tmargin: 8px;\n\t\tdisplay: inline-block;\n\t\tbackground-color: lightgray;\n\t\tbackground-size: cover;\n\t\tbackground-position: center;\n\t}\n\t.MagicBoxApplet.result.grid {\n\t\twidth: calc({{!!.width}}% - 16px);\n\t\taspect-ratio: 16/9;\n\t\tvertical-align: top;\n\t}\n\t.MagicBoxApplet.result.masonry {\n\t\tmax-width: calc({{!!.width}}% - 16px);\n\t}\n\t.MagicBoxApplet.result h3 {\n\t\tmargin-top: 25%;\n\t\tpadding: 8px;\n\t\tbackground-color: rgba(255, 255, 255, 0.75);\n\t\ttext-align: center;\n\t}\n\t.MagicBoxApplet.result pre {\n\t\tcolor: initial;\n\t\tmax-height: 7em;\n\t\toverflow-y: auto;\n\t\tmargin: 0;\n\t\ttop: 1em;\n\t\tposition: relative;\n\t\ttext-align: initial;\n\t}\n\t.MagicBoxApplet.result h3 > a {\n\t\tpointer-events: none;\n\t}\n\t.MagicBoxApplet.result > a,\n\t.MagicBoxApplet.result > button {\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t}\n\t.MagicBoxApplet.result > a:after {\n\t\tcontent: \"\" !important;\n\t}\n\u003C/style>\n\n\u003C$if value={{{ [{$:/temp/MagicBox!!.input}split[]count[]compare:integer:gteq[3]then[1]] }}}>\n\t\u003C$if value={{{ [!is[system]search:title{$:/temp/MagicBox!!.input}then[]else[1]] }}}>\n\t\t\u003C$button>\n\t\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CcloseOnChoose>>/>\n\t\t\t\u003C$action-sendmessage $message=\"tm-new-tiddler\" title={{$:/temp/MagicBox!!.input}} />\n\t\t\tCreate as New Tiddler\n\t\t\u003C/$button>\n\t\u003C/$if>\n\n\t\u003Cdiv>\u003Cbr/>\u003Chr/>\u003Cbr/>\u003C/div>\n\n\tTitle or Caption matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"title,caption\">>\n\n\t\u003Cdiv>\u003Cbr/>\u003Chr/>\u003Cbr/>\u003C/div>\n\n\tTags or Text matches:\n\t\u003Cbr/>\u003C\u003CSearchResults \"tags,text\">>\n\u003C/$if>"}, +{"title":"$:/Apps/MagicBox/Buttons/Toggle-MagicBox","created":"20240129160009781","creator":"Octt","list-before":"$:/core/ui/Buttons/more-page-actions","modified":"20240129223619782","modifier":"Octt","tags":"$:/tags/PageControls","text":"\\define label() Toggle MagicBox\n\\whitespace trim\n\u003C$button tooltip=\u003C\u003Clabel>> class=\u003C\u003Ctv-config-toolbar-class>>>\n\t\u003C$if value=\u003C\u003Ctv-config-toolbar-icons>> match=\"yes\">\n\t\t🪟️\n\t\u003C/$if>\n\t\u003C$if value=\u003C\u003Ctv-config-toolbar-text>> match=\"yes\">\n\t\t\u003Cspan class=\"tc-btn-text\">\n\t\t\t\u003C$text text=\u003C\u003Clabel>>/>\n\t\t\u003C/span>\n\t\u003C/$if>\n\t{{$:/Apps/MagicBox/Shortcuts/Toggle-MagicBox}}\n\u003C/$button>"}, {"title":"$:/Apps/MagicBox/Overlay","created":"20240129145705629","creator":"Octt","modified":"20240129161333542","modifier":"Octt","tags":"","text":"\\define @thisOverlay() section.tc-story-river > div.tc-tiddler-frame.tc-tiddler-view-frame[data-tiddler-title=\"\u003C$text text=\u003C\u003CcurrentTiddler>>/>\"]\n\u003Cstyle>\n\t\u003C\u003C@thisOverlay>> {\n\t\tposition: fixed;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tz-index: 9999;\n\t\twidth: 100vw;\n\t\theight: 100vh;\n\t\toverflow-y: auto;\n\t}\n\t\u003C\u003C@thisOverlay>> div.tc-tiddler-title,\n\t\u003C\u003C@thisOverlay>> div.tc-titlebar {\n\t\tbackground: none;\n\t\theight: 0;\n\t}\n\t\u003C\u003C@thisOverlay>> .tc-tiddler-controls button {\n\t\tdisplay: none;\n\t}\n\t\u003C\u003C@thisOverlay>> .tc-tiddler-controls button[class*=\"tc-btn-%24%3A%2Fcore%2Fui%2FButtons%2Fclose\"] {\n\t\tdisplay: revert;\n\t\tposition: fixed;\n\t\ttop: 0px;\n\t right: 8px;\n\t}\n\t\u003C\u003C@thisOverlay>> .View-Breadcrumbs,\n\t\u003C\u003C@thisOverlay>> div.OcttKB-i18n,\n\t\u003C\u003C@thisOverlay>> div.tc-subtitle {\n\t\tdisplay: none;\n\t}\n\u003C/style>\n\u003C$set name=closeOnChoose value=\u003C\u003CcurrentTiddler>>>\n\t{{$:/Apps/MagicBox}}\n\u003C/$set>"}, -{"title":"$:/Apps/MagicBox/Shortcuts/Open-MagicBox","created":"20240129163942191","creator":"Octt","key":"((Open-MagicBox))","modified":"20240129170319526","modifier":"Octt","tags":"$:/tags/KeyboardShortcut","text":"\\whitespace trim\n\u003C$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n \u003C$action-navigate $to=\"$:/Apps/MagicBox/Overlay\" $scroll=\"yes\"/>\n \u003C!--\u003C$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/Apps/MagicBox/Overlay\"] ._input\"\"\" preventScroll=\"true\"/>-->\n\u003C/$navigator>"}, +{"title":"$:/Apps/MagicBox/readme","created":"20240129220613684","creator":"Octt","modified":"20240129225200513","modifier":"Octt","tags":"","text":"This currently work-in-progress, experimental applet provides a \"magic box\", allowing for wiki content to be searched in a visually effective way: a full-screen interface complete with previews and covers.\n\n* Thread: [[https://talk.tiddlywiki.org/t/wiki-search-grid-with-covers-and-content-preview-prototype/9003]]\n\nInstall in other wiki by drag-and-drop:\n\n# \u003C$draggable tag=\"button\" filter=\"[[$:/Apps/MagicBox]] [prefix[$:/Apps/MagicBox/]] [tag[$:/Apps/MagicBox]] [tag[$:/Apps/MagicBox/Attached]]\">\n\tAll applet files\n\u003C/$draggable>\n\n# (Required dependency) \u003C$draggable tag=\"button\" filter=\"[[$:/plugins/ebalster/condition]]\">\n\t`ebalster/condition` plugin\n\u003C/$draggable>\n\n# (Optional dependency, required to show content) \u003C$draggable tag=\"button\" filter=\"[[$:/plugins/danielo515/ContextPlugin/Stylesheet/results]] [[$:/plugins/danielo515/ContextPlugin/widgets/context.js]]\">\n\tCore files of `danielo515/ContextPlugin` plugin, modified to allow `tabindex=-1`\n\u003C/$draggable>"}, +{"title":"$:/Apps/MagicBox/Shortcuts/Toggle-MagicBox","created":"20240129163942191","creator":"Octt","key":"((Toggle-MagicBox))","modified":"20240129232038489","modifier":"Octt","tags":"$:/tags/KeyboardShortcut","text":"\\define appTiddler() $:/Apps/MagicBox/Overlay\n\\whitespace trim\n\u003C$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\t\u003C$if not value={{{[[$:/StoryList]contains\u003CappTiddler>]}}}>\n\t\t\u003C$action-navigate $to=\u003C\u003CappTiddler>> $scroll=\"yes\"/>\n\t\u003C/$if>\u003C$else>\n\t\t\u003C$action-sendmessage $message=\"tm-close-tiddler\" $param=\u003C\u003CappTiddler>>/>\n\t\u003C/$else>\n \u003C!--\u003C$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/Apps/MagicBox/Overlay\"] ._input\"\"\" preventScroll=\"true\"/>-->\n\u003C/$navigator>"}, {"title":"$:/AudioExperiments","created":"20230919165712277","creator":"Octt","modified":"20230919201731555","modifier":"Octt","tags":"$:/Tools","text":"\u003Cdiv>Silent: \u003C\u003CHtmlAttrWikify audio src '\u003C$macrocall $name=datauri title=\"$:/Res/silence.opus\" $output=\"text/plain\"/>' Attrs:'controls loop'>>\u003C/div>\n\u003Cdiv>Music: \u003Caudio src=\"//hlb0.octt.eu.org/Res/LoveLab-Ext.webm\" controls loop>\u003C/audio>\u003C/div>\n\u003C\u003CiFrameTid \"$:/AudioExperiments/AudioContext\">>"}, {"title":"$:/AudioExperiments/AudioContext","text":"\u003C!DOCTYPE html>\n\u003Chtml>\n \u003Chead>\n \u003Cmeta charset=\"utf-8\"/>\n \u003Cmeta name=\"viewport\" content=\"width=device-width\"/>\n \u003C/head>\n \u003Cbody>\n \u003Cbutton>Create\u003C/button>\n \u003Cbutton>Suspend\u003C/button>\n \u003Cbutton>Stop\u003C/button>\n \u003Cscript>\n let audioCtx;\n const startBtn = document.querySelector(\"button:nth-of-type(1)\");\n const susresBtn = document.querySelector(\"button:nth-of-type(2)\");\n const stopBtn = document.querySelector(\"button:nth-of-type(3)\");\n susresBtn.setAttribute(\"disabled\", \"disabled\");\n stopBtn.setAttribute(\"disabled\", \"disabled\");\n\n startBtn.onclick = () => {\n startBtn.setAttribute(\"disabled\", \"disabled\");\n susresBtn.removeAttribute(\"disabled\");\n stopBtn.removeAttribute(\"disabled\");\n audioCtx = new AudioContext();\n const oscillator = new OscillatorNode(audioCtx, { frequency: 1000 });\n const gainNode = new GainNode(audioCtx, { gain: 0.1 });\n oscillator.connect(gainNode);\n gainNode.connect(audioCtx.destination);\n oscillator.start(0);\n };\n\n susresBtn.onclick = () => {\n if (audioCtx.state === \"running\") {\n audioCtx.suspend().then(() => {\n susresBtn.textContent = \"Resume\";\n });\n } else if (audioCtx.state === \"suspended\") {\n audioCtx.resume().then(() => {\n susresBtn.textContent = \"Suspend\";\n });\n }\n };\n\n stopBtn.onclick = () => {\n audioCtx.close().then(() => {\n startBtn.removeAttribute(\"disabled\");\n susresBtn.setAttribute(\"disabled\", \"disabled\");\n susresBtn.textContent = \"Suspend\";\n stopBtn.setAttribute(\"disabled\", \"disabled\");\n });\n };\n \u003C/script>\n \u003C/body>\n\u003C/html>","type":"text/html","created":"20230919165216265","creator":"Octt","modified":"20230919170921899","modifier":"Octt","tags":""}, {"title":"$:/Commander","created":"20230206111434304","creator":"Octt","icon":"$:/plugins/kookma/commander/images/commander.svg","modified":"20230206111436542","modifier":"Octt","tags":"$:/Tools","type":"text/vnd.tiddlywiki","text":"\\import [all[shadows+tiddlers]tag[$:/tags/Commander/Macro]]\n{{$:/plugins/kookma/commander/search/ui}}\n\u003C!-- Create the search filter based on searchbox and selective operation (if active) -->\n\u003C$vars searchTerms={{{ [\u003CsearchboxTid>get[text]minlength{$:/plugins/kookma/commander/config/minlength}]~[[$:/errorCode:-23500]] }}} pattern=\"^\\[\">\u003C!-- this part checks the combo search and selective ops-->\n\u003C$set name=\"filtertext\" filter=\"[\u003CsearchTerms>regexp\u003Cpattern>]\" value=\"[subfilter\u003CsearchTerms>]\" emptyValue=\"[!is[system]search\u003CsearchTerms>]\">\n\u003C$set name=\"searchfilter\" filter=\"[\u003CselectiveOpsTid>get[text]match[yes]]\" \n\tvalue=\"[subfilter\u003Cfiltertext>!prefix[$:/temp/commander]]+[tag\u003CworkingTag>]\" emptyValue=\"[subfilter\u003Cfiltertext>!prefix[$:/temp/commander]]\" >\n\u003Csmall style=\"margin-left:17ch;\">\u003Ci>\u003C$count filter=\"[subfilter\u003Cfiltertext>!prefix[$:/temp/commander]!is[missing]]\" /> matches \u003C/i>\u003C/small>\n\n\u003C!-- Display search results and let selective operation -->\n\u003C\u003Ccommander-slider title:\"$:/plugins/kookma/commander/search/selection\" default:\"open\">>\n\n\u003C!-- Display operation UIs-->\n\u003C\u003Ctabs \"[all[shadows+tiddlers]tag[$:/tags/Commander]!has[draft.of]]\" default:\"$:/plugins/kookma/commander/tiddler/ui\">>\n\n\u003C/$set>\n\u003C/$set>\n\u003C$vars>\n\n---\n\n\u003C\u003Ccommander-slider title:\"$:/plugins/kookma/commander/log/ui\">>\n"}, -{"title":"$:/config/AnimationDuration","created":"20220920161126651","creator":"Octt","modified":"20231110115023937","modifier":"Octt","text":"80"}, +{"title":"$:/config/AnimationDuration","created":"20220920161126651","creator":"Octt","modified":"20240129184006474","modifier":"Octt","text":"60"}, {"title":"$:/config/AutoSave","created":"20221104154054601","modified":"20221104154054601","text":"no"}, {"title":"$:/config/BrowserStorage/Enabled","text":"yes"}, {"title":"$:/config/BrowserStorage/SaveFilter","created":"20230926093044291","creator":"Octt","modified":"20230926093044291","modifier":"Octt","text":"[all[]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]]"}, @@ -281,6 +282,7 @@ {"title":"$:/Config/OcttKB/Tweaks/Starlight/.tc-story-river Padding","created":"20230110211056385","creator":"Octt","modified":"20230920145116273","modifier":"Octt","text":"20px 20px 20px 32px"}, {"title":"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions","created":"20220920092318354","modified":"20220920092318355","text":"show"}, {"title":"$:/config/PageControlButtons/Visibility/$:/plugins/kookma/commander/buttons/pagecontrol","created":"20230128224610468","creator":"Octt","modified":"20230128224610468","modifier":"Octt","text":"hide"}, +{"title":"$:/config/PageControlButtons/Visibility/$:/plugins/tiddlywiki/markdown/new-markdown-button","created":"20240129223645518","creator":"Octt","modified":"20240129223645518","modifier":"Octt","text":"hide"}, {"title":"$:/config/PageControlButtons/Visibility/$:/Styles/Ribbon.xml","created":"20230129120434151","creator":"Octt","modified":"20230129120436862","modifier":"Octt","text":"show"}, {"title":"$:/config/Plugins/Disabled/$:/plugins/btheado/BrowserStorage","created":"20230926092924945","creator":"Octt","modified":"20230926093641406","modifier":"Octt","text":"no"}, {"title":"$:/config/Plugins/Disabled/$:/plugins/Gk0Wk/focused-tiddler","created":"20230124125356042","creator":"Octt","modified":"20230211173407801","modifier":"Octt","text":"no"}, @@ -293,7 +295,7 @@ {"title":"$:/config/RelinkOnRename","created":"20220920160922870","creator":"Octt","modified":"20230817233014551","modifier":"Octt","text":"yes"}, {"title":"$:/config/SaverFilter","created":"20230926140342113","creator":"Octt","modified":"20230926140450988","modifier":"Octt","text":"[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]] -[prefix[$:/info/browser/storage/]]\n"}, {"title":"$:/config/ShortcutInfo/EditorToolbar/SquaredLink","created":"20231223130748024","creator":"Octt","modified":"20231223130829468","modifier":"Octt","tags":"","text":"SquaredLink: <<[# Name Target>>"}, -{"title":"$:/config/ShortcutInfo/Open-MagicBox","created":"20240129164312864","modified":"20240129164319981","tags":""}, +{"title":"$:/config/ShortcutInfo/Toggle-MagicBox","created":"20240129164312864","creator":"Octt","modified":"20240129225034425","modifier":"Octt","tags":"$:/Apps/MagicBox/Attached"}, {"title":"$:/config/shortcuts-mac/bold","created":"20231221120736673","creator":"Octt","modified":"20231221120736673","modifier":"Octt"}, {"title":"$:/config/shortcuts-mac/italic","created":"20231221120910891","creator":"Octt","modified":"20231221120910891","modifier":"Octt"}, {"title":"$:/config/shortcuts-mac/new-image","created":"20231221120854322","creator":"Octt","modified":"20231221120854322","modifier":"Octt"}, @@ -343,7 +345,6 @@ {"title":"$:/config/shortcuts/mono-line","created":"20231221120856114","creator":"Octt","modified":"20231221122711884","modifier":"Octt","text":"ctrl-M"}, {"title":"$:/config/shortcuts/new-image","created":"20231221122804525","creator":"Octt","modified":"20231221122829686","modifier":"Octt"}, {"title":"$:/config/shortcuts/new-tiddler","created":"20231221122822021","creator":"Octt","modified":"20231221122822021","modifier":"Octt","text":"shift-alt-N"}, -{"title":"$:/config/shortcuts/Open-MagicBox","created":"20240129165246939","creator":"Octt","modified":"20240129165246939","modifier":"Octt","text":"ctrl-O"}, {"title":"$:/config/shortcuts/picture","created":"20231221120840410","creator":"Octt","modified":"20231221122839334","modifier":"Octt","text":"ctrl-shift-I"}, {"title":"$:/config/shortcuts/preview","created":"20231221120838258","creator":"Octt","modified":"20231221144159815","modifier":"Octt","text":"shift-alt-P"}, {"title":"$:/config/shortcuts/quote","created":"20231221120836161","creator":"Octt","modified":"20231221121432673","modifier":"Octt","text":"ctrl-alt-Q"}, @@ -360,6 +361,7 @@ {"title":"$:/config/shortcuts/strikethrough","created":"20231221120808649","creator":"Octt","modified":"20231221121257759","modifier":"Octt","text":"ctrl-alt-S"}, {"title":"$:/config/shortcuts/subscript","created":"20231221120805561","creator":"Octt","modified":"20231221144226895","modifier":"Octt","text":"ctrl-alt-B"}, {"title":"$:/config/shortcuts/superscript","created":"20231221120803713","creator":"Octt","modified":"20231221144246691","modifier":"Octt","text":"ctrl-alt-P"}, +{"title":"$:/config/shortcuts/Toggle-MagicBox","created":"20240129165246939","creator":"Octt","modified":"20240129183740425","modifier":"Octt","text":"ctrl-O"}, {"title":"$:/config/shortcuts/toggle-sidebar","created":"20231221120801618","creator":"Octt","modified":"20231221141644770","modifier":"Octt","text":"shift-alt-B"}, {"title":"$:/config/shortcuts/transcludify","created":"20231221120759849","creator":"Octt","modified":"20231221142609732","modifier":"Octt","text":"ctrl-K"}, {"title":"$:/config/shortcuts/underline","created":"20231221141712771","creator":"Octt","modified":"20231221141712771","modifier":"Octt","text":"ctrl-U"}, @@ -395,7 +397,6 @@ {"title":"$:/i18n","Languages":"en it","created":"20230125160308146","creator":"Octt","modified":"20230125175813577","modifier":"Octt","tags":""}, {"title":"$:/i18n:en","created":"20220926115058940","creator":"Octt","icon":"$:/languages/en-GB/icon","modified":"20230206111621568","modifier":"Octt"}, {"title":"$:/i18n:it","created":"20220926115105492","creator":"Octt","icon":"$:/languages/it-IT/icon","modified":"20230206111646477","modifier":"Octt"}, -{"title":"$:/Import","status":"complete","text":"The following tiddlers were imported:\n\n# [[$:/config/ShortcutInfo/Open-MagicBox]]\n# [[$:/Apps/MagicBox/Shortcuts/Open-MagicBox]]"}, {"title":"$:/info/browser/storage/persisted","text":"granted"}, {"title":"$:/isEncrypted","text":"no"}, {"title":"$:/kk-notes-box/macros/note","created":"20230331055313846","creator":"Mohammad","modified":"20240129163630576","modifier":"Octt","tags":"$:/tags/Macro","text":"\\define note(type:\"info\", src:\"\", title:\"Note\" )\n\\import [[$:/kk-notes-box/macros/svg-icons]]\n\u003Cdiv class=\"kk-notes\">\n\u003C$let icon={{{ [\u003C__type__>match[warning]then[warning-svg]else[info-svg]] }}}\n header-class={{{\"kk-notes-header\" [\u003C__type__>match[warning]then[warning]else[info]addprefix[kk-notes-]] :and[join[ ]]}}} >\n\u003Cdiv class=\u003C\u003Cheader-class>> >\n\u003C$macrocall $name=\u003C\u003Cicon>> />\n\u003Cdiv class=\"kk-notes-title\">\u003C\u003C__title__>>\u003C/div>\n\u003C/div>\n\u003C/$let>\n\u003Cdiv class=\"kk-notes-content\">\u003C$transclude tiddler=\u003C\u003C__src__>> field=title mode=block/>\u003C/div>\n\u003C/div>\n\\end\n"}, @@ -481,7 +482,7 @@ {"title":"$:/plugins/danielo515/2click2edit/readme","created":"20231103222340488","creator":"Octt","modified":"20231103222502294","modifier":"Octt","text":"Edited for the [[OcttKB]], to work with 3 clicks instead of 2.\n\nOriginal readme below:\n\nThis plugin adds the ability to edit tiddlers by double clicking on its body.\nJust try to edit any tiddler shown here by double clicking on it.\n\nThis can be considered a fast solution. It is only to fill the gap until TiddlyWiki adds support \nfor it officially.\n"}, {"bag":"default","revision":"0","version":"2.1.0","title":"$:/plugins/danielo515/ContextPlugin","source":"https://github.com/danielo515/TW5-contextPlugin","plugin-type":"plugin","list":"readme","description":"Context search - provides visual highlight of search results","dependents":"","core-version":">=5.1.0","author":"Danielo Rodrigez","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/danielo515/ContextPlugin/Caption\":{\"title\":\"$:/plugins/danielo515/ContextPlugin/Caption\",\"created\":\"20140530174219263\",\"tags\":\"contextPlugin\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"Context search\"},\"$:/plugins/danielo515/ContextPlugin/Stylesheet/results\":{\"title\":\"$:/plugins/danielo515/ContextPlugin/Stylesheet/results\",\"text\":\".matched{background-color:yellow}\\n.tw-context {/*border:1px solid;\\n /*word-break: break-all; word-wrap: break-word*/}\",\"created\":\"20140529162823729\",\"tags\":\"$:/tags/Stylesheet contextPlugin\",\"type\":\"text/css\"},\"$:/plugins/danielo515/ContextPlugin/readme\":{\"title\":\"$:/plugins/danielo515/ContextPlugin/readme\",\"text\":\"!Usage\\n\\nAfter installing the plugin you will have a new tab in [[$:/AdvancedSearch]] called [[Context Search]]. If you want this functionality in other places you will have to edit the desired tiddler yourself adding the ''context widget''. For more details about using the widget see the section below.\\n\\n!!Using the widget\\n\\nThe very basic usage of the widget is the following:\\n\\n```\\r\\n\u003C$context term=\\\"lorem\\\"/>\\r\\n```\\r\\nWhich will render as:\\r\\n\u003C$context term=\\\"lorem\\\"/>\\n\\nThe widgets will search inside the current tiddler by default. Because that you see the same content twice here. This example is not very useful. Other more meaningful would be:\\n\\n```\\r\\n\u003C$list filter=\\\"[search{$:/temp/advancedsearch}sort[title]limit[250]]\\\">\\r\\n{{!!title||$:/core/ui/ListItemTemplate}}\\r\\n\u003C$context term={{$:/temp/advancedsearch}}/>\\r\\n\u003C/$list>\\r\\n```\\n\\nThat will search for tiddlers containing the text specified in [[$:/temp/advancedsearch]] and will display a link to the matching tiddlers plus a preview of the matching content. Something very similar is used in [[Context Search]]. Below you can find a complete list of parameters and their default values.\\n\\n|! parameter |! description | !default |\\r\\n| term | The term you want to search ||\\r\\n| searchTerm | An alias for the previous one ||\\r\\n| tiddler | The tiddler's name to look into | current tiddler |\\r\\n| length | Number of context characters to show | 50 |\\r\\n| before | Number of characters before the matched term to show | the value of the length parameter |\\r\\n| after | Number of characters after the matched term to show | the value of the length parameter |\\r\\n| maxMatches | maximun number of matched elements to show. Incrementing this can cause several performance issues | 10 |\\r\\n| element | Node element to create. This element will contain the results of the search. If you want to style it its class is `tw-context` | `\u003Cpre>` |\\r\\n| matchClass | The css class to assign to the matched terms in the results. This is used to highlight the results | matched |\\n\\n!Customizing the output\\r\\nThere are not many ways to customize the output of this widget. You can specify ''what type of node you want to create'' to wrap the results (div,span...). The default is `\u003Cpre>`. This container is created with the class `tw-context` so you can easily apply styles to it. Something similar happens to the ''highlighted'' words. You can specify the name of the class to assign to it and also you can apply styles to that class.\\n\\nA very basic example of customization could be:\\n\\n# Create a tiddler, for example [[$/plugins/danielo515/context/css]]\\r\\n# Paste the following text or any css rule you want: \\\"\\\"\\\"\\n\\n\u003Cpre>\\r\\n.matched{background-color:yellow}\\r\\n.tw-context {\\r\\n border:1px solid blue;\\r\\n word-break: break-all; word-wrap: break-word;}\\r\\n\u003C/pre>\\r\\n\\\"\\\"\\\"\\r\\n# Tag it with `$:/tags/stylesheet`\\r\\n# Save the tiddler\"},\"$:/plugins/danielo515/ContextPlugin/visualizer\":{\"title\":\"$:/plugins/danielo515/ContextPlugin/visualizer\",\"caption\":\"Context\",\"tags\":\"$:/tags/SearchResults\",\"text\":\"\u003C$list filter=\\\"[!is[system]search{$:/temp/search}sort[title]limit[250]]\\\">\\r\\n {{!!title||$:/core/ui/ListItemTemplate}}\\r\\n \u003C$context term={{$:/temp/search}} />\\r\\n\u003C/$list>\\r\\n\"},\"$:/plugins/danielo515/ContextPlugin/widgets/context.js\":{\"title\":\"$:/plugins/danielo515/ContextPlugin/widgets/context.js\",\"text\":\"/*\\\\\\\\\\ntitle: $:/core/modules/widgets/danielo/context-widget.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nEdit-text widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\nvar contextWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\ncontextWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\ncontextWidget.prototype.render = function(parent,nextSibling) {\\n // Save the parent dom node\\n\\tthis.parentDomNode = parent;\\n\\t// Compute our attributes\\n\\tthis.computeAttributes();\\n\\t// Execute our logic\\n\\tthis.execute();\\n \\n if(this.term && this.term.length>3){\\n \\n this.createRegexp();\\n var matches = this.executeRegexp();\\n\\t if(matches.length > 0){ \\n this.domNode = this.document.createElement(this.element);\\n this.domNode.className=\\\"tw-context\\\";\\n this.composeResults( matches ); //this appends to domNode \\n \\t// Insert element\\n \\tparent.insertBefore(this.domNode,nextSibling);\\n \\tthis.renderChildren(this.domNode,null);\\n\\t \\tthis.domNodes.push(this.domNode);\\n }\\n }\\n\\t\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\ncontextWidget.prototype.execute = function() {\\n\\t// Get the parameters from the attributes\\n this.matchedClass = this.getAttribute(\\\"matchClass\\\",\\\"matched\\\");\\n\\tthis.tiddler = this.getAttribute( \\\"tiddler\\\",this.getVariable(\\\"currentTiddler\\\") );\\n this.term = this.getAttribute(\\\"term\\\",this.getAttribute(\\\"searchTerm\\\"));\\n\\tthis.contextLength = this.getAttribute(\\\"length\\\",50);\\n this.before = this.getAttribute(\\\"before\\\",this.contextLength);\\n this.after = this.getAttribute(\\\"after\\\",this.contextLength);\\n this.maxMatches = this.getAttribute(\\\"maxMatches\\\",10);\\n this.element = this.getAttribute(\\\"element\\\",\\\"pre\\\");\\n\\tthis.makeChildWidgets();\\n};\\n\\n /*Create the regular expression*/\\ncontextWidget.prototype.createRegexp = function()\\n{\\n var regString = \\\"(\\\\\\\\w+[\\\\\\\\s\\\\\\\\S]{0,#before#})?(#term#)([\\\\\\\\s\\\\\\\\S]{0,#after#}\\\\\\\\w+)?\\\";\\n\\n var regString = regString.replace(\\\"#before#\\\",this.before).replace(\\\"#term#\\\", $tw.utils.escapeRegExp(this.term) ) .replace(\\\"#after#\\\",this.after);\\n this.regexp = new RegExp(regString,\\\"ig\\\");\\n //console.log(regString);\\n};\\n/*\\nexecute the regular expresion\\n*/\\ncontextWidget.prototype.executeRegexp = function()\\n{\\n var text = this.wiki.getTiddlerText(this.tiddler), match,results = new Array();\\n while( (match = this.regexp.exec( text ) ) && (results.length \u003C this.maxMatches) )\\n { results.push(match) }\\n //console.log(\\\"matches\\\",results);\\n return results;\\n};\\n\\n/*\\ncompose the results\\nmatches : array of match objects from regular expression execute\\n*/\\ncontextWidget.prototype.composeResults = function(matches){\\n var result=[], self=this, node = this.domNode,\\n dots = textNode(\\\"...\\\\n\\\"),\\n span = matchedNode( this.term );\\n\\n for(var i=0; i \u003C matches.length; i++){\\n processMatch( matches[i] );\\n }\\n \\n function processMatch(match){\\n if( match.index !== 0) node.appendChild( dots.cloneNode(true) );\\n for( var i=1;i\u003Cmatch.length;i++ ) {//match[0] full matched text (all groups together)\\n if( match[i] ) {\\n if ( match[i].toLowerCase() == self.term.toLowerCase() ) \\n node.appendChild( match[i] == self.term ? span.cloneNode(true) : matchedNode( match[i] ) )\\n else\\n node.appendChild( textNode( match[i]) )\\n }\\n }\\n if( match.index + match[0].length \u003C match.input.length) node.appendChild( dots.cloneNode(true) );\\n }\\n \\n function textNode(text){ return self.document.createTextNode(text) }\\n function matchedNode(text) { \\n var node = self.document.createElement(\\\"span\\\"); node.appendChild( textNode(text) ); node.className = self.matchedClass;\\n return node }\\n \\n};\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\ncontextWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes.tiddler || changedAttributes.term || changedAttributes.length || changedAttributes.matchedClass) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n return this.refreshChildren(changedTiddlers);\\n};\\n\\nexports.context = contextWidget;\\n\\n})();\",\"created\":\"20140418153435777\",\"creator\":\"danielo\",\"modified\":\"20140530231943517\",\"modifier\":\"danielo\",\"module-type\":\"widget\",\"type\":\"application/javascript\"},\"Context Search\":{\"title\":\"Context Search\",\"caption\":\"{{$:/plugins/danielo515/ContextPlugin/Caption}}\",\"created\":\"20140530173407542\",\"tags\":\"$:/tags/AdvancedSearch\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\define lingo-base() $:/language/Search/\\n\u003C$linkcatcher to=\\\"$:/temp/advancedsearch\\\">\\n\\n\u003C\u003Clingo Standard/Hint>>\\n\\n\u003Cdiv class=\\\"tw-search\\\">\u003C$edit-text tiddler=\\\"$:/temp/advancedsearch\\\" type=\\\"search\\\" tag=\\\"input\\\"/>\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\"> \u003C$link to=\\\"\\\" class=\\\"btn-invisible\\\">{{$:/core/images/close-button}}\u003C/$link>\u003C/$reveal>\u003C/div>\\n\\n\u003C/$linkcatcher>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"nomatch\\\" text=\\\"\\\">\\n\u003Cdiv class=\\\"tw-search-results\\\">\\n\\n\u003C\u003Clingo Standard/Matches>>\\n\\n\u003C$list filter=\\\"[!is[system]search{$:/temp/advancedsearch}sort[title]limit[250]]\\\">\\n{{!!title||$:/core/ui/ListItemTemplate}}\\n\u003C$context term={{$:/temp/advancedsearch}}/>\\n\u003C/$list>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\\n\\n\u003C$reveal state=\\\"$:/temp/advancedsearch\\\" type=\\\"match\\\" text=\\\"\\\">\\n\\n\u003C/$reveal>\\n\"}}}"}, {"title":"$:/plugins/danielo515/ContextPlugin/visualizer","caption":"Context","created":"20240129101557058","creator":"Octt","modified":"20240129101627850","modifier":"Octt","tags":"$:/tags/SearchResults","text":"\u003C$list filter=\"[!is[system]search{$:/temp/search}sort[title]limit[150]]\">\u003C!-- Brought down to 150 from the original 250 to attempt to reduce lag on mobile -->\n {{!!title||$:/core/ui/ListItemTemplate}}\n \u003C$context term={{$:/temp/search}} />\n\u003C/$list>\n"}, -{"title":"$:/plugins/danielo515/ContextPlugin/widgets/context.js","text":"/*\\\\\ntitle: $:/core/modules/widgets/danielo/context-widget.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar contextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\ncontextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\ncontextWidget.prototype.render = function(parent,nextSibling) {\n // Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n \n if(this.term && this.term.length>3){\n \n this.createRegexp();\n var matches = this.executeRegexp();\n\t if(matches.length > 0){ \n this.domNode = this.document.createElement(this.element);\n\t\t\t\tthis.domNode.tabindex = this.tabindex;\n this.domNode.className=\"tw-context\";\n this.composeResults( matches ); //this appends to domNode \n \t// Insert element\n \tparent.insertBefore(this.domNode,nextSibling);\n \tthis.renderChildren(this.domNode,null);\n\t \tthis.domNodes.push(this.domNode);\n }\n }\n\t\n};\n\n/*\nCompute the internal state of the widget\n*/\ncontextWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n this.matchedClass = this.getAttribute(\"matchClass\",\"matched\");\n this.tiddler = this.getAttribute( \"tiddler\",this.getVariable(\"currentTiddler\") );\n this.term = this.getAttribute(\"term\",this.getAttribute(\"searchTerm\"));\n this.contextLength = this.getAttribute(\"length\",50);\n this.before = this.getAttribute(\"before\",this.contextLength);\n this.after = this.getAttribute(\"after\",this.contextLength);\n this.maxMatches = this.getAttribute(\"maxMatches\",10);\n this.element = this.getAttribute(\"element\",\"pre\");\n\t\tthis.tabindex = this.getAttribute(\"tabindex\");\n this.makeChildWidgets();\n};\n\n /*Create the regular expression*/\ncontextWidget.prototype.createRegexp = function()\n{\n var regString = \"(\\\\w+[\\\\s\\\\S]{0,#before#})?(#term#)([\\\\s\\\\S]{0,#after#}\\\\w+)?\";\n\n var regString = regString.replace(\"#before#\",this.before).replace(\"#term#\", $tw.utils.escapeRegExp(this.term) ) .replace(\"#after#\",this.after);\n this.regexp = new RegExp(regString,\"ig\");\n //console.log(regString);\n};\n/*\nexecute the regular expresion\n*/\ncontextWidget.prototype.executeRegexp = function()\n{\n var text = this.wiki.getTiddlerText(this.tiddler), match,results = new Array();\n while( (match = this.regexp.exec( text ) ) && (results.length \u003C this.maxMatches) )\n { results.push(match) }\n //console.log(\"matches\",results);\n return results;\n};\n\n/*\ncompose the results\nmatches : array of match objects from regular expression execute\n*/\ncontextWidget.prototype.composeResults = function(matches){\n var result=[], self=this, node = this.domNode,\n dots = textNode(\"...\\n\"),\n span = matchedNode( this.term );\n\n for(var i=0; i \u003C matches.length; i++){\n processMatch( matches[i] );\n }\n \n function processMatch(match){\n if( match.index !== 0) node.appendChild( dots.cloneNode(true) );\n for( var i=1;i\u003Cmatch.length;i++ ) {//match[0] full matched text (all groups together)\n if( match[i] ) {\n if ( match[i].toLowerCase() == self.term.toLowerCase() ) \n node.appendChild( match[i] == self.term ? span.cloneNode(true) : matchedNode( match[i] ) )\n else\n node.appendChild( textNode( match[i]) )\n }\n }\n if( match.index + match[0].length \u003C match.input.length) node.appendChild( dots.cloneNode(true) );\n }\n \n function textNode(text){ return self.document.createTextNode(text) }\n function matchedNode(text) { \n var node = self.document.createElement(\"span\"); node.appendChild( textNode(text) ); node.className = self.matchedClass;\n return node }\n \n};\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\ncontextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.term || changedAttributes.length || changedAttributes.matchedClass) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n return this.refreshChildren(changedTiddlers);\n};\n\nexports.context = contextWidget;\n\n})();","created":"20140418153435777","creator":"danielo","modified":"20240129171317600","modifier":"Octt","module-type":"widget","type":"application/javascript"}, +{"title":"$:/plugins/danielo515/ContextPlugin/widgets/context.js","text":"/*\\\\\ntitle: $:/core/modules/widgets/danielo/context-widget.js\ntype: application/javascript\nmodule-type: widget\nOcttKB-Note: added tabindex attribute.\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar contextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\ncontextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\ncontextWidget.prototype.render = function(parent,nextSibling) {\n // Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n \n if(this.term && this.term.length>3){\n \n this.createRegexp();\n var matches = this.executeRegexp();\n\t if(matches.length > 0){ \n this.domNode = this.document.createElement(this.element);\n\t\t\t\tthis.domNode.setAttribute(\"tabindex\", this.tabindex);\n this.domNode.className=\"tw-context\";\n this.composeResults( matches ); //this appends to domNode \n \t// Insert element\n \tparent.insertBefore(this.domNode,nextSibling);\n \tthis.renderChildren(this.domNode,null);\n\t \t this.domNodes.push(this.domNode);\n }\n }\n\t\n};\n\n/*\nCompute the internal state of the widget\n*/\ncontextWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n this.matchedClass = this.getAttribute(\"matchClass\",\"matched\");\n this.tiddler = this.getAttribute( \"tiddler\",this.getVariable(\"currentTiddler\") );\n this.term = this.getAttribute(\"term\",this.getAttribute(\"searchTerm\"));\n this.contextLength = this.getAttribute(\"length\",50);\n this.before = this.getAttribute(\"before\",this.contextLength);\n this.after = this.getAttribute(\"after\",this.contextLength);\n this.maxMatches = this.getAttribute(\"maxMatches\",10);\n this.element = this.getAttribute(\"element\",\"pre\");\n this.tabindex = this.getAttribute(\"tabindex\");\n this.makeChildWidgets();\n};\n\n /*Create the regular expression*/\ncontextWidget.prototype.createRegexp = function()\n{\n var regString = \"(\\\\w+[\\\\s\\\\S]{0,#before#})?(#term#)([\\\\s\\\\S]{0,#after#}\\\\w+)?\";\n\n var regString = regString.replace(\"#before#\",this.before).replace(\"#term#\", $tw.utils.escapeRegExp(this.term) ) .replace(\"#after#\",this.after);\n this.regexp = new RegExp(regString,\"ig\");\n //console.log(regString);\n};\n/*\nexecute the regular expresion\n*/\ncontextWidget.prototype.executeRegexp = function()\n{\n var text = this.wiki.getTiddlerText(this.tiddler), match,results = new Array();\n while( (match = this.regexp.exec( text ) ) && (results.length \u003C this.maxMatches) )\n { results.push(match) }\n //console.log(\"matches\",results);\n return results;\n};\n\n/*\ncompose the results\nmatches : array of match objects from regular expression execute\n*/\ncontextWidget.prototype.composeResults = function(matches){\n var result=[], self=this, node = this.domNode,\n dots = textNode(\"...\\n\"),\n span = matchedNode( this.term );\n\n for(var i=0; i \u003C matches.length; i++){\n processMatch( matches[i] );\n }\n \n function processMatch(match){\n if( match.index !== 0) node.appendChild( dots.cloneNode(true) );\n for( var i=1;i\u003Cmatch.length;i++ ) {//match[0] full matched text (all groups together)\n if( match[i] ) {\n if ( match[i].toLowerCase() == self.term.toLowerCase() ) \n node.appendChild( match[i] == self.term ? span.cloneNode(true) : matchedNode( match[i] ) )\n else\n node.appendChild( textNode( match[i]) )\n }\n }\n if( match.index + match[0].length \u003C match.input.length) node.appendChild( dots.cloneNode(true) );\n }\n \n function textNode(text){ return self.document.createTextNode(text) }\n function matchedNode(text) { \n var node = self.document.createElement(\"span\"); node.appendChild( textNode(text) ); node.className = self.matchedClass;\n return node }\n \n};\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\ncontextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.term || changedAttributes.length || changedAttributes.matchedClass) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n return this.refreshChildren(changedTiddlers);\n};\n\nexports.context = contextWidget;\n\n})();","created":"20140418153435777","creator":"danielo","modified":"20240129224755106","modifier":"Octt","module-type":"widget","type":"application/javascript"}, {"bag":"default","revision":"0","version":"0.1.2","title":"$:/plugins/ebalster/condition","tags":"","plugin-type":"plugin","modified":"20171230165413285","list":"readme license changelog","dependents":"","created":"20171230044033218","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/ebalster/condition/changelog\":{\"title\":\"$:/plugins/ebalster/condition/changelog\",\"created\":\"20171230164920491\",\"modified\":\"20171230165117169\",\"tags\":\"\",\"text\":\"!!Version 0.1.1 — December 30, 2017\\n\\n* Fix an error when refreshing the condition widget.\\n* Fix \\\"match\\\" attribute not working as expected.\\n\\n\\n!!Version 0.1.0 — December 29, 2017\\n\\n* Initial implementation.\\n* Includes $if, $else, $else-if\\n* Common code in condition.js\"},\"$:/plugins/ebalster/condition/license\":{\"title\":\"$:/plugins/ebalster/condition/license\",\"caption\":\"license\",\"created\":\"20171230044445712\",\"modified\":\"20171230044506791\",\"revision\":\"0\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"!!The MIT License (MIT)\\n\\nCopyright (c) 2017 Evan Balster\\n\\nPermission is hereby granted, free of charge, to any person obtaining a copy of\\nthis software and associated documentation files (the \\\"Software\\\"), to deal in\\nthe Software without restriction, including without limitation the rights to\\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\\nthe Software, and to permit persons to whom the Software is furnished to do so,\\nsubject to the following conditions:\\n\\nThe above copyright notice and this permission notice shall be included in all\\ncopies or substantial portions of the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\"},\"$:/plugins/ebalster/condition/readme\":{\"title\":\"$:/plugins/ebalster/condition/readme\",\"caption\":\"readme\",\"created\":\"20171230044517252\",\"modified\":\"20171230052355854\",\"revision\":\"0\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"The ''Condition'' plugin for TiddlyWiki, version {{$:/plugins/ebalster/condition!!version}}, by Evan Balster.\\n\\nThis plugin defines widgets that will either show or hide their contents depending on a condition.\\n\\nUnlike the closely-related reveal widget, condition widgets do //not// retain their content, and do not support animation or popups. Conditions may be based on variables, macros or filtered attributes. It can also be used with the [[Formula Plugin]].\\n\\n\\n!!Truthiness\\n\\nTruthiness is a simple rule for whether a value triggers an \\\"if\\\" widget or not. Values are \\\"truthy\\\" if they do not match any of the \\\"falsy\\\" values below:\\n\\n* The number `0`, including any decimal point.\\n* `false`\\n* `undefined`\\n* `null`\\n* Blank (no text)\\n\\nThis matching is case-insensitive, and any whitespace before or after the value will be ignored.\\n\\n\\n!!If Widget\\n\\nThe `$if` widget will show its content based on whether a value is \\\"truthy\\\", or matches another value.\\n\\n|Attribute|Meaning|h\\n|value|''Required.'' Content is shown if `value` is truthy.|\\n|match|Optional. If present, `value` and `match` must equal //exactly// for content to be shown. (Truthiness doesn't matter.)|\\n|not|Inverts the condition, so the value will be shown if it would be hidden and vice versa.|\\n\\nFor example,\\n\\n```\\n\u003C$if not value={{$:/StoryList}}>\\nNo tiddlers are open right now!\\n\u003C/$if>\\n```\\n\\n\\n!!Else Widget\\n\\nThe `$else` widget has no attributes. It must be placed after one of the conditional widgets listed below, and will only show its contents if the preceding widget is //not// showing its content.\\n\\n|After...|Show contents when...|h\\n|`$if`\u003Cbr/>`$else-if`|None of the previous if-conditions was true.|\\n|`$list`|The list is empty. `$else` can be used instead of emptyMessage.|\\n|`$reveal`|The contents of the reveal widget are hidden.|\\n|`$else`|An else after an else will //never// be shown.|\\n\\nFor example:\\n\\n```\\n\u003C$if value={{{[tag[Note]]}}}>\\n!!My notes:\\n \u003C$list filter=\\\"[tag[Note]]\\\">\\n - {{!!title}}\\n \u003C/$list>\\n\u003C/$if>\\n\u003C$else>\\n!!I don't have any notes...\\n\u003C/$else>\\n```\\n\\nNote that the else widget can't have any blank lines between it and the preceding widget.\\n\\n\\n!!Else-If Widget\\n\\nThe `$else-if` widget is a combination of the `$else` and `$if` widgets, and has the same attributes as the `$if` widget. Its content will only be displayed if the previous widget is //not// showing its content //and// the `$if`-condition is true.\\n\\n`$else-if` widgets can be used to perform a \\\"chain\\\" of tests, showing some text based on the first condition that passes (or fails). For example:\\n\\n```\\nSomething approaches...\\n\\n\u003C$if value={{!!animal}} match=cat> Meow! \u003C/$if>\\n\u003C$else-if value={{!!animal}} match=dog> Bark! \u003C/$else-if>\\n\u003C$else-if value={{!!animal}} match=bird> Tweet! \u003C/$else-if>\\n\u003C$else> This isn't like any animal you've seen before. \u003C/$else>\\n```\\n\\n\\n!!Help & Support\\n\\nThis plugin is a work in progress; seek help with it on the TiddlyWiki Google Group: https://groups.google.com/forum/#!forum/tiddlywiki\\n\\nOr E-mail me directly: [[evan@imitone.com|mailto://evan@imitone.com]]\"},\"$:/plugins/ebalster/condition/repack\":{\"title\":\"$:/plugins/ebalster/condition/repack\",\"created\":\"20171230044112191\",\"modified\":\"20171230165309317\",\"revision\":\"0\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"Repacking command (use this in the browser console to repack the plugin)\\n\\n\u003Cpre>\u003Ccode>$tw.utils.repackPlugin(\\\"$:/plugins/ebalster/condition\\\", (= \\\"[\\\" & textjoin(\\\",\\\",\\n TRUE,\\n [prefix[$:/plugins/ebalster/condition/]addprefix[\\\"]addsuffix[\\\"]]) & \\\"]\\\" =));\\n\u003C/code>\u003C/pre>\\n\\nVersion: \u003C$edit-text tiddler=\\\"$:/plugins/ebalster/condition\\\" field=\\\"version\\\" />\"},\"$:/plugins/ebalster/condition/widgets/condition.js\":{\"title\":\"$:/plugins/ebalster/condition/widgets/condition.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/ebalster/condition/widgets/condition.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nBase class for condition widgets.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar ConditionWidget = function(parseTreeNode,options) {\\n\\tif(arguments.length > 0) {\\n\\t\\tthis.initialise(parseTreeNode,options);\\n\\t}\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nConditionWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nConditionWidget.prototype.render = function(parent,nextSibling) {\\n this.parentDomNode = parent;\\n this.computeAttributes();\\n this.execute();\\n this.rerender(parent,nextSibling);\\n};\\n\\nConditionWidget.prototype.rerender = function(parent,nextSibling) {\\n\\tthis.removeChildDomNodes();\\n\\tif (this.conditionError) {\\n\\t\\t// Show an error.\\n\\t\\tvar parseTreeNodes = [{type: \\\"element\\\", tag: \\\"span\\\", attributes: {\\n\\t\\t\\t\\\"class\\\": {type: \\\"string\\\", value: \\\"tc-error\\\"}\\n\\t\\t}, children: [\\n\\t\\t\\t{type: \\\"text\\\", text: this.conditionError}\\n\\t\\t]}];\\n\\t\\tthis.makeChildWidgets(parseTreeNodes);\\n\\t}\\n\\telse if (this.isOpen) {\\n\\t\\t// Construct and render the child widgets.\\n\\t\\tthis.makeChildWidgets(this.parseTreeNode.children);\\n\\t}\\n\\telse {\\n\\t\\t// Destroy the child widgets.\\n\\t\\tthis.children = [];\\n\\t}\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget (default behavior)\\n*/\\nConditionWidget.prototype.execute = function() {\\n\\tthis.executeIf(\\\"$condition\\\");\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nConditionWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar currentlyOpen = this.isOpen;\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tthis.execute();\\n\\tif(this.isOpen !== currentlyOpen) {\\n\\t\\tvar nextSibling = this.findNextSiblingDomNode();\\n\\t\\tthis.rerender(this.parentDomNode,nextSibling);\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nUtility: Is a value \\\"truthy\\\"?\\n*/\\nConditionWidget.prototype.valueIsTruthy = function(value) {\\n\\t// It's truthy if it's not falsy, ie, undefined, false, blank or zero.\\n\\treturn !(/^\\\\s*(undefined|false|null|0+|0*\\\\.0+|0+\\\\.0*|)\\\\s*$/i.test(value));\\n};\\n\\n/*\\nUtility: Find a preceding non-text widget for an \\\"else\\\" widget.\\n*/\\nConditionWidget.prototype.findPrecedingConditionWidget = function() {\\n\\tvar siblings = (this.parentWidget ? this.parentWidget.children : null);\\n\\tvar sibling;\\n\\tif (siblings) {\\n\\t\\tfor (var i = siblings.indexOf(this)-1; i >= 0; --i) {\\n\\t\\t\\tsibling = siblings[i];\\n\\t\\t\\tif (sibling.parseTreeNode.type == \\\"text\\\") continue;\\n\\t\\t\\tif (sibling.isOpen != null || sibling.list != null) return sibling;\\n\\t\\t\\treturn null;\\n\\t\\t}\\n\\t}\\n\\treturn null;\\n};\\n\\n/*\\nUtility: Test if another widget triggers an \\\"else\\\"; ie, false conditions, closed reveals, empty lists.\\n*/\\nConditionWidget.prototype.widgetTriggersElse = function(widget) {\\n\\t// Condition widgets\\n\\tif (widget.triggerElse != null) return widget.triggerElse;\\n\\t// Reveal widget\\n\\tif (widget.isOpen != null) return !widget.isOpen;\\n\\t// List widget\\n\\tif (widget.list != null) return (widget.list instanceof Array) && widget.list.length == 0;\\n};\\n\\n/*\\nUtility: Execute as an \\\"else\\\" condition, computing isOpen and conditionError accordingly.\\n*/\\nConditionWidget.prototype.executeElse = function(widgetName) {\\n\\tthis.isOpen = false;\\n\\tthis.conditionError = null;\\n\\tthis.triggerElse = false;\\n\\tvar predicate = this.findPrecedingConditionWidget();\\n\\tif (!predicate) {\\n\\t\\tthis.conditionError = (widgetName||\\\"$else\\\") + \\\" widget must follow $if, $else-if, $reveal or $list.\\\";\\n\\t\\treturn;\\n\\t}\\n\\tthis.isOpen = this.widgetTriggersElse(predicate);\\n};\\n\\n/*\\nUtility: Execute as an \\\"if\\\" condition, computing isOpen and conditionError accordingly.\\n*/\\nConditionWidget.prototype.executeIf = function(widgetName) {\\n\\tthis.isOpen = false;\\n\\tthis.conditionError = null;\\n\\tthis.triggerElse = false;\\n // Re-check our \\\"if\\\" condition.\\n\\tvar value = this.getAttribute(\\\"value\\\");\\n\\tvar match = this.getAttribute(\\\"match\\\");\\n\\tif (value == null) {\\n\\t\\tthis.conditionError = (widgetName||\\\"$condition\\\") + \\\" widget requires a 'value' attribute.\\\";\\n\\t\\treturn;\\n\\t}\\n\\telse if (match == null) {\\n\\t\\t// Open if the value is truthy.\\n\\t\\tthis.isOpen = this.valueIsTruthy(value);\\n\\t}\\n\\telse {\\n\\t\\tthis.isOpen = (value == match);\\n\\t}\\n\\tif (this.getAttribute(\\\"not\\\")) {\\n\\t\\tthis.isOpen = !this.isOpen;\\n\\t}\\n\\tthis.triggerElse = !this.isOpen;\\n};\\n\\nexports.condition = ConditionWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\",\"created\":\"20171230024342810\",\"description\":\"As the $vars widget, but each attribute is interpreted as a formula.\",\"modified\":\"20171230024403999\",\"revision\":\"0\",\"tags\":\"\"},\"$:/plugins/ebalster/condition/widgets/elif.js\":{\"title\":\"$:/plugins/ebalster/condition/widgets/elif.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/ebalster/condition/widgets/if.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nIf-condition widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar ConditionWidget = require(\\\"$:/plugins/ebalster/condition/widgets/condition.js\\\").condition;\\n\\nvar ElifWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nElifWidget.prototype = new ConditionWidget();\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nElifWidget.prototype.execute = function() {\\n\\tthis.executeElse(\\\"$else-if\\\");\\n\\tif (this.isOpen) this.executeIf(\\\"$if\\\");\\n};\\n\\nexports[\\\"else-if\\\"] = ElifWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\",\"created\":\"20171230040903429\",\"description\":\"As the $vars widget, but each attribute is interpreted as a formula.\",\"modified\":\"20171230040911552\",\"revision\":\"0\",\"tags\":\"\"},\"$:/plugins/ebalster/condition/widgets/else.js\":{\"title\":\"$:/plugins/ebalster/condition/widgets/else.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/ebalster/condition/widgets/if.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nIf-condition widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar ConditionWidget = require(\\\"$:/plugins/ebalster/condition/widgets/condition.js\\\").condition;\\n\\nvar ElseWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nElseWidget.prototype = new ConditionWidget();\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nElseWidget.prototype.execute = function() {\\n\\t// Execute as an else condition.\\n\\tthis.executeElse(\\\"$else\\\");\\n};\\n\\nexports.else = ElseWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\",\"created\":\"20171230025320439\",\"description\":\"As the $vars widget, but each attribute is interpreted as a formula.\",\"modified\":\"20171230025331858\",\"revision\":\"0\",\"tags\":\"\"},\"$:/plugins/ebalster/condition/widgets/if.js\":{\"title\":\"$:/plugins/ebalster/condition/widgets/if.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/ebalster/condition/widgets/if.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nIf-condition widget\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar ConditionWidget = require(\\\"$:/plugins/ebalster/condition/widgets/condition.js\\\").condition;\\n\\nvar IfWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nIfWidget.prototype = new ConditionWidget();\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nIfWidget.prototype.execute = function() {\\n\\tthis.executeIf(\\\"$if\\\");\\n};\\n\\nexports.if = IfWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\",\"created\":\"20171230002741585\",\"description\":\"As the $vars widget, but each attribute is interpreted as a formula.\",\"modified\":\"20171230004310622\",\"revision\":\"0\",\"tags\":\"\"}}}"}, {"author":"Felix Küppers","core-version":">=5.1.5","dependents":"","description":"HotZone – Be notified when tiddlers are scrolled into view","list":"Configuration License Readme","plugin-type":"plugin","released":"","source":"https://github.com/felixhayashi/TW5-HotZone","title":"$:/plugins/felixhayashi/hotzone","version":"0.0.3","name":"hotzone","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/felixhayashi/hotzone/Configuration\":{\"title\":\"$:/plugins/felixhayashi/hotzone/Configuration\",\"text\":\"Please see the [[GitHub page|https://github.com/felixhayashi/TW5-HotZone]] for more information on the options.\\n\\nSave and reload the wiki to activate changes.\\n\\n\u003Ctable>\\n \u003Ctr>\\n \u003Cth align=\\\"left\\\">Focus offset:\u003C/th>\\n \u003Ctd>\u003C$edit-text tiddler=\\\"$:/config/hotzone/focusOffset\\\" tag=\\\"input\\\" default=\\\"71px\\\" />\u003C/td>\\n \u003C/tr>\\n\u003C/table>\"},\"$:/plugins/felixhayashi/hotzone/License\":{\"title\":\"$:/plugins/felixhayashi/hotzone/License\",\"text\":\"This code is released under the BSD license. For the exact terms visit:\\n\\nhttps://github.com/felixhayashi/TW5-HotZone/blob/master/LICENSE\"},\"$:/plugins/felixhayashi/hotzone/Readme\":{\"title\":\"$:/plugins/felixhayashi/hotzone/Readme\",\"text\":\"Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-HotZone]] for more information.\"},\"$:/plugins/felixhayashi/hotzone/config.js\":{\"title\":\"$:/plugins/felixhayashi/hotzone/config.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/hotzone/config.js\\ntype: application/javascript\\nmodule-type: library\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";exports.config={classNames:{storyRiver:\\\"tc-story-river\\\",tiddlerFrame:\\\"tc-tiddler-frame\\\",tiddlerTitle:\\\"tc-title\\\"},references:{userConfig:\\\"$:/config/hotzone/focusOffset\\\",focussedTiddlerStore:\\\"$:/temp/focussedTiddler\\\"},checkbackTime:$tw.utils.getAnimationDuration()}})();\",\"type\":\"application/javascript\",\"module-type\":\"library\"},\"$:/plugins/felixhayashi/hotzone/hotzone.js\":{\"title\":\"$:/plugins/felixhayashi/hotzone/hotzone.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/hotzone/hotzone.js\\ntype: application/javascript\\nmodule-type: startup\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";exports.name=\\\"hotzone\\\";exports.platforms=[\\\"browser\\\"];exports.after=[\\\"story\\\"];exports.synchronous=true;exports.startup=function(){var t=require(\\\"$:/plugins/felixhayashi/hotzone/config.js\\\").config;var e=null;var i=document.getElementsByClassName(t.classNames.storyRiver)[0];var r=$tw.wiki.getTiddlerData(t.references.userConfig,{});var s=isNaN(parseInt(r.focusOffset))?150:parseInt(r.focusOffset);var a=function(e,i,r){if(!(e instanceof Element))return;if(!$tw.utils.hasClass(e,t.classNames.tiddlerFrame))return;var s=e.getElementsByClassName(t.classNames.tiddlerTitle)[0];if(s){var a=s.innerText||s.textContent;return a.trim()}};var n=function(e,i){$tw.wiki.addTiddler(new $tw.Tiddler({title:t.references.focussedTiddlerStore,text:e},$tw.wiki.getModificationFields()));if(i){var r=document.getElementsByClassName(\\\"hzone-focus\\\")[0];if(r){$tw.utils.removeClass(r,\\\"hzone-focus\\\")}$tw.utils.addClass(i,\\\"hzone-focus\\\")}};var l=function(){var r=$tw.wiki.getTiddler(\\\"$:/StoryList\\\");if(r&&r.fields.list.length){var l=null;var o=Number.MAX_VALUE;var f=i.children;var u=t.classNames.tiddlerFrame;for(var d=f.length;d--;){if($tw.utils.hasClass(f[d],u)){var c=f[d].getBoundingClientRect();var v=Math.min(Math.abs(s-c.top),Math.abs(s-c.bottom));if(v\u003Co){l=f[d];o=v}}}var w=a(l);if(w!==e&&$tw.wiki.getTiddler(w)){e=w;n(e,l);return}}else if(e){e=\\\"\\\";n(e)}};var o=function(t){var e;var i=false;return function(r,s){var a=this;if(i&&!s){}else{i=s;if(e!=null){clearTimeout(e)}e=setTimeout((function(){e=null;i=false;t.apply(a)}),r)}}};var f=o(l);var u=function(t){if(t[\\\"$:/HistoryList\\\"]){if(!$tw.wiki.tiddlerExists(\\\"$:/HistoryList\\\"))return;var e=$tw.wiki.getTiddler(\\\"$:/HistoryList\\\").fields[\\\"current-tiddler\\\"];var i=$tw.wiki.getTiddlerList(\\\"$:/StoryList\\\");var r=i.indexOf(e)>=0;if(!r)return;f($tw.utils.getAnimationDuration()+10,true)}else if(t[\\\"$:/StoryList\\\"]){f($tw.utils.getAnimationDuration()+10,true)}};var d=function(t){f(300,false)};$tw.wiki.addEventListener(\\\"change\\\",u);window.addEventListener(\\\"scroll\\\",d,false);d()}})();\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/temp/focussedTiddler\":{\"title\":\"$:/temp/focussedTiddler\"}}}"}, {"name":"Relink","title":"$:/plugins/flibbles/relink","description":"Flexibility when relinking renamed tiddlers","author":"Flibbles","version":"2.3.1","core-version":">=5.1.22","source":"https://github.com/flibbles/tw5-relink","demo":"http://flibbles.github.io/tw5-relink/","list":"readme configuration license","dependents":"","plugin-type":"plugin","type":"application/json","text":"{\"tiddlers\":{\"$:/config/DefaultColourMappings/relink-impossible\":{\"title\":\"$:/config/DefaultColourMappings/relink-impossible\",\"text\":\"\u003C\u003Ccolour dirty-indicator>>\"},\"$:/config/flibbles/relink/PluginLibrary\":{\"title\":\"$:/config/flibbles/relink/PluginLibrary\",\"caption\":\"//Relink// Library\",\"tags\":\"$:/tags/PluginLibrary\",\"url\":\"https://flibbles.github.io/tw5-relink/library/index.html\",\"text\":\"The //Relink// library contains //Relink// as well as its supplemental plugins. It is maintained by Flibbles. See the [[github page|https://github.com/flibbles/tw5-relink]] for more information.\\n\"},\"$:/config/flibbles/relink/attributes/$action-deletefield/$tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-deletefield/$tiddler\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-deletetiddler/$filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-deletetiddler/$filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-deletetiddler/$tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-deletetiddler/$tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$action-listops/$filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-listops/$filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-listops/$tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-listops/$tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$action-log/$$filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-log/$$filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-navigate/$to\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-navigate/$to\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$action-popup/$state\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-popup/$state\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$action-sendmessage/$names\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-sendmessage/$names\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-sendmessage/$values\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-sendmessage/$values\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-setfield/$tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-setfield/$tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$fields\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$fields\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$indexes\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$indexes\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$values\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$values\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$button/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$button/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$button/set\":{\"title\":\"$:/config/flibbles/relink/attributes/$button/set\",\"text\":\"reference\"},\"$:/config/flibbles/relink/attributes/$button/setTo\":{\"title\":\"$:/config/flibbles/relink/attributes/$button/setTo\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$button/to\":{\"title\":\"$:/config/flibbles/relink/attributes/$button/to\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$checkbox/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$checkbox/checkactions\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/checkactions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$checkbox/tag\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$checkbox/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$checkbox/uncheckactions\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/uncheckactions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$count/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$count/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$draggable/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$draggable/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$draggable/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$draggable/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$droppable/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$droppable/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$dropzone/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$dropzone/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$edit-bitmap/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$edit-bitmap/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$edit-text/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$edit-text/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$edit/inputActions\":{\"title\":\"$:/config/flibbles/relink/attributes/$edit/inputActions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$edit/refreshTitle\":{\"title\":\"$:/config/flibbles/relink/attributes/$edit/refreshTitle\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$edit/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$edit/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$encrypt/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$encrypt/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$fieldmangler/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$fieldmangler/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$fields/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$fields/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$genesis/$names\":{\"title\":\"$:/config/flibbles/relink/attributes/$genesis/$names\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$genesis/$values\":{\"title\":\"$:/config/flibbles/relink/attributes/$genesis/$values\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$image/source\":{\"title\":\"$:/config/flibbles/relink/attributes/$image/source\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$importvariables/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$importvariables/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$jsontiddler/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$jsontiddler/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$keyboard/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$keyboard/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$link/to\":{\"title\":\"$:/config/flibbles/relink/attributes/$link/to\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$link/tooltip\":{\"title\":\"$:/config/flibbles/relink/attributes/$link/tooltip\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$linkcatcher/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$linkcatcher/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$linkcatcher/set\":{\"title\":\"$:/config/flibbles/relink/attributes/$linkcatcher/set\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$linkcatcher/to\":{\"title\":\"$:/config/flibbles/relink/attributes/$linkcatcher/to\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$list/editTemplate\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/editTemplate\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$list/emptyMessage\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/emptyMessage\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$list/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$list/history\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/history\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$list/template\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/template\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$log/$$filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$log/$$filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$messagecatcher/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$messagecatcher/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$navigator/history\":{\"title\":\"$:/config/flibbles/relink/attributes/$navigator/history\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$navigator/story\":{\"title\":\"$:/config/flibbles/relink/attributes/$navigator/story\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$radio/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$radio/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$radio/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$radio/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$range/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$range/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$range/actionsStart\":{\"title\":\"$:/config/flibbles/relink/attributes/$range/actionsStart\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$range/actionsStop\":{\"title\":\"$:/config/flibbles/relink/attributes/$range/actionsStop\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$range/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$range/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$reveal/state\":{\"title\":\"$:/config/flibbles/relink/attributes/$reveal/state\",\"text\":\"reference\"},\"$:/config/flibbles/relink/attributes/$reveal/stateTitle\":{\"title\":\"$:/config/flibbles/relink/attributes/$reveal/stateTitle\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$select/actions\":{\"title\":\"$:/config/flibbles/relink/attributes/$select/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/attributes/$select/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$select/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$set/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$set/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$set/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$set/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$set/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$set/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$setmultiplevariables/$names\":{\"title\":\"$:/config/flibbles/relink/attributes/$setmultiplevariables/$names\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$setmultiplevariables/$values\":{\"title\":\"$:/config/flibbles/relink/attributes/$setmultiplevariables/$values\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$setvariable/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$setvariable/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$setvariable/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$setvariable/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$setvariable/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$setvariable/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$tiddler/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$tiddler/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$transclude/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$transclude/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$transclude/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$transclude/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$view/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$view/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$view/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$view/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$wikify/text\":{\"title\":\"$:/config/flibbles/relink/attributes/$wikify/text\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/fieldattributes/$action-createtiddler\":{\"title\":\"$:/config/flibbles/relink/fieldattributes/$action-createtiddler\",\"text\":\"([^$].*)\"},\"$:/config/flibbles/relink/fieldattributes/$action-deletefield\":{\"title\":\"$:/config/flibbles/relink/fieldattributes/$action-deletefield\",\"text\":\"([^$].*)\"},\"$:/config/flibbles/relink/fieldattributes/$action-setfield\":{\"title\":\"$:/config/flibbles/relink/fieldattributes/$action-setfield\",\"text\":\"([^$].*)\"},\"$:/config/flibbles/relink/fieldattributes/$jsontiddler\":{\"title\":\"$:/config/flibbles/relink/fieldattributes/$jsontiddler\",\"text\":\"\\\\$(.*)\"},\"$:/config/flibbles/relink/fields/caption\":{\"title\":\"$:/config/flibbles/relink/fields/caption\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/fields/filter\":{\"title\":\"$:/config/flibbles/relink/fields/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/fields/list-after\":{\"title\":\"$:/config/flibbles/relink/fields/list-after\",\"text\":\"title\"},\"$:/config/flibbles/relink/fields/list-before\":{\"title\":\"$:/config/flibbles/relink/fields/list-before\",\"text\":\"title\"},\"$:/config/flibbles/relink/fields/list\":{\"title\":\"$:/config/flibbles/relink/fields/list\",\"text\":\"list\"},\"$:/config/flibbles/relink/fields/tags\":{\"title\":\"$:/config/flibbles/relink/fields/tags\",\"text\":\"list\"},\"$:/config/flibbles/relink/macros/colour-picker/actions\":{\"title\":\"$:/config/flibbles/relink/macros/colour-picker/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/csvtiddlers/filter\":{\"title\":\"$:/config/flibbles/relink/macros/csvtiddlers/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/datauri/title\":{\"title\":\"$:/config/flibbles/relink/macros/datauri/title\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/image-picker/actions\":{\"title\":\"$:/config/flibbles/relink/macros/image-picker/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/jsontiddler/title\":{\"title\":\"$:/config/flibbles/relink/macros/jsontiddler/title\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/jsontiddlers/filter\":{\"title\":\"$:/config/flibbles/relink/macros/jsontiddlers/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/configTiddlerFilter\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/configTiddlerFilter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/inputAcceptActions\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/inputAcceptActions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/inputAcceptVariantActions\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/inputAcceptVariantActions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/inputCancelActions\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/inputCancelActions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/selectionStateTitle\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/selectionStateTitle\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/storeTitle\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/storeTitle\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/tiddler\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/list-links-draggable/itemTemplate\":{\"title\":\"$:/config/flibbles/relink/macros/list-links-draggable/itemTemplate\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/list-links-draggable/tiddler\":{\"title\":\"$:/config/flibbles/relink/macros/list-links-draggable/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/list-links/emptyMessage\":{\"title\":\"$:/config/flibbles/relink/macros/list-links/emptyMessage\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/list-links/filter\":{\"title\":\"$:/config/flibbles/relink/macros/list-links/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/list-tagged-draggable/emptyMessage\":{\"title\":\"$:/config/flibbles/relink/macros/list-tagged-draggable/emptyMessage\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/list-tagged-draggable/itemTemplate\":{\"title\":\"$:/config/flibbles/relink/macros/list-tagged-draggable/itemTemplate\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/list-tagged-draggable/tag\":{\"title\":\"$:/config/flibbles/relink/macros/list-tagged-draggable/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/list-thumbnails/filter\":{\"title\":\"$:/config/flibbles/relink/macros/list-thumbnails/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/tabs/actions\":{\"title\":\"$:/config/flibbles/relink/macros/tabs/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/tabs/buttonTemplate\":{\"title\":\"$:/config/flibbles/relink/macros/tabs/buttonTemplate\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/tabs/default\":{\"title\":\"$:/config/flibbles/relink/macros/tabs/default\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/tabs/tabsList\":{\"title\":\"$:/config/flibbles/relink/macros/tabs/tabsList\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/tabs/template\":{\"title\":\"$:/config/flibbles/relink/macros/tabs/template\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/tag-picker/actions\":{\"title\":\"$:/config/flibbles/relink/macros/tag-picker/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/tag-pill/actions\":{\"title\":\"$:/config/flibbles/relink/macros/tag-pill/actions\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/tag-pill/tag\":{\"title\":\"$:/config/flibbles/relink/macros/tag-pill/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/tag/tag\":{\"title\":\"$:/config/flibbles/relink/macros/tag/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-expandable/exclude\":{\"title\":\"$:/config/flibbles/relink/macros/toc-expandable/exclude\",\"text\":\"list\"},\"$:/config/flibbles/relink/macros/toc-expandable/itemClassFilter\":{\"title\":\"$:/config/flibbles/relink/macros/toc-expandable/itemClassFilter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/toc-expandable/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc-expandable/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-selective-expandable/exclude\":{\"title\":\"$:/config/flibbles/relink/macros/toc-selective-expandable/exclude\",\"text\":\"list\"},\"$:/config/flibbles/relink/macros/toc-selective-expandable/itemClassFilter\":{\"title\":\"$:/config/flibbles/relink/macros/toc-selective-expandable/itemClassFilter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/toc-selective-expandable/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc-selective-expandable/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/missingText\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/missingText\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/selectedTiddler\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/selectedTiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/template\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/template\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/unselectedText\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/unselectedText\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/missingText\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/missingText\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/selectedTiddler\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/selectedTiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/template\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/template\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/unselectedText\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/unselectedText\",\"text\":\"wikitext\"},\"$:/config/flibbles/relink/macros/toc/itemClassFilter\":{\"title\":\"$:/config/flibbles/relink/macros/toc/itemClassFilter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/toc/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/operators/field:title\":{\"title\":\"$:/config/flibbles/relink/operators/field:title\",\"text\":\"title\"},\"$:/config/flibbles/relink/operators/filter\":{\"title\":\"$:/config/flibbles/relink/operators/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/operators/list\":{\"title\":\"$:/config/flibbles/relink/operators/list\",\"text\":\"reference\"},\"$:/config/flibbles/relink/operators/relink:report\":{\"title\":\"$:/config/flibbles/relink/operators/relink:report\",\"text\":\"title\"},\"$:/config/flibbles/relink/operators/subfilter\":{\"title\":\"$:/config/flibbles/relink/operators/subfilter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/operators/tag\":{\"title\":\"$:/config/flibbles/relink/operators/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/operators/title\":{\"title\":\"$:/config/flibbles/relink/operators/title\",\"text\":\"title\"},\"$:/config/flibbles/relink/settings/default-type\":{\"title\":\"$:/config/flibbles/relink/settings/default-type\",\"text\":\"title\"},\"$:/config/flibbles/relink/touch-modify\":{\"title\":\"$:/config/flibbles/relink/touch-modify\",\"text\":\"yes\"},\"$:/core/ui/EditTemplate/title\":{\"title\":\"$:/core/ui/EditTemplate/title\",\"tags\":\"$:/tags/EditTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$edit-text field=\\\"draft.title\\\" class=\\\"tc-titlebar tc-edit-texteditor\\\" focus=\\\"true\\\" tabindex={{$:/config/EditTabIndex}}/>\\n\\n\u003C$reveal state=\\\"!!draft.title\\\" type=\\\"nomatch\\\" text={{!!draft.of}} tag=\\\"div\\\">\\n\\n\u003C$vars pattern=\\\"\\\"\\\"[\\\\|\\\\[\\\\]{}]\\\"\\\"\\\" bad-chars=\\\"\\\"\\\"`| [ ] { }`\\\"\\\"\\\">\\n\\n\u003C$list filter=\\\"[all[current]regexp:draft.title\u003Cpattern>]\\\" variable=\\\"listItem\\\">\\n\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C/$vars>\\n\\n\u003C$list filter=\\\"[{!!draft.title}!is[missing]]\\\" variable=\\\"listItem\\\">\\n\\n\u003Cdiv class=\\\"tc-message-box\\\">\\n\\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[{!!draft.of}!is[missing]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\\n\\n\u003C$checkbox tiddler=\\\"$:/config/RelinkOnRename\\\" field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" default=\\\"no\\\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}\u003C/$checkbox>\\n\\n\u003C$tiddler tiddler=\u003C\u003CfromTitle>> >\\n\\n\u003C$list filter=\\\"[relink:wouldchange\u003CtoTitle>limit[1]]\\\" variable=\\\"listItem\\\">\\n\\n\u003C$vars stateTiddler=\u003C\u003Cqualify \\\"$:/state/edit/references\\\">> >\\n\\n\u003C$set\\n\\tname=\\\"prompt\\\"\\n\\tfilter=\\\"[relink:wouldchange\u003CtoTitle>relink:impossible\u003CtoTitle>]\\\"\\n\\tvalue=\\\"EditTemplate/Title/Impossibles/Prompt\\\"\\n\\temptyValue=\\\"EditTemplate/Title/References/Prompt\\\" >\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003CstateTiddler>> text=\\\"show\\\">\\n\u003C$button set=\u003C\u003CstateTiddler>> setTo=\\\"show\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/right-arrow}}\\n \\n\u003C$macrocall $name=lingo title=\u003C\u003Cprompt>> />\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CstateTiddler>> text=\\\"show\\\">\\n\u003C$button set=\u003C\u003CstateTiddler>> setTo=\\\"hide\\\" class=\\\"tc-btn-invisible\\\">\\n{{$:/core/images/down-arrow}}\\n \\n\u003C$macrocall $name=lingo title=\u003C\u003Cprompt>> />\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$set>\\n\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003CstateTiddler>> text=\\\"show\\\">\\n\u003C$list variable=\\\"listItem\\\" filter=\\\"[relink:wouldchange\u003CtoTitle>!title[$:/StoryList]sort[title]]\\\" template=\\\"$:/plugins/flibbles/relink/ui/ListItemTemplate\\\">\\n\u003C/$list>\\n\u003C/$reveal>\\n\\n\u003C/$vars>\\n\\n\u003C/$list>\\n\\n\u003C/$tiddler>\\n\\n\u003C/$vars>\\n\\n\u003C/$list>\\n\\n\u003C/$reveal>\\n\"},\"$:/language/Docs/PaletteColours/relink-impossible\":{\"title\":\"$:/language/Docs/PaletteColours/relink-impossible\",\"text\":\"Relink link impossible\"},\"$:/language/EditTemplate/Title/Impossibles/Prompt\":{\"title\":\"$:/language/EditTemplate/Title/Impossibles/Prompt\",\"text\":\"''Warning:'' Not all references in the following tiddlers can be updated by //Relink// due to the complexity of the new title:\"},\"$:/language/EditTemplate/Title/References/Prompt\":{\"title\":\"$:/language/EditTemplate/Title/References/Prompt\",\"text\":\"The following tiddlers will be updated if relinking:\"},\"$:/language/EditTemplate/Title/Relink/Prompt\":{\"title\":\"$:/language/EditTemplate/Title/Relink/Prompt\",\"text\":\"Use //Relink// to update ''\u003C$text text=\u003C\u003CfromTitle>>/>'' to ''\u003C$text text=\u003C\u003CtoTitle>>/>'' across all other tiddlers\"},\"$:/plugins/flibbles/relink/Filters/Missing\":{\"title\":\"$:/plugins/flibbles/relink/Filters/Missing\",\"description\":\"{{$:/plugins/flibbles/relink/language/Filters/Missing}}\",\"filter\":\"[all[]!is[system]relink:references[]!is[tiddler]!is[shadow]!prefix[$:/tags/]sort[title]] -[[]]\",\"tags\":\"$:/tags/Filter\"},\"$:/plugins/flibbles/relink/Filters/Orphans\":{\"title\":\"$:/plugins/flibbles/relink/Filters/Orphans\",\"description\":\"{{$:/plugins/flibbles/relink/language/Filters/Orphans}}\",\"filter\":\"[relink:orphans[]!is[system]sort[title]]\",\"tags\":\"$:/tags/Filter\"},\"$:/plugins/flibbles/relink/configuration\":{\"title\":\"$:/plugins/flibbles/relink/configuration\",\"text\":\"\\\\whitespace trim\\n\u003Cdiv class=\\\"tc-control-panel\\\">\\n\u003C\u003Ctabs \\\"[all[shadows+tiddlers]tag[$:/tags/flibbles/relink/Configuration]!has[draft.of]]\\\" \\\"$:/plugins/flibbles/relink/ui/configuration/Fields\\\">>\\n\u003C/div>\\n\"},\"$:/plugins/flibbles/relink/js/bulkops.js\":{\"title\":\"$:/plugins/flibbles/relink/js/bulkops.js\",\"text\":\"/*\\\\\\nmodule-type: startup\\n\\nReplaces the relinkTiddler defined in $:/core/modules/wiki-bulkops.js\\n\\nThis is a startup instead of a wikimethods module-type because it's the only\\nway to ensure this runs after the old relinkTiddler method is applied.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\\nvar utils = require(\\\"$:/plugins/flibbles/relink/js/utils.js\\\");\\n\\nexports.name = \\\"redefine-relinkTiddler\\\";\\nexports.synchronous = true;\\n// load-modules is when wikimethods are applied in\\n// ``$:/core/modules/startup/load-modules.js``\\nexports.after = ['load-modules'];\\n// We come before commands because they may do renaming, or jasmine testing\\nexports.before = ['commands'];\\n\\nexports.startup = function() {\\n\\t$tw.Wiki.prototype.relinkTiddler = relinkTiddler;\\n};\\n\\n/** Walks through all relinkable tiddlers and relinks them.\\n * This replaces the existing function in core Tiddlywiki.\\n */\\nfunction relinkTiddler(fromTitle, toTitle, options) {\\n\\toptions = options || {};\\n\\tvar failures = [];\\n\\tvar indexer = utils.getIndexer(this);\\n\\tvar records = indexer.relinkLookup(fromTitle, toTitle, options);\\n\\tfor (var title in records) {\\n\\t\\tvar entries = records[title],\\n\\t\\t\\tchanges = Object.create(null),\\n\\t\\t\\tupdate = false,\\n\\t\\t\\tfails = false;\\n\\t\\tfor (var field in entries) {\\n\\t\\t\\tvar entry = entries[field];\\n\\t\\t\\tfails = fails || entry.impossible;\\n\\t\\t\\tif (entry.output !== undefined) {\\n\\t\\t\\t\\tchanges[field] = entry.output;\\n\\t\\t\\t\\tupdate = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (fails) {\\n\\t\\t\\tfailures.push(title);\\n\\t\\t}\\n\\t\\t// If any fields changed, update tiddler\\n\\t\\tif (update) {\\n\\t\\t\\tconsole.log(\\\"Renaming '\\\"+fromTitle+\\\"' to '\\\"+toTitle+\\\"' in '\\\" + title + \\\"'\\\");\\n\\n\\t\\t\\tvar tiddler = this.getTiddler(title);\\n\\t\\t\\tvar modifyField = utils.touchModifyField(this) ? this.getModificationFields() : undefined;\\n\\t\\t\\tvar newTiddler = new $tw.Tiddler(tiddler,changes,modifyField)\\n\\t\\t\\tnewTiddler = $tw.hooks.invokeHook(\\\"th-relinking-tiddler\\\",newTiddler,tiddler);\\n\\t\\t\\tthis.addTiddler(newTiddler);\\n\\t\\t\\t// If the title changed, we need to perform a nested rename\\n\\t\\t\\tif (newTiddler.fields.title !== title) {\\n\\t\\t\\t\\tthis.deleteTiddler(title);\\n\\t\\t\\t\\tthis.relinkTiddler(title, newTiddler.fields.title,options);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t};\\n\\tif (failures.length > 0) {\\n\\t\\tvar options = $tw.utils.extend(\\n\\t\\t\\t{ variables: {to: toTitle, from: fromTitle},\\n\\t\\t\\t wiki: this},\\n\\t\\t\\toptions );\\n\\t\\tlanguage.reportFailures(failures, options);\\n\\t}\\n};\\n\\n})();\\n\",\"module-type\":\"startup\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/contexts/context.js\":{\"title\":\"$:/plugins/flibbles/relink/js/contexts/context.js\",\"text\":\"/*\\\\\\n\\nBase class for relink contexts.\\n\\n\\\\*/\\n\\nfunction Context() {\\n};\\n\\nexports.context = Context;\\n\\n// This class does no special handling of fields, operators, or attributes.\\n// we pass it along to the parent.\\nContext.prototype.getFields = function() {\\n\\treturn this.parent.getFields();\\n};\\n\\nContext.prototype.getOperator = function(name, index) {\\n\\treturn this.parent.getOperator(name, index);\\n};\\n\\nContext.prototype.getOperators = function() {\\n\\treturn this.parent.getOperators();\\n};\\n\\nContext.prototype.getAttribute = function(elementName) {\\n\\treturn this.parent.getAttribute(elementName);\\n};\\n\\nContext.prototype.getAttributes = function() {\\n\\treturn this.parent.getAttributes();\\n};\\n\\nContext.prototype.getConfig = function(category) {\\n\\treturn this.parent.getConfig(category);\\n};\\n\\nContext.prototype.getMacro = function(macroName) {\\n\\treturn this.parent.getMacro(macroName);\\n};\\n\\nContext.prototype.getMacros = function() {\\n\\treturn this.parent.getMacros();\\n};\\n\\nContext.prototype.allowPrettylinks = function() {\\n\\treturn this.parent.allowPrettylinks();\\n};\\n\\nContext.prototype.allowWidgets = function() {\\n\\treturn this.parent.allowWidgets();\\n};\\n\\nContext.prototype.hasImports = function(value) {\\n\\treturn this.parent.hasImports(value);\\n};\\n\",\"module-type\":\"relinkcontext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/contexts/import.js\":{\"title\":\"$:/plugins/flibbles/relink/js/contexts/import.js\",\"text\":\"/*\\\\\\n\\nThis handles the fetching and distribution of relink settings.\\n\\n\\\\*/\\n\\nvar WidgetContext = require('./widget').widget;\\n\\nfunction ImportContext(wiki, parent, filter) {\\n\\tthis.parent = parent;\\n\\tthis.wiki = wiki;\\n\\tvar importWidget = createImportWidget(filter, this.wiki, this.parent.widget);\\n\\tthis._compileList(importWidget.tiddlerList);\\n\\t// This only works if only one filter is imported\\n\\tthis.widget = this.getBottom(importWidget);\\n\\t// Trickle this up, so that any containing tiddlercontext knows that this\\n\\t// tiddler does some importing, and must be checked regularly.\\n\\tparent.hasImports(true);\\n};\\n\\nexports.import = ImportContext;\\n\\nImportContext.prototype = new WidgetContext();\\n\\nImportContext.prototype.changed = function(changes) {\\n\\treturn this.widget && this.widget.refresh(changes)\\n};\\n\\nfunction createImportWidget(filter, wiki, parent) {\\n\\tvar widget = wiki.makeWidget( { tree: [{\\n\\t\\ttype: \\\"importvariables\\\",\\n\\t\\tattributes: {\\n\\t\\t\\t\\\"filter\\\": {\\n\\t\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\t\\tvalue: filter\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}] }, { parentWidget: parent} );\\n\\tif (parent) {\\n\\t\\tparent.children.push(widget);\\n\\t}\\n\\twidget.execute();\\n\\twidget.renderChildren();\\n\\tvar importWidget = widget.children[0];\\n\\treturn importWidget;\\n};\\n\\nImportContext.prototype._compileList = function(titleList) {\\n\\tfor (var i = 0; i \u003C titleList.length; i++) {\\n\\t\\tvar parser = this.wiki.parseTiddler(titleList[i]);\\n\\t\\tif (parser) {\\n\\t\\t\\tvar parseTreeNode = parser.tree[0];\\n\\t\\t\\twhile (parseTreeNode && parseTreeNode.type === \\\"set\\\") {\\n\\t\\t\\t\\tif (parseTreeNode.relink) {\\n\\t\\t\\t\\t\\tfor (var macroName in parseTreeNode.relink) {\\n\\t\\t\\t\\t\\t\\tvar parameters = parseTreeNode.relink[macroName];\\n\\t\\t\\t\\t\\t\\tfor (paramName in parameters) {\\n\\t\\t\\t\\t\\t\\t\\tthis.addSetting(this.wiki, macroName, paramName, parameters[paramName], titleList[i]);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\",\"module-type\":\"relinkcontext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/contexts/tiddler.js\":{\"title\":\"$:/plugins/flibbles/relink/js/contexts/tiddler.js\",\"text\":\"/*\\\\\\n\\nContext for a tiddler. Defines nothing but makes an entry point to test if\\na tiddler must be refreshed.\\n\\n\\\\*/\\n\\nvar WidgetContext = require('./widget.js').widget;\\n\\nfunction TiddlerContext(wiki, parentContext, title) {\\n\\tthis.title = title;\\n\\tthis.parent = parentContext;\\n\\tvar globalWidget = parentContext && parentContext.widget;\\n\\tvar parentWidget = wiki.makeWidget(null, {parentWidget: globalWidget});\\n\\tparentWidget.setVariable('currentTiddler', title);\\n\\tthis.widget = wiki.makeWidget(null, {parentWidget: parentWidget});\\n};\\n\\nexports.tiddler = TiddlerContext;\\n\\nTiddlerContext.prototype = new WidgetContext();\\n\\nTiddlerContext.prototype.changed = function(changes) {\\n\\treturn this.widget && this.widget.refresh(changes);\\n};\\n\\n// By default, a tiddler context does not use imports, unless an import\\n// statement is later discovered somewhere in the fields.\\nTiddlerContext.prototype.hasImports = function(value) {\\n\\treturn this._hasImports || (this._hasImports = value);\\n};\\n\",\"module-type\":\"relinkcontext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/contexts/variable.js\":{\"title\":\"$:/plugins/flibbles/relink/js/contexts/variable.js\",\"text\":\"/*\\\\\\n\\nThis handles the context for variables. Either from $set, $vars, or \\\\define\\n\\n\\\\*/\\n\\nvar WidgetContext = require('./widget').widget;\\n\\nfunction VariableContext(parent, setParseTreeNode) {\\n\\tthis.parent = parent;\\n\\t// Now create a new widget and attach it.\\n\\tvar attachPoint = parent.widget;\\n\\tvar setWidget = attachPoint.makeChildWidget(setParseTreeNode);\\n\\tattachPoint.children.push(setWidget);\\n\\tsetWidget.computeAttributes();\\n\\tsetWidget.execute();\\n\\t// point our widget to bottom, where any other contexts would attach to\\n\\tthis.widget = this.getBottom(setWidget);\\n};\\n\\nexports.variable = VariableContext;\\n\\nVariableContext.prototype = new WidgetContext();\\n\",\"module-type\":\"relinkcontext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/contexts/whitelist.js\":{\"title\":\"$:/plugins/flibbles/relink/js/contexts/whitelist.js\",\"text\":\"/*\\\\\\n\\nThis top-level context manages settings inside the whitelist. It never has\\na parent.\\n\\n\\\\*/\\n\\nvar utils = require('../utils');\\nvar Context = require('./context').context;\\n\\nvar prefix = \\\"$:/config/flibbles/relink/\\\";\\n\\n/**Factories define methods that create settings given config tiddlers.\\n * for factory method 'example', it will be called once for each:\\n * \\\"$:/config/flibbles/relink/example/...\\\" tiddler that exists.\\n * the argument \\\"key\\\" will be set to the contents of \\\"...\\\"\\n *\\n * The reason I build relink settings in this convoluted way is to minimize\\n * the number of times tiddlywiki has to run through EVERY tiddler looking\\n * for relink config tiddlers.\\n */\\nvar settingsGenerators = utils.getModulesByTypeAsHashmap('relinksetting', 'name');\\n\\nfunction WhitelistContext(wiki) {\\n\\tbuild(this, wiki);\\n};\\n\\nexports.whitelist = WhitelistContext;\\n\\nWhitelistContext.prototype = new Context();\\n\\n/**Hot directories are directories for which if anything changes inside them,\\n * then Relink must completely rebuild its index.\\n * By default, this includes the whitelist settings, but relink-titles also\\n * includes its rules disabling directory.\\n * This is the FIRST solution I came up with to this problem. If you're\\n * looking at this, please make a github issue so I have a chance to understand\\n * your needs. This is currently a HACK solution.\\n */\\nWhitelistContext.hotDirectories = [prefix];\\n\\nWhitelistContext.prototype.getAttribute = function(elementName) {\\n\\treturn this.attributes[elementName];\\n};\\n\\nWhitelistContext.prototype.getAttributes = function() {\\n\\treturn flatten(this.attributes);\\n};\\n\\nWhitelistContext.prototype.getFields = function() {\\n\\treturn this.fields;\\n};\\n\\nWhitelistContext.prototype.getConfig = function(category) {\\n\\treturn this[category];\\n};\\n\\nWhitelistContext.prototype.getOperator = function(operatorName, operandIndex) {\\n\\tvar op = this.operators[operatorName];\\n\\treturn op && op[operandIndex || 1];\\n};\\n\\nWhitelistContext.prototype.getOperators = function() {\\n\\tvar signatures = Object.create(null);\\n\\tfor (var op in this.operators) {\\n\\t\\tvar operandSet = this.operators[op];\\n\\t\\tfor (var index in operandSet) {\\n\\t\\t\\tvar entry = operandSet[index];\\n\\t\\t\\tsignatures[entry.key] = entry;\\n\\t\\t}\\n\\t}\\n\\treturn signatures;\\n};\\n\\nWhitelistContext.prototype.getMacro = function(macroName) {\\n\\treturn this.macros[macroName];\\n};\\n\\nWhitelistContext.prototype.getMacros = function() {\\n\\treturn flatten(this.macros);\\n};\\n\\nWhitelistContext.prototype.changed = function(changedTiddlers) {\\n\\tfor (var i = 0; i \u003C WhitelistContext.hotDirectories.length; i++) {\\n\\t\\tvar dir = WhitelistContext.hotDirectories[i];\\n\\t\\tfor (var title in changedTiddlers) {\\n\\t\\t\\tif (title.substr(0, dir.length) === dir) {\\n\\t\\t\\t\\treturn true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn false;\\n};\\n\\nWhitelistContext.prototype.hasImports = function(value) {\\n\\t// We don't care if imports are used. This is the global level.\\n\\treturn false;\\n};\\n\\nfunction build(settings, wiki) {\\n\\tfor (var name in settingsGenerators) {\\n\\t\\tsettings[name] = Object.create(null);\\n\\t}\\n\\twiki.eachShadowPlusTiddlers(function(tiddler, title) {\\n\\t\\tif (title.substr(0, prefix.length) === prefix) {\\n\\t\\t\\tvar remainder = title.substr(prefix.length);\\n\\t\\t\\tvar category = root(remainder);\\n\\t\\t\\tvar factory = settingsGenerators[category];\\n\\t\\t\\tif (factory) {\\n\\t\\t\\t\\tvar name = remainder.substr(category.length+1);\\n\\t\\t\\t\\tfactory.generate(settings[category], tiddler, name, wiki);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\n/* Returns first bit of a path. path/to/tiddler -> path\\n */\\nfunction root(string) {\\n\\tvar index = string.indexOf('/');\\n\\tif (index >= 0) {\\n\\t\\treturn string.substr(0, index);\\n\\t}\\n};\\n\\n/* Turns {dir: {file1: 'value1', file2: 'value2'}}\\n * into {dir/file1: 'value1', dir/file2: 'value2'}\\n */\\nfunction flatten(set) {\\n\\tvar signatures = Object.create(null);\\n\\tfor (var outerName in set) {\\n\\t\\tvar setItem = set[outerName];\\n\\t\\tfor (var innerName in setItem) {\\n\\t\\t\\tsignatures[outerName + \\\"/\\\" + innerName] = setItem[innerName];\\n\\t\\t}\\n\\t}\\n\\treturn signatures;\\n};\\n\",\"module-type\":\"relinkcontext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/contexts/widget.js\":{\"title\":\"$:/plugins/flibbles/relink/js/contexts/widget.js\",\"text\":\"/*\\\\\\n\\nThis is a virtual subclass of context for contexts that exist within widgets\\nof a specific tiddler.\\n\\nAll widget contexts must have a widget member.\\n\\n\\\\*/\\n\\nvar Context = require('./context.js').context;\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\n\\nfunction WidgetContext() {};\\n\\nexports.widget = WidgetContext;\\n\\nWidgetContext.prototype = new Context();\\n\\nWidgetContext.prototype.getMacroDefinition = function(variableName) {\\n\\t// widget.variables is prototyped, so it looks up into all its parents too\\n\\treturn this.widget.variables[variableName] || $tw.macros[variableName];\\n};\\n\\nWidgetContext.prototype.addSetting = function(wiki, macroName, parameter, type, sourceTitle) {\\n\\tthis.macros = this.macros || Object.create(null);\\n\\tvar macro = this.macros[macroName];\\n\\ttype = type || utils.getDefaultType(wiki);\\n\\tif (macro === undefined) {\\n\\t\\tmacro = this.macros[macroName] = Object.create(null);\\n\\t}\\n\\tvar handler = utils.getType(type);\\n\\tif (handler) {\\n\\t\\thandler.source = sourceTitle;\\n\\t\\t// We attach the fields of the defining tiddler for the benefit\\n\\t\\t// of any 3rd party field types that want access to them.\\n\\t\\tvar tiddler = wiki.getTiddler(sourceTitle);\\n\\t\\thandler.fields = tiddler.fields;\\n\\t\\tmacro[parameter] = handler;\\n\\t}\\n};\\n\\nWidgetContext.prototype.getMacros = function() {\\n\\tvar signatures = this.parent.getMacros();\\n\\tif (this.macros) {\\n\\t\\tfor (var macroName in this.macros) {\\n\\t\\t\\tvar macro = this.macros[macroName];\\n\\t\\t\\tfor (var param in macro) {\\n\\t\\t\\t\\tsignatures[macroName + \\\"/\\\" + param] = macro[param];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn signatures;\\n};\\n\\n/**This does strange handling because it's possible for a macro to have\\n * its individual parameters whitelisted in separate places.\\n * Don't know WHY someone would do this, but it can happen.\\n */\\nWidgetContext.prototype.getMacro = function(macroName) {\\n\\tvar theseSettings = this.macros && this.macros[macroName];\\n\\tvar parentSettings;\\n\\tif (this.parent) {\\n\\t\\tparentSettings = this.parent.getMacro(macroName);\\n\\t}\\n\\tif (theseSettings && parentSettings) {\\n\\t\\t// gotta merge them without changing either. This is expensive,\\n\\t\\t// but it'll happen rarely.\\n\\t\\tvar rtnSettings = $tw.utils.extend(Object.create(null), theseSettings, parentSettings);\\n\\t\\treturn rtnSettings;\\n\\t}\\n\\treturn theseSettings || parentSettings;\\n};\\n\\n/**Returns the deepest descendant of the given widget.\\n */\\nWidgetContext.prototype.getBottom = function(widget) {\\n\\twhile (widget.children.length > 0) {\\n\\t\\twidget = widget.children[0];\\n\\t}\\n\\treturn widget;\\n};\\n\",\"module-type\":\"relinkcontext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/contexts/wikitext.js\":{\"title\":\"$:/plugins/flibbles/relink/js/contexts/wikitext.js\",\"text\":\"/*\\\\\\n\\nContext for wikitext. It can contain rules about what's allowed in this\\ncurrent layer of wikitext.\\n\\n\\\\*/\\n\\nvar WidgetContext = require('./widget.js').widget;\\n\\nfunction WikitextContext(parentContext) {\\n\\tthis.parent = parentContext;\\n\\tthis.widget = parentContext.widget;\\n};\\n\\nexports.wikitext = WikitextContext;\\n\\nWikitextContext.prototype = new WidgetContext();\\n\\n// Unless this specific context has rules about it, widgets and prettyLInks are allowed.\\nWikitextContext.prototype.allowWidgets = enabled;\\nWikitextContext.prototype.allowPrettylinks = enabled;\\n\\nfunction enabled() { return true; };\\n\",\"module-type\":\"relinkcontext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/fieldtypes/filter.js\":{\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/filter.js\",\"text\":\"/*\\\\\\n\\nThis specifies logic for updating filters to reflect title changes.\\n\\n\\\\*/\\n\\nvar refHandler = require(\\\"$:/plugins/flibbles/relink/js/fieldtypes/reference\\\");\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar filterRelinkers = utils.getModulesByTypeAsHashmap('relinkfilter', 'name');\\n\\nexports.name = \\\"filter\\\";\\n\\nexports.report = function(filter, callback, options) {\\n\\tif (filter) {\\n\\t\\ttry {\\n\\t\\t\\tvar parseTree = options.wiki.parseFilter(filter);\\n\\t\\t} catch (e) {\\n\\t\\t\\t// It must have been malformed. Return without doing anything.\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tfor (var module in filterRelinkers) {\\n\\t\\t\\tfilterRelinkers[module].report(parseTree, callback, options);\\n\\t\\t}\\n\\t}\\n};\\n\\n/**Returns undefined if no change was made.\\n */\\nexports.relink = function(filter, fromTitle, toTitle, options) {\\n\\tvar changed = false;\\n\\tvar results = {};\\n\\tvar parseTree;\\n\\tif (filter) {\\n\\t\\ttry {\\n\\t\\t\\tparseTree = options.wiki.parseFilter(filter);\\n\\t\\t} catch (e) {\\n\\t\\t\\t// It must have been malformed. Return without doing anything.\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tfor (var module in filterRelinkers) {\\n\\t\\t\\tvar entry = filterRelinkers[module].relink(parseTree, fromTitle, toTitle, options);\\n\\t\\t\\tif (entry) {\\n\\t\\t\\t\\tif (entry.changed) {\\n\\t\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (entry.impossible) {\\n\\t\\t\\t\\t\\tresults.impossible = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\tif (changed) {\\n\\t\\tbuilder = assembleFilterString(parseTree, filter, options);\\n\\t\\tresults.output = builder.results();\\n\\t\\tresults.impossible = results.impossible || builder.impossible;\\n\\t\\treturn results;\\n\\t}\\n\\tif (results.impossible) {\\n\\t\\treturn results;\\n\\t}\\n\\treturn undefined\\n};\\n\\nfunction assembleFilterString(parseTree, oldFilter, options) {\\n\\tvar relinker = new Rebuilder(oldFilter),\\n\\t\\twordBarrierRequired = false,\\n\\t\\tp = 0;\\n\\tfor (var i = 0; i \u003C parseTree.length; i++) {\\n\\t\\tvar start = $tw.utils.skipWhiteSpace(oldFilter, p);\\n\\t\\tif (start !== p) {\\n\\t\\t\\t// There's some breathing room between this run and the last.\\n\\t\\t\\t// We'll never need to insert space.\\n\\t\\t\\twordBarrierRequired = false;\\n\\t\\t\\tp = start;\\n\\t\\t}\\n\\t\\tvar run = parseTree[i];\\n\\t\\tif (run.prefix) {\\n\\t\\t\\tif (wordBarrierRequired) {\\n\\t\\t\\t\\trelinker.add(' ', p, p);\\n\\t\\t\\t\\twordBarrierRequired = false;\\n\\t\\t\\t}\\n\\t\\t\\tp += run.prefix.length;\\n\\t\\t}\\n\\t\\tif (oldFilter[p] !== '['\\n\\t\\t|| (oldFilter[p+1] === '[' && run.operators.length === 1)) {\\n\\t\\t\\t// It's a string title\\n\\t\\t\\tvar text = run.operators[0].operands[0].text,\\n\\t\\t\\t\\tend,\\n\\t\\t\\t\\told;\\n\\t\\t\\tswitch (oldFilter[p]) {\\n\\t\\t\\tcase \\\"'\\\":\\n\\t\\t\\tcase '\\\"':\\n\\t\\t\\t\\t// p + 1 to skip the first quote\\n\\t\\t\\t\\t// indexOf() + 1 to skip the last\\n\\t\\t\\t\\tend = oldFilter.indexOf(oldFilter[p], p+1) + 1;\\n\\t\\t\\t\\told = oldFilter.substring(p+1, end-1);\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase '[':\\n\\t\\t\\t\\tend = oldFilter.indexOf(']', p);\\n\\t\\t\\t\\told = oldFilter.substring(p+2, end);\\n\\t\\t\\t\\t// +2 to get past the ']]'\\n\\t\\t\\t\\tend += 2;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tdefault:\\n\\t\\t\\t\\tend = skipWord(oldFilter, p);\\n\\t\\t\\t\\told = oldFilter.substring(p, end);\\n\\t\\t\\t}\\n\\t\\t\\tif (old !== text) {\\n\\t\\t\\t\\tvar wrapped = wrapTitle(text, oldFilter[p] !== \\\"[\\\" ? oldFilter[p] : '', options);\\n\\t\\t\\t\\tif (wrapped !== undefined) {\\n\\t\\t\\t\\t\\t// This is a no-quote title. If breathing room is required,\\n\\t\\t\\t\\t\\t// add it. Also, we may need breathing room after it.\\n\\t\\t\\t\\t\\tif (wordBarrierRequired && wrapped[0] !== \\\"[\\\") {\\n\\t\\t\\t\\t\\t\\trelinker.add(' ', p, p);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\trelinker.add(wrapped, p, end);\\n\\t\\t\\t\\t\\twordBarrierRequired = wrapped === text;\\n\\t\\t\\t\\t} else if (options.placeholder) {\\n\\t\\t\\t\\t\\tvar ph = options.placeholder.getPlaceholderFor(text);\\n\\t\\t\\t\\t\\trelinker.add('[\u003C' + ph + '>]', p, end);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\trelinker.impossible = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tif (wordBarrierRequired && oldFilter[p] !== \\\"[\\\") {\\n\\t\\t\\t\\t\\trelinker.add(' ', p, p);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\twordBarrierRequired = oldFilter.indexOf(text) === p;\\n\\t\\t\\t}\\n\\t\\t\\tp = end;\\n\\t\\t} else {\\n\\t\\t\\twordBarrierRequired = false;\\n\\t\\t\\tp++;\\n\\t\\t\\tfor (var j = 0; j \u003C run.operators.length; j++) {\\n\\t\\t\\t\\tvar operator = run.operators[j];\\n\\t\\t\\t\\tvar start = p;\\n\\t\\t\\t\\tfor (var index = 0; index \u003C operator.operands.length; index++) {\\n\\t\\t\\t\\t\\tvar operand = operator.operands[index],\\n\\t\\t\\t\\t\\t\\tskip = false;\\n\\t\\t\\t\\t\\t\\tend,\\n\\t\\t\\t\\t\\t\\twrapped;\\n\\t\\t\\t\\t\\tif (operand.indirect) {\\n\\t\\t\\t\\t\\t\\tp = oldFilter.indexOf('{', p);\\n\\t\\t\\t\\t\\t\\tend = oldFilter.indexOf('}', p+1);\\n\\t\\t\\t\\t\\t\\twrapped = '{' + operand.text + '}';\\n\\t\\t\\t\\t\\t} else if (operand.variable) {\\n\\t\\t\\t\\t\\t\\tp = oldFilter.indexOf('\u003C', p);\\n\\t\\t\\t\\t\\t\\tend = oldFilter.indexOf('>', p+1);\\n\\t\\t\\t\\t\\t\\twrapped = '\u003C' + operand.text + '>';\\n\\t\\t\\t\\t\\t} else if (operator.regexp) {\\n\\t\\t\\t\\t\\t\\tp = oldFilter.indexOf('/', p);\\n\\t\\t\\t\\t\\t\\tend = oldFilter.indexOf('/', p+1);\\n\\t\\t\\t\\t\\t\\tskip = true;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tp = oldFilter.indexOf('[', p);\\n\\t\\t\\t\\t\\t\\tend = oldFilter.indexOf(']', p+1);\\n\\t\\t\\t\\t\\t\\tif (!canBePrettyOperand(operand.text) || (options.inBraces && operand.text.indexOf('}}}') >= 0)) {\\n\\t\\t\\t\\t\\t\\t\\tif (options.placeholder) {\\n\\t\\t\\t\\t\\t\\t\\t\\tvar ph = options.placeholder.getPlaceholderFor(operand.text, operand.handler);\\n\\t\\t\\t\\t\\t\\t\\t\\twrapped = '\u003C' + ph + '>';\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tskip = true;\\n\\t\\t\\t\\t\\t\\t\\t\\trelinker.impossible = true;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\twrapped = '[' + operand.text + ']';\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tend++; // skip the closing brace\\n\\t\\t\\t\\t\\tif (index === 0) {\\n\\t\\t\\t\\t\\t\\t// If this is the first operand, let's first recreate the operator signature in case it was changed at all.\\n\\t\\t\\t\\t\\t\\trelinker.add(operatorSignature(operator, oldFilter, start), start, p);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif (!skip) {\\n\\t\\t\\t\\t\\t\\trelinker.add(wrapped, p, end);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tp = end;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tp++; // Skip the closing brace;\\n\\t\\t}\\n\\t}\\n\\treturn relinker;\\n};\\n\\nfunction operatorSignature(operator, oldText, start) {\\n\\t// If it's a title operand, try to determine if it was a shorthand.\\n\\tvar prefix = operator.prefix || '';\\n\\tvar signature = prefix + ((operator.operator === 'title' && oldText[start + prefix.length] !== 't')? '': operator.operator);\\n\\tif (operator.suffix) {\\n\\t\\tsignature += ':' + operator.suffix;\\n\\t}\\n\\treturn signature;\\n}\\n\\nfunction skipWord(source,pos) {\\n\\tvar c;\\n\\twhile(true) {\\n\\t\\tc = source.charAt(pos);\\n\\t\\tif((c !== \\\"\\\") && (c !== \\\" \\\") && (c !== \\\"\\\\f\\\") && (c !== \\\"\\\\n\\\")\\n\\t\\t&& (c !== \\\"\\\\r\\\") && (c !== \\\"\\\\t\\\")\\n\\t\\t&& (c !== \\\"\\\\v\\\")&& (c !== \\\"\\\\u00a0\\\") // Ignores obscure unicode spaces\\n\\t\\t&& (c !== \\\"[\\\") && (c !== \\\"]\\\")) { // Ignore brackets\\n\\t\\t\\tpos++;\\n\\t\\t} else {\\n\\t\\t\\treturn pos;\\n\\t\\t}\\n\\t}\\n};\\n\\n/* Same as this.relink, except this has the added constraint that the return\\n * value must be able to be wrapped in curly braces. (i.e. '{{{...}}}')\\n */\\nexports.relinkInBraces = function(filter, fromTitle, toTitle, options) {\\n\\tvar braceOptions = $tw.utils.extend({inBraces: true}, options);\\n\\tvar entry = this.relink(filter, fromTitle, toTitle, braceOptions);\\n\\tif (entry && entry.output && !canBeInBraces(entry.output)) {\\n\\t\\t// It was possible, but it won't fit in braces, so we must give up\\n\\t\\tdelete entry.output;\\n\\t\\tentry.impossible = true;\\n\\t}\\n\\treturn entry;\\n};\\n\\nfunction wrapTitle(value, preference, options) {\\n\\tvar choices = {\\n\\t\\t\\\"\\\": function(v) {return /^[^\\\\s\\\\[\\\\]\\\\}\\\\+\\\\-\\\\~\\\\=\\\\:][^\\\\s\\\\[\\\\]]*[^\\\\s\\\\[\\\\]\\\\}]$/.test(v); },\\n\\t\\t\\\"[\\\": canBePrettyOperand,\\n\\t\\t\\\"'\\\": function(v) {return v.indexOf(\\\"'\\\") \u003C 0; },\\n\\t\\t'\\\"': function(v) {return v.indexOf('\\\"') \u003C 0; }\\n\\t};\\n\\tvar wrappers = {\\n\\t\\t\\\"\\\": function(v) {return v; },\\n\\t\\t\\\"[\\\": function(v) {return \\\"[[\\\"+v+\\\"]]\\\"; },\\n\\t\\t\\\"'\\\": function(v) {return \\\"'\\\"+v+\\\"'\\\"; },\\n\\t\\t'\\\"': function(v) {return '\\\"'+v+'\\\"'; }\\n\\t};\\n\\tif (options.inBraces && value.indexOf('}}}') >= 0) {\\n\\t\\t// In this particular case, it can't be wrapped in this filter,\\n\\t\\t// even if it would have worked within the context of the filter itself\\n\\t\\treturn undefined;\\n\\t}\\n\\tif (!choices[preference]) {\\n\\t\\tpreference = '';\\n\\t}\\n\\tif (choices[preference](value)) {\\n\\t\\treturn wrappers[preference](value);\\n\\t}\\n\\tfor (var quote in choices) {\\n\\t\\tif (choices[quote](value)) {\\n\\t\\t\\treturn wrappers[quote](value);\\n\\t\\t}\\n\\t}\\n\\t// No quotes will work on this\\n\\treturn undefined;\\n}\\n\\nfunction canBePrettyOperand(value) {\\n\\treturn value.indexOf(']') \u003C 0;\\n};\\n\\nfunction canBeInBraces(value) {\\n\\treturn value.indexOf(\\\"}}}\\\") \u003C 0 && value.substr(value.length-2) !== '}}';\\n};\\n\",\"module-type\":\"relinkfieldtype\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/fieldtypes/filter/operators.js\":{\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/filter/operators.js\",\"text\":\"/*\\\\\\n\\nHandles reporting of filter operators.\\n\\n\\\\*/\\n\\nvar refHandler = require(\\\"$:/plugins/flibbles/relink/js/fieldtypes/reference\\\");\\nvar titleHandler = require(\\\"$:/plugins/flibbles/relink/js/fieldtypes/title\\\");\\nvar macrocall = require(\\\"$:/plugins/flibbles/relink/js/utils/macrocall.js\\\");\\n\\nexports.name = \\\"operators\\\";\\n\\nexports.report = function(filterParseTree, callback, options) {\\n\\tfor (var i = 0; i \u003C filterParseTree.length; i++) {\\n\\t\\tvar run = filterParseTree[i];\\n\\t\\tfor (var j = 0; j \u003C run.operators.length; j++) {\\n\\t\\t\\tvar operator = run.operators[j];\\n\\t\\t\\tfor (var index = 1; index \u003C= operator.operands.length; index++) {\\n\\t\\t\\t\\tvar operand = operator.operands[index-1];\\n\\t\\t\\t\\tvar display = operator.operator === 'title'? '': operator.operator;\\n\\t\\t\\t\\tif (operator.suffix) {\\n\\t\\t\\t\\t\\tdisplay += ':' + operator.suffix;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Now add any commas if this is a later operand\\n\\t\\t\\t\\tfor (var x = 1; x \u003C index; x++) {\\n\\t\\t\\t\\t\\tdisplay += ',';\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (operand.indirect) {\\n\\t\\t\\t\\t\\trefHandler.report(operand.text, function(title, blurb) {\\n\\t\\t\\t\\t\\t\\tcallback(title, (run.prefix || '') + '[' + (operator.prefix || '') + display + '{' + (blurb || '') + '}]');\\n\\t\\t\\t\\t\\t}, options);\\n\\t\\t\\t\\t} else if (operand.variable) {\\n\\t\\t\\t\\t\\tvar macro = $tw.utils.parseMacroInvocation(\\\"\u003C\u003C\\\"+operand.text+\\\">>\\\", 0);\\n\\t\\t\\t\\t\\tmacrocall.report(options.settings, macro, function(title, blurb) {\\n\\t\\t\\t\\t\\t\\tcallback(title, (run.prefix || '') + '[' + (operator.prefix || '') + display + '\u003C' + blurb + '>]');\\n\\t\\t\\t\\t\\t}, options);\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t} else if (operand.text) {\\n\\t\\t\\t\\t\\tvar handler = fieldType(options.settings, operator, index, options)\\n\\t\\t\\t\\t\\tif (handler) {\\n\\t\\t\\t\\t\\t\\thandler.report(operand.text, function(title, blurb) {\\n\\t\\t\\t\\t\\t\\t\\tif (blurb || !standaloneTitleRun(run)) {\\n\\t\\t\\t\\t\\t\\t\\t\\tcallback(title, (run.prefix || '') + '[' + (operator.prefix || '') + display + '[' + (blurb || '') + ']]');\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcallback(title, run.prefix);\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}, options);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(filterParseTree, fromTitle, toTitle, options) {\\n\\tvar output = {};\\n\\tfor (var i = 0; i \u003C filterParseTree.length; i++) {\\n\\t\\tvar run = filterParseTree[i];\\n\\t\\tfor (var j = 0; j \u003C run.operators.length; j++) {\\n\\t\\t\\tvar operator = run.operators[j];\\n\\t\\t\\tfor (var index = 1; index \u003C= operator.operands.length; index++) {\\n\\t\\t\\t\\tvar operand = operator.operands[index-1],\\n\\t\\t\\t\\t\\tentry = undefined;\\n\\t\\t\\t\\tif (operand.indirect) {\\n\\t\\t\\t\\t\\tentry = refHandler.relinkInBraces(operand.text, fromTitle, toTitle, options);\\n\\t\\t\\t\\t} else if (operand.variable) {\\n\\t\\t\\t\\t\\tentry = relinkMacro(options.settings, operand.text, fromTitle, toTitle, options);\\n\\t\\t\\t\\t} else if (operand.text) {\\n\\t\\t\\t\\t\\tvar handler = fieldType(options.settings, operator, index, options)\\n\\t\\t\\t\\t\\tif (handler) {\\n\\t\\t\\t\\t\\t\\tentry = handler.relink(operand.text, fromTitle, toTitle, options);\\n\\t\\t\\t\\t\\t\\tif (entry && entry.output) {\\n\\t\\t\\t\\t\\t\\t\\toperand.handler = handler.name;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (entry) {\\n\\t\\t\\t\\t\\tif (entry.output) {\\n\\t\\t\\t\\t\\t\\toutput.changed = true;\\n\\t\\t\\t\\t\\t\\toperand.text = entry.output;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif (entry.impossible) {\\n\\t\\t\\t\\t\\t\\toutput.impossible = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn output;\\n};\\n\\n// Returns the relinker needed for a given operator, or returns undefined.\\n// This method should really be broken into three modules called relinkfilteroperator\\nfunction fieldType(context, operator, index, options) {\\n\\tvar op = operator.operator,\\n\\t\\tsuffix = operator.suffix,\\n\\t\\trtn = (suffix && context.getOperator(op + ':' + suffix, index))\\n\\t\\t || context.getOperator(op, index);\\n\\tif (!rtn && op === 'contains' && index == 1) {\\n\\t\\t// The 'contains' operator gets special handling\\n\\t\\tsuffix = suffix || 'list';\\n\\t\\tvar handler = context.getFields()[suffix];\\n\\t\\tif (handler && (handler.name === 'list' || handler.name === 'filter')) {\\n\\t\\t\\t// Contains uses the title handler, but only if it's\\n\\t\\t\\t// searching a 'list' or 'filter' field.\\n\\t\\t\\treturn titleHandler;\\n\\t\\t}\\n\\n\\t}\\n\\tif (!rtn && index == 1) {\\n\\t\\t// maybe it's a field operator?\\n\\t\\trtn = (op === 'field' && context.getFields()[suffix])\\n\\t\\t || (!suffix && !options.wiki.getFilterOperators()[op] && context.getFields()[op]);\\n\\t}\\n\\treturn rtn;\\n};\\n\\nfunction standaloneTitleRun(run) {\\n\\tif (run.operators.length == 1) {\\n\\t\\tvar op = run.operators[0];\\n\\t\\treturn op.operator === 'title'\\n\\t\\t\\t&& !op.prefix\\n\\t\\t\\t&& !op.suffix;\\n\\t}\\n\\treturn false;\\n};\\n\\n// Takes care of relinking a macro, as well as putting it back together.\\nfunction relinkMacro(context, text, fromTitle, toTitle, options) {\\n\\ttext = \\\"\u003C\u003C\\\" + text + \\\">>\\\";\\n\\tvar macro = $tw.utils.parseMacroInvocation(text, 0);\\n\\tvar entry = macrocall.relink(context, macro, text, fromTitle, toTitle, false, options);\\n\\tif (entry && entry.output) {\\n\\t\\tvar string = macrocall.reassemble(entry.output, text, options);\\n\\t\\t// We remove the surrounding brackets.\\n\\t\\tstring = string.substring(2, string.length-2);\\n\\t\\t// And we make sure that no brackets remain\\n\\t\\tif (string.indexOf(\\\">\\\") >= 0) {\\n\\t\\t\\tdelete entry.output;\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t} else {\\n\\t\\t\\tentry.output = string;\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\",\"module-type\":\"relinkfilter\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/fieldtypes/list.js\":{\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/list.js\",\"text\":\"/*\\\\\\nThis manages replacing titles that occur within stringLists, like,\\n\\nTiddlerA [[Tiddler with spaces]] [[Another Title]]\\n\\\\*/\\n\\nexports.name = \\\"list\\\";\\n\\nexports.report = function(value, callback, options) {\\n\\tvar list = $tw.utils.parseStringArray(value);\\n\\tfor (var i = 0; i \u003C list.length; i++) {\\n\\t\\tcallback(list[i]);\\n\\t}\\n};\\n\\n/**Returns undefined if no change was made.\\n * Parameter: value can literally be a list. This can happen for builtin\\n * types 'list' and 'tag'. In those cases, we also return list.\\n */\\nexports.relink = function(value, fromTitle, toTitle, options) {\\n\\tvar isModified = false,\\n\\t\\tactualList = false,\\n\\t\\tlist;\\n\\tif (typeof value !== \\\"string\\\") {\\n\\t\\t// Not a string. Must be a list.\\n\\t\\t// clone it, since we may make changes to this possibly\\n\\t\\t// frozen list.\\n\\t\\tlist = (value || []).slice(0);\\n\\t\\tactualList = true;\\n\\t} else {\\n\\t\\tlist = $tw.utils.parseStringArray(value || \\\"\\\");\\n\\t}\\n\\t$tw.utils.each(list,function (title,index) {\\n\\t\\tif(title === fromTitle) {\\n\\t\\t\\tlist[index] = toTitle;\\n\\t\\t\\tisModified = true;\\n\\t\\t}\\n\\t});\\n\\tif (isModified) {\\n\\t\\tvar entry = {name: \\\"list\\\"};\\n\\t\\t// It doesn't parse correctly alone, it won't\\n\\t\\t// parse correctly in any list.\\n\\t\\tif (!canBeListItem(toTitle)) {\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t} else if (actualList) {\\n\\t\\t\\tentry.output = list;\\n\\t\\t} else {\\n\\t\\t\\tentry.output = $tw.utils.stringifyList(list);\\n\\t\\t}\\n\\t\\treturn entry;\\n\\t}\\n\\treturn undefined;\\n};\\n\\nfunction canBeListItem(value) {\\n\\tvar regexp = /\\\\]\\\\][^\\\\S\\\\xA0]/m;\\n\\treturn !regexp.test(value);\\n};\\n\",\"module-type\":\"relinkfieldtype\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/fieldtypes/reference.js\":{\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/reference.js\",\"text\":\"/*\\\\\\nThis manages replacing titles that occur inside text references,\\n\\ntiddlerTitle\\ntiddlerTitle!!field\\n!!field\\ntiddlerTitle##propertyIndex\\n\\\\*/\\n\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar referenceOperators = utils.getModulesByTypeAsHashmap('relinkreference', 'name');\\n\\nexports.name = \\\"reference\\\";\\n\\nexports.report = function(value, callback, options) {\\n\\tif (value) {\\n\\t\\tvar reference = $tw.utils.parseTextReference(value);\\n\\t\\tfor (var operator in referenceOperators) {\\n\\t\\t\\treferenceOperators[operator].report(reference, callback, options);\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(value, fromTitle, toTitle, options) {\\n\\tvar entry;\\n\\tif (value) {\\n\\t\\tvar impossible = false;\\n\\t\\tvar modified = false;\\n\\t\\tvar reference = $tw.utils.parseTextReference(value);\\n\\t\\tfor (var operator in referenceOperators) {\\n\\t\\t\\tvar result = referenceOperators[operator].relink(reference, fromTitle, toTitle, options);\\n\\t\\t\\tif (result) {\\n\\t\\t\\t\\tif (result.impossible) {\\n\\t\\t\\t\\t\\timpossible = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (result.output) {\\n\\t\\t\\t\\t\\tmodified = true;\\n\\t\\t\\t\\t\\treference = result.output;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (modified) {\\n\\t\\t\\tif (exports.canBePretty(reference.title)) {\\n\\t\\t\\t\\tentry = {output: exports.toString(reference)};\\n\\t\\t\\t} else {\\n\\t\\t\\t\\timpossible = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (impossible) {\\n\\t\\t\\tentry = entry || {};\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\\n/* Same as this.relink, except this has the added constraint that the return\\n * value must be able to be wrapped in curly braces.\\n */\\nexports.relinkInBraces = function(value, fromTitle, toTitle, options) {\\n\\tvar log = this.relink(value, fromTitle, toTitle, options);\\n\\tif (log && log.output && log.output.indexOf(\\\"}\\\") >= 0) {\\n\\t\\tdelete log.output;\\n\\t\\tlog.impossible = true;\\n\\t}\\n\\treturn log;\\n};\\n\\nexports.toString = function(textReference) {\\n\\tvar title = textReference.title || '';\\n\\tif (textReference.field) {\\n\\t\\treturn title + \\\"!!\\\" + textReference.field;\\n\\t} else if (textReference.index) {\\n\\t\\treturn title + \\\"##\\\" + textReference.index;\\n\\t}\\n\\treturn title;\\n};\\n\\nexports.canBePretty = function(title) {\\n\\treturn !title || (title.indexOf(\\\"!!\\\") \u003C 0 && title.indexOf(\\\"##\\\") \u003C 0);\\n};\\n\",\"module-type\":\"relinkfieldtype\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/fieldtypes/reference/title.js\":{\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/reference/title.js\",\"text\":\"/*\\\\\\n\\nThis handles the title inside of references.\\n\\n\\\\*/\\n\\nexports.name = 'title';\\n\\nexports.report = function(reference, callback, options) {\\n\\tvar title = reference.title;\\n\\tif (title) {\\n\\t\\tif (reference.field) {\\n\\t\\t\\tcallback(title, '!!' + reference.field);\\n\\t\\t} else if (reference.index) {\\n\\t\\t\\tcallback(title, '##' + reference.index);\\n\\t\\t} else {\\n\\t\\t\\tcallback(title);\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(reference, fromTitle, toTitle, options) {\\n\\tif ($tw.utils.trim(reference.title) === fromTitle) {\\n\\t\\t// preserve user's whitespace\\n\\t\\treference.title = reference.title.replace(fromTitle, toTitle);\\n\\t\\treturn {output: reference};\\n\\t}\\n};\\n\",\"module-type\":\"relinkreference\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/fieldtypes/title.js\":{\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/title.js\",\"text\":\"/*\\\\\\nThis specifies logic for replacing a single-tiddler field. This is the\\nsimplest kind of field type. One title swaps out for the other.\\n\\\\*/\\n\\n// NOTE TO MODDERS: If you're making your own field types, the name must be\\n// alpha characters only.\\nexports.name = 'title';\\n\\nexports.report = function(value, callback, options) {\\n\\tcallback(value);\\n};\\n\\n/**Returns undefined if no change was made.\\n */\\nexports.relink = function(value, fromTitle, toTitle, options) {\\n\\tif (value === fromTitle) {\\n\\t\\treturn {output: toTitle};\\n\\t}\\n\\treturn undefined;\\n};\\n\\n// This is legacy support for when 'title' was known as 'field'\\nexports.aliases = ['field', 'yes'];\\n\",\"module-type\":\"relinkfieldtype\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/fieldtypes/wikitext.js\":{\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/wikitext.js\",\"text\":\"/*\\\\\\nThis specifies logic for updating filters to reflect title changes.\\n\\\\*/\\n\\nexports.name = \\\"wikitext\\\";\\n\\nvar type = 'text/vnd.tiddlywiki';\\n\\nvar WikiParser = require(\\\"$:/core/modules/parsers/wikiparser/wikiparser.js\\\")[type];\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder.js\\\");\\nvar utils = require('$:/plugins/flibbles/relink/js/utils');\\nvar WikitextContext = utils.getContext('wikitext');\\n\\nfunction collectRules() {\\n\\tvar rules = Object.create(null);\\n\\t$tw.modules.forEachModuleOfType(\\\"relinkwikitextrule\\\", function(title, exports) {\\n\\t\\tvar names = exports.name;\\n\\t\\tif (typeof names === \\\"string\\\") {\\n\\t\\t\\tnames = [names];\\n\\t\\t}\\n\\t\\tif (names !== undefined) {\\n\\t\\t\\tfor (var i = 0; i \u003C names.length; i++) {\\n\\t\\t\\t\\trules[names[i]] = exports;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn rules;\\n}\\n\\nfunction WikiWalker(type, text, options) {\\n\\tthis.options = options;\\n\\tif (!this.relinkMethodsInjected) {\\n\\t\\tvar rules = collectRules();\\n\\t\\t$tw.utils.each([this.pragmaRuleClasses, this.blockRuleClasses, this.inlineRuleClasses], function(classList) {\\n\\t\\t\\tfor (var name in classList) {\\n\\t\\t\\t\\tif (rules[name]) {\\n\\t\\t\\t\\t\\tdelete rules[name].name;\\n\\t\\t\\t\\t\\t$tw.utils.extend(classList[name].prototype, rules[name]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t\\tWikiWalker.prototype.relinkMethodsInjected = true;\\n\\t}\\n\\tthis.context = new WikitextContext(options.settings);\\n\\tWikiParser.call(this, type, text, options);\\n};\\n\\nWikiWalker.prototype = Object.create(WikiParser.prototype);\\n\\nWikiWalker.prototype.parsePragmas = function() {\\n\\tvar entries = this.tree;\\n\\twhile (true) {\\n\\t\\tthis.skipWhitespace();\\n\\t\\tif (this.pos >= this.sourceLength) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\tvar nextMatch = this.findNextMatch(this.pragmaRules, this.pos);\\n\\t\\tif (!nextMatch || nextMatch.matchIndex !== this.pos) {\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\tentries.push.apply(entries, this.handleRule(nextMatch));\\n\\t}\\n\\treturn entries;\\n};\\n\\nWikiWalker.prototype.parseInlineRunUnterminated = function(options) {\\n\\tvar entries = [];\\n\\tvar nextMatch = this.findNextMatch(this.inlineRules, this.pos);\\n\\twhile (this.pos \u003C this.sourceLength && nextMatch) {\\n\\t\\tif (nextMatch.matchIndex > this.pos) {\\n\\t\\t\\tthis.pos = nextMatch.matchIndex;\\n\\t\\t}\\n\\t\\tentries.push.apply(entries, this.handleRule(nextMatch));\\n\\t\\tnextMatch = this.findNextMatch(this.inlineRules, this.pos);\\n\\t}\\n\\tthis.pos = this.sourceLength;\\n\\treturn entries;\\n};\\n\\nWikiWalker.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\\n\\tvar entries = [];\\n\\toptions = options || {};\\n\\tterminatorRegExp.lastIndex = this.pos;\\n\\tvar terminatorMatch = terminatorRegExp.exec(this.source);\\n\\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\\n\\twhile(this.pos \u003C this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\\n\\t\\tif (terminatorMatch) {\\n\\t\\t\\tif (!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\\n\\t\\t\\t\\tthis.pos = terminatorMatch.index;\\n\\t\\t\\t\\tif (options.eatTerminator) {\\n\\t\\t\\t\\t\\tthis.pos += terminatorMatch[0].length;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn entries;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (inlineRuleMatch) {\\n\\t\\t\\tif (inlineRuleMatch.matchIndex > this.pos) {\\n\\t\\t\\t\\tthis.pos = inlineRuleMatch.matchIndex;\\n\\t\\t\\t}\\n\\t\\t\\tentries.push.apply(entries, this.handleRule(inlineRuleMatch));\\n\\t\\t\\tinlineRuleMatch = this.findNextMatch(this.inlineRules, this.pos);\\n\\t\\t\\tterminatorRegExp.lastIndex = this.pos;\\n\\t\\t\\tterminatorMatch = terminatorRegExp.exec(this.source);\\n\\t\\t}\\n\\t}\\n\\tthis.pos = this.sourceLength;\\n\\treturn entries;\\n\\n};\\n\\nWikiWalker.prototype.parseBlock = function(terminatorRegExpString) {\\n\\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\\\"(\\\" + terminatorRegExpString + \\\"|\\\\\\\\r?\\\\\\\\n\\\\\\\\r?\\\\\\\\n)\\\",\\\"mg\\\") : /(\\\\r?\\\\n\\\\r?\\\\n)/mg;\\n\\tthis.skipWhitespace();\\n\\tif (this.pos >= this.sourceLength) {\\n\\t\\treturn [];\\n\\t}\\n\\tvar nextMatch = this.findNextMatch(this.blockRules, this.pos);\\n\\tif(nextMatch && nextMatch.matchIndex === this.pos) {\\n\\t\\treturn this.handleRule(nextMatch);\\n\\t}\\n\\treturn this.parseInlineRun(terminatorRegExp);\\n};\\n\\nWikiWalker.prototype.amendRules = function(type, names) {\\n\\tvar only;\\n\\tWikiParser.prototype.amendRules.call(this, type, names);\\n\\tif (type === \\\"only\\\") {\\n\\t\\tonly = true;\\n\\t} else if (type === \\\"except\\\") {\\n\\t\\tonly = false;\\n\\t} else {\\n\\t\\treturn;\\n\\t}\\n\\tif (only !== (names.indexOf(\\\"macrodef\\\") >= 0) && this.options.macrodefCanBeDisabled) {\\n\\t\\tthis.options.placeholder = undefined\\n\\t}\\n\\tif (only !== (names.indexOf(\\\"html\\\") >= 0)) {\\n\\t\\tthis.context.allowWidgets = disabled;\\n\\t}\\n\\tif (only !== (names.indexOf(\\\"prettylink\\\") >= 0)) {\\n\\t\\tthis.context.allowPrettylinks = disabled;\\n\\t}\\n};\\n\\nfunction disabled() { return false; };\\n\\n/// Reporter\\n\\nfunction WikiReporter(type, text, callback, options) {\\n\\tthis.callback = callback;\\n\\tWikiWalker.call(this, type, text, options);\\n};\\n\\nWikiReporter.prototype = Object.create(WikiWalker.prototype);\\n\\nWikiReporter.prototype.handleRule = function(ruleInfo) {\\n\\tif (ruleInfo.rule.report) {\\n\\t\\truleInfo.rule.report(this.source, this.callback, this.options);\\n\\t} else {\\n\\t\\tif (ruleInfo.rule.matchRegExp !== undefined) {\\n\\t\\t\\tthis.pos = ruleInfo.rule.matchRegExp.lastIndex;\\n\\t\\t} else {\\n\\t\\t\\t// We can't easily determine the end of this\\n\\t\\t\\t// rule match. We'll \\\"parse\\\" it so that\\n\\t\\t\\t// parser.pos gets updated, but we throw away\\n\\t\\t\\t// the results.\\n\\t\\t\\truleInfo.rule.parse();\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.report = function(wikitext, callback, options) {\\n\\t// Unfortunately it's the side-effect of creating this that reports.\\n\\tnew WikiReporter(options.type, wikitext, callback, options);\\n};\\n\\n/// Relinker\\n\\nfunction WikiRelinker(type, text, fromTitle, toTitle, options) {\\n\\tthis.fromTitle = fromTitle;\\n\\tthis.toTitle = toTitle;\\n\\tthis.placeholder = options.placeholder;\\n\\tif (this.placeholder) {\\n\\t\\tthis.placeholder.parser = this;\\n\\t}\\n\\tWikiWalker.call(this, type, text, options);\\n};\\n\\nWikiRelinker.prototype = Object.create(WikiWalker.prototype);\\n\\nWikiRelinker.prototype.handleRule = function(ruleInfo) {\\n\\tif (ruleInfo.rule.relink) {\\n\\t\\tvar start = ruleInfo.matchIndex;\\n\\t\\tvar newEntry = ruleInfo.rule.relink(this.source, this.fromTitle, this.toTitle, this.options);\\n\\t\\tif (newEntry !== undefined) {\\n\\t\\t\\tif (newEntry.output) {\\n\\t\\t\\t\\tnewEntry.start = start;\\n\\t\\t\\t\\tnewEntry.end = this.pos;\\n\\t\\t\\t}\\n\\t\\t\\treturn [newEntry];\\n\\t\\t}\\n\\t} else {\\n\\t\\tif (ruleInfo.rule.matchRegExp !== undefined) {\\n\\t\\t\\tthis.pos = ruleInfo.rule.matchRegExp.lastIndex;\\n\\t\\t} else {\\n\\t\\t\\t// We can't easily determine the end of this\\n\\t\\t\\t// rule match. We'll \\\"parse\\\" it so that\\n\\t\\t\\t// parser.pos gets updated, but we throw away\\n\\t\\t\\t// the results.\\n\\t\\t\\truleInfo.rule.parse();\\n\\t\\t}\\n\\t}\\n\\treturn [];\\n};\\n\\nexports.relink = function(wikitext, fromTitle, toTitle, options) {\\n\\tvar parser = new WikiRelinker(options.type, wikitext, fromTitle, toTitle, options),\\n\\t\\twikiEntry = undefined;\\n\\t// Now that we have an array of entries, let's produce the wikiText entry\\n\\t// containing them all.\\n\\tif (parser.tree.length > 0) {\\n\\t\\tvar builder = new Rebuilder(wikitext);\\n\\t\\twikiEntry = {};\\n\\t\\tfor (var i = 0; i \u003C parser.tree.length; i++) {\\n\\t\\t\\tvar entry = parser.tree[i];\\n\\t\\t\\tif (entry.impossible) {\\n\\t\\t\\t\\twikiEntry.impossible = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (entry.output) {\\n\\t\\t\\t\\tbuilder.add(entry.output, entry.start, entry.end);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\twikiEntry.output = builder.results();\\n\\t}\\n\\treturn wikiEntry;\\n};\\n\",\"module-type\":\"relinkfieldtype\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/filteroperators/all_relinkable.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/all_relinkable.js\",\"text\":\"/*\\\\\\nmodule-type: allfilteroperator\\n\\nFilter function for [all[relinkable]].\\nReturns all tiddlers subject to relinking.\\n\\n\\\\*/\\n\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.relinkable = function(source,prefix,options) {\\n\\treturn options.wiki.getRelinkableTitles();\\n};\\n\\n})();\\n\",\"module-type\":\"allfilteroperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/filteroperators/orphans.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/orphans.js\",\"text\":\"/*\\\\\\nmodule-type: relinkfilteroperator\\n\\nFilter function for [relink:orphans[]].\\nReturns all tiddlers which are not referenced in any way\\n\\n\\\\*/\\n\\n(function() {\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.orphans = function(source,prefix,options) {\\n\\treturn options.wiki.getRelinkOrphans();\\n};\\n\\n})();\\n\",\"module-type\":\"relinkfilteroperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/filteroperators/references.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/references.js\",\"text\":\"/*\\\\\\nmodule-type: relinkfilteroperator\\n\\nGiven a title as an operand, returns all non-shadow tiddlers that have any\\nsort of updatable reference to it.\\n\\n`relink:backreferences[]]`\\n`relink:references[]]`\\n\\nReturns all tiddlers that reference `fromTiddler` somewhere inside them.\\n\\nInput is ignored. Maybe it shouldn't do this.\\n\\\\*/\\n\\nvar LinkedList = $tw.utils.LinkedList;\\n\\nif (!LinkedList) {\\n\\t/* If the linked list isn't available, make a quick crappy version. */\\n\\tLinkedList = function() {this.array=[];};\\n\\n\\tLinkedList.prototype.pushTop = function(array) {\\n\\t\\t$tw.utils.pushTop(this.array, array);\\n\\t};\\n\\n\\tLinkedList.prototype.toArray = function() {\\n\\t\\treturn this.array;\\n\\t};\\n};\\n\\nexports.backreferences = function(source,operator,options) {\\n\\tvar results = new LinkedList();\\n\\tsource(function(tiddler,title) {\\n\\t\\tresults.pushTop(Object.keys(options.wiki.getTiddlerRelinkBackreferences(title,options)));\\n\\t});\\n\\treturn results.toArray();\\n};\\n\\nexports.references = function(source,operator,options) {\\n\\tvar results = new LinkedList();\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar refs = options.wiki.getTiddlerRelinkReferences(title,options);\\n\\t\\tif (refs) {\\n\\t\\t\\tresults.pushTop(Object.keys(refs));\\n\\t\\t}\\n\\t});\\n\\treturn results.toArray();\\n};\\n\",\"module-type\":\"relinkfilteroperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/filteroperators/relink.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/relink.js\",\"text\":\"/*\\\\\\nmodule-type: filteroperator\\n\\nThis filter acts as a namespace for several small, simple filters, such as\\n\\n`[relink:impossible[]]`\\n\\n\\\\*/\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\\n\\nvar relinkFilterOperators;\\n\\nfunction getRelinkFilterOperators() {\\n\\tif(!relinkFilterOperators) {\\n\\t\\trelinkFilterOperators = {};\\n\\t\\t$tw.modules.applyMethods(\\\"relinkfilteroperator\\\",\\n\\t\\t relinkFilterOperators);\\n\\t}\\n\\treturn relinkFilterOperators;\\n}\\n\\nexports.relink = function(source,operator,options) {\\n\\tvar suffixPair = parseSuffix(operator.suffix);\\n\\tvar relinkFilterOperator = getRelinkFilterOperators()[suffixPair[0]];\\n\\tif (relinkFilterOperator) {\\n\\t\\tvar newOperator = $tw.utils.extend({}, operator);\\n\\t\\tnewOperator.suffix = suffixPair[1];\\n\\t\\treturn relinkFilterOperator(source, newOperator, options);\\n\\t} else {\\n\\t\\treturn [language.getString(\\\"text/plain\\\", \\\"Error/RelinkFilterOperator\\\", options)];\\n\\t}\\n};\\n\\nfunction parseSuffix(suffix) {\\n\\tvar index = suffix? suffix.indexOf(\\\":\\\"): -1;\\n\\tif (index >= 0) {\\n\\t\\treturn [suffix.substr(0, index), suffix.substr(index+1)];\\n\\t} else {\\n\\t\\treturn [suffix];\\n\\t}\\n}\\n\",\"module-type\":\"filteroperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/filteroperators/report.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/report.js\",\"text\":\"/*\\\\\\nmodule-type: relinkfilteroperator\\n\\nGiven a title as an operand, returns a string for each occurrence of that title\\nwithin each input title.\\n\\n[[title]] +[relink:report[fromTiddler]]`\\n\\nReturns string representation of fromTiddler occurrences in title.\\n\\\\*/\\n\\nexports.report = function(source,operator,options) {\\n\\tvar fromTitle = operator.operand,\\n\\t\\tresults = [];\\n\\tif (fromTitle) {\\n\\t\\tvar blurbs = options.wiki.getTiddlerRelinkBackreferences(fromTitle);\\n\\t\\tsource(function(tiddler, title) {\\n\\t\\t\\tif (blurbs[title]) {\\n\\t\\t\\t\\tresults = results.concat(blurbs[title]);\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn results;\\n};\\n\",\"module-type\":\"relinkfilteroperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/filteroperators/signatures.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/signatures.js\",\"text\":\"/*\\\\\\nmodule-type: relinkfilteroperator\\n\\nThis filter returns all input tiddlers which are a source of\\nrelink configuration.\\n\\n`[all[tiddlers+system]relink:source[macros]]`\\n\\n\\\\*/\\n\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\n\\nexports.signatures = function(source,operator,options) {\\n\\tvar plugin = operator.operand || null;\\n\\tvar set = getSet(options);\\n\\tif (plugin === \\\"$:/core\\\") {\\n\\t\\t// Core doesn't actually have any settings. We mean Relink\\n\\t\\tplugin = \\\"$:/plugins/flibbles/relink\\\";\\n\\t}\\n\\tvar signatures = [];\\n\\tfor (var signature in set) {\\n\\t\\tvar source = set[signature].source;\\n\\t\\tif (options.wiki.getShadowSource(source) === plugin) {\\n\\t\\t\\tsignatures.push(signature);\\n\\t\\t}\\n\\t}\\n\\treturn signatures;\\n};\\n\\nexports.type = function(source,operator,options) {\\n\\tvar results = [];\\n\\tvar set = getSet(options);\\n\\tsource(function(tiddler, signature) {\\n\\t\\tif (set[signature]) {\\n\\t\\t\\tresults.push(set[signature].name);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.types = function(source,operator,options) {\\n\\tvar def = utils.getDefaultType(options.wiki);\\n\\tvar types = Object.keys(utils.getTypes());\\n\\ttypes.sort();\\n\\t// move default to front\\n\\ttypes.sort(function(x,y) { return x === def ? -1 : y === def ? 1 : 0; });\\n\\treturn types;\\n};\\n\\nexports.source = function(source,operator,options) {\\n\\tvar results = [];\\n\\tvar category = operator.suffix;\\n\\tvar set = getSet(options);\\n\\tsource(function(tiddler, signature) {\\n\\t\\tif (set[signature]) {\\n\\t\\t\\tresults.push(set[signature].source);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nfunction getSet(options) {\\n\\treturn options.wiki.getGlobalCache(\\\"relink-signatures\\\", function() {\\n\\t\\tvar config = utils.getWikiContext(options.wiki);\\n\\t\\tvar set = Object.create(null);\\n\\t\\tvar categories = {\\n\\t\\t\\tattributes: config.getAttributes(),\\n\\t\\t\\tfields: config.getFields(),\\n\\t\\t\\tmacros: config.getMacros(),\\n\\t\\t\\toperators: config.getOperators()};\\n\\t\\t$tw.utils.each(categories, function(list, category) {\\n\\t\\t\\t$tw.utils.each(list, function(item, key) {\\n\\t\\t\\t\\tset[category + \\\"/\\\" + key] = item;\\n\\t\\t\\t});\\n\\t\\t});\\n\\t\\treturn set;\\n\\t});\\n};\\n\",\"module-type\":\"relinkfilteroperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/filteroperators/splitafter.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/splitafter.js\",\"text\":\"/*\\\\\\ntitle: $:/core/modules/filters/splitbefore.js\\ntype: application/javascript\\nmodule-type: relinkfilteroperator\\n\\nFilter operator that splits each result on the last occurance of the specified separator and returns the last bit.\\n\\nWhat does this have to do with relink? Nothing. I need this so I can render\\nthe configuration menu. I //could// use [splitregexp[]], but then I'd be\\nlimited to Tiddlywiki v5.1.20 or later.\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n/*\\nExport our filter function\\n*/\\nexports.splitafter = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar index = title.lastIndexOf(operator.operand);\\n\\t\\tif(index \u003C 0) {\\n\\t\\t\\t$tw.utils.pushTop(results,title);\\n\\t\\t} else {\\n\\t\\t\\t$tw.utils.pushTop(results,title.substr(index+1));\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"relinkfilteroperator\"},\"$:/plugins/flibbles/relink/js/filteroperators/wouldchange.js\":{\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/wouldchange.js\",\"text\":\"/*\\\\\\nmodule-type: relinkfilteroperator\\n\\nwouldchange: Generator.\\n\\nGiven each input title, it returns all the tiddlers that would be changed if the currentTiddler were to be renamed to the operand.\\n\\nimpossible: filters all source titles for ones that encounter errors on failure.\\n\\nTHESE ARE INTERNAL FILTER OPERATOR AND ARE NOT INTENDED TO BE USED BY USERS.\\n\\n\\\\*/\\n\\nvar language = require(\\\"$:/plugins/flibbles/relink/js/language.js\\\");\\nvar utils = require(\\\"$:/plugins/flibbles/relink/js/utils.js\\\");\\n\\nexports.wouldchange = function(source,operator,options) {\\n\\tvar from = options.widget && options.widget.getVariable(\\\"currentTiddler\\\"),\\n\\t\\tto = operator.operand,\\n\\t\\tindexer = utils.getIndexer(options.wiki),\\n\\t\\trecords = indexer.relinkLookup(from, to, options);\\n\\treturn Object.keys(records);\\n};\\n\\nexports.impossible = function(source,operator,options) {\\n\\tvar from = options.widget && options.widget.getVariable(\\\"currentTiddler\\\"),\\n\\t\\tto = operator.operand,\\n\\t\\tresults = [],\\n\\t\\tindexer = utils.getIndexer(options.wiki),\\n\\t\\trecords = indexer.relinkLookup(from, to, options);\\n\\tsource(function(tiddler, title) {\\n\\t\\tvar fields = records[title];\\n\\t\\tif (fields) {\\n\\t\\t\\tfor (var field in fields) {\\n\\t\\t\\t\\tif (fields[field].impossible) {\\n\\t\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\",\"module-type\":\"relinkfilteroperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/indexer.js\":{\"title\":\"$:/plugins/flibbles/relink/js/indexer.js\",\"text\":\"/*\\\\\\nmodule-type: indexer\\n\\nIndexes results from tiddler reference reports so we don't have to call them\\nso much.\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nvar utils = require(\\\"./utils.js\\\");\\nvar TiddlerContext = utils.getContext('tiddler');\\n\\nfunction Indexer(wiki) {\\n\\tthis.wiki = wiki;\\n};\\n\\nIndexer.prototype.init = function() {\\n\\tthis.rebuild();\\n};\\n\\nIndexer.prototype.rebuild = function() {\\n\\tthis.index = null;\\n\\tthis.backIndex = null;\\n\\tthis.contexts = Object.create(null);\\n\\tthis.changedTiddlers = undefined;\\n\\tthis.lastRelinks = Object.create(null);\\n};\\n\\nIndexer.prototype.update = function(updateDescriptor) {\\n\\tif (!this.index) {\\n\\t\\treturn;\\n\\t}\\n\\tvar title;\\n\\tif (!this.changedTiddlers) {\\n\\t\\tthis.changedTiddlers = Object.create(null);\\n\\t}\\n\\tif (updateDescriptor.old.exists) {\\n\\t\\ttitle = updateDescriptor.old.tiddler.fields.title;\\n\\t\\tthis.changedTiddlers[title] = {deleted: true};\\n\\t\\tthis._purge(title);\\n\\t}\\n\\tif (updateDescriptor['new'].exists) {\\n\\t\\t// If its the same tiddler as old, this overrides the 'deleted' entry\\n\\t\\ttitle = updateDescriptor['new'].tiddler.fields.title;\\n\\t\\tthis.changedTiddlers[title] = {modified: true};\\n\\t}\\n};\\n\\nIndexer.prototype.lookup = function(title) {\\n\\tthis._upkeep();\\n\\treturn this.index[title];\\n};\\n\\nIndexer.prototype.reverseLookup = function(title) {\\n\\tthis._upkeep();\\n\\treturn this.backIndex[title] || Object.create(null);\\n};\\n\\nIndexer.prototype.relinkLookup = function(fromTitle, toTitle, options) {\\n\\tthis._upkeep();\\n\\tvar shortlist = undefined;\\n\\tvar lastRelink = this.lastRelinks[fromTitle];\\n\\tif (lastRelink) {\\n\\t\\tif (lastRelink.to === toTitle) {\\n\\t\\t\\t// We need to reintroduce the relink cache, where temporary info\\n\\t\\t\\t// was stored.\\n\\t\\t\\toptions.cache = lastRelink.cache;\\n\\t\\t\\treturn lastRelink.results;\\n\\t\\t}\\n\\t\\tshortlist = buildShortlist(lastRelink);\\n\\t}\\n\\tvar results = utils.getRelinkResults(this.wiki, fromTitle, toTitle, this.context, shortlist, options);\\n\\tif (Object.keys(this.lastRelinks).length > 3) {\\n\\t\\t// The cache got a little large. wipe it clean.\\n\\t\\tthis.lastRelinks = Object.create(null);\\n\\t}\\n\\tthis.lastRelinks[fromTitle] = {\\n\\t\\tfrom: fromTitle,\\n\\t\\tresults: results,\\n\\t\\tto: toTitle,\\n\\t\\tcache: options.cache,\\n\\t\\tmaybeRelevant: Object.create(null)};\\n\\treturn results;\\n};\\n\\n// Returns all tiddlers that don't have anything referencing it.\\nIndexer.prototype.orphans = function() {\\n\\tthis._upkeep();\\n\\tvar results = [];\\n\\tfor (var title in this.index) {\\n\\t\\tif (!this.backIndex[title]\\n\\t\\t|| Object.keys(this.backIndex[title]).length === 0) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\nIndexer.prototype._upkeep = function() {\\n\\tvar title;\\n\\tif (this.changedTiddlers && (this.context.changed(this.changedTiddlers) || this.context.parent.changed(this.changedTiddlers))) {\\n\\t\\t// If global macro context or whitelist context changed, wipe all\\n\\t\\tthis.rebuild();\\n\\t}\\n\\tif (!this.index) {\\n\\t\\tthis.index = Object.create(null);\\n\\t\\tthis.backIndex = Object.create(null);\\n\\t\\tthis.context = utils.getWikiContext(this.wiki);\\n\\t\\tvar titles = this.wiki.getRelinkableTitles();\\n\\t\\tfor (var i = 0; i \u003C titles.length; i++) {\\n\\t\\t\\tthis._populate(titles[i]);\\n\\t\\t};\\n\\t} else if (this.changedTiddlers) {\\n\\t\\t// If there are cached changes, we apply them now.\\n\\t\\tfor (title in this.contexts) {\\n\\t\\t\\tvar tiddlerContext = this.contexts[title];\\n\\t\\t\\tif (tiddlerContext.changed(this.changedTiddlers)) {\\n\\t\\t\\t\\tthis._purge(title);\\n\\t\\t\\t\\tthis._populate(title);\\n\\t\\t\\t\\tthis._decacheRelink(title);\\n\\t\\t\\t\\t// Wipe this change, so we don't risk updating it twice.\\n\\t\\t\\t\\tthis.changedTiddlers[title] = undefined;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tfor (title in this.changedTiddlers) {\\n\\t\\t\\tvar change = this.changedTiddlers[title];\\n\\t\\t\\tif (change && change.modified) {\\n\\t\\t\\t\\tthis._purge(title);\\n\\t\\t\\t\\tthis._populate(title);\\n\\t\\t\\t\\tthis._decacheRelink(title);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tthis.changedTiddlers = undefined;\\n\\t}\\n};\\n\\nIndexer.prototype._purge = function(title) {\\n\\tfor (var entry in this.index[title]) {\\n\\t\\tdelete this.backIndex[entry][title];\\n\\t}\\n\\tdelete this.contexts[title];\\n\\tdelete this.index[title];\\n};\\n\\n// This drops the cached relink results if unsanctioned tiddlers were changed\\nIndexer.prototype._decacheRelink = function(title) {\\n\\tvar tiddler = this.wiki.getTiddler(title);\\n\\tfor (var from in this.lastRelinks) {\\n\\t\\tvar lastRelink = this.lastRelinks[from];\\n\\t\\tif (title !== from\\n\\t\\t&& title !== lastRelink.to\\n\\t\\t&& (!tiddler\\n\\t\\t|| !$tw.utils.hop(tiddler.fields, 'draft.of') // is a draft\\n\\t\\t|| tiddler.fields['draft.of'] !== from// draft of target\\n\\t\\t|| references(this.index[title], from))) { // draft references target\\n\\t\\t\\t// This is not the draft of the last relinked title,\\n\\t\\t\\t// so our cached results should be wiped.\\n\\t\\t\\tlastRelink.maybeRelevant[title] = true;\\n\\t\\t\\t// Force this cached relink to partially refresh when it comes time\\n\\t\\t\\tlastRelink.to = undefined;\\n\\t\\t}\\n\\t}\\n};\\n\\nfunction references(list, item) {\\n\\treturn list !== undefined && list[item];\\n};\\n\\n// Compiles a short list of tiddlers we need to check for a rename.\\n// This list will be much faster to relink again.\\nfunction buildShortlist(lastRelink) {\\n\\tvar shortlist = Object.keys(lastRelink.results);\\n\\tfor (var title in lastRelink.maybeRelevant) {\\n\\t\\tif (lastRelink.results[title] === undefined) {\\n\\t\\t\\tshortlist.push(title);\\n\\t\\t}\\n\\t}\\n\\treturn shortlist;\\n};\\n\\nIndexer.prototype._populate = function(title) {\\n\\t// Fetch the report for a title, and populate the indexes with result\\n\\tvar tiddlerContext = new TiddlerContext(this.wiki, this.context, title);\\n\\tvar references = utils.getTiddlerRelinkReferences(this.wiki, title, tiddlerContext);\\n\\tthis.index[title] = references;\\n\\tif (tiddlerContext.hasImports()) {\\n\\t\\tthis.contexts[title] = tiddlerContext;\\n\\t}\\n\\tfor (var ref in references) {\\n\\t\\tthis.backIndex[ref] = this.backIndex[ref] || Object.create(null);\\n\\t\\tthis.backIndex[ref][title] = references[ref];\\n\\t}\\n};\\n\\nexports.RelinkIndexer = Indexer;\\n\",\"module-type\":\"indexer\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/language.js\":{\"title\":\"$:/plugins/flibbles/relink/js/language.js\",\"text\":\"/*\\\\\\nmodule-type: library\\n\\nThis handles all logging and alerts Relink emits.\\n\\n\\\\*/\\n\\nexports.getString = function(outputType, title, options) {\\n\\ttitle = \\\"$:/plugins/flibbles/relink/language/\\\" + title;\\n\\treturn options.wiki.renderTiddler(outputType, title, options);\\n};\\n\\nvar logger;\\n\\nexports.warn = function(string, options) {\\n\\tif (!logger) {\\n\\t\\tlogger = new $tw.utils.Logger(\\\"Relinker\\\");\\n\\t}\\n\\tlogger.alert(string);\\n};\\n\\nexports.reportFailures = function(failureList, options) {\\n\\tvar alertString = this.getString(\\\"text/html\\\", \\\"Error/ReportFailedRelinks\\\", options)\\n\\tvar alreadyReported = Object.create(null);\\n\\tvar reportList = [];\\n\\t$tw.utils.each(failureList, function(f) {\\n\\t\\tif (!alreadyReported[f]) {\\n\\t\\t\\tif ($tw.browser) {\\n\\t\\t\\t\\t// This might not make the link if the title is complicated.\\n\\t\\t\\t\\t// Whatever.\\n\\t\\t\\t\\treportList.push(\\\"\\\\n* [[\\\" + f + \\\"]]\\\");\\n\\t\\t\\t} else {\\n\\t\\t\\t\\treportList.push(\\\"\\\\n* \\\" + f);\\n\\t\\t\\t}\\n\\t\\t\\talreadyReported[f] = true;\\n\\t\\t}\\n\\t});\\n\\tthis.warn(alertString + \\\"\\\\n\\\" + reportList.join(\\\"\\\"));\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/mangler.js\":{\"title\":\"$:/plugins/flibbles/relink/js/mangler.js\",\"text\":\"/*\\\\\\nmodule-type: widget\\n\\nCreates a mangler widget for field validation. This isn't meant to be used\\nby the user. It's only used in Relink configuration.\\n\\n\\\\*/\\n\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\n\\nvar RelinkManglerWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n\\tthis.addEventListeners([\\n\\t\\t{type: \\\"relink-add-field\\\", handler: \\\"handleAddFieldEvent\\\"},\\n\\t\\t{type: \\\"relink-add-operator\\\", handler: \\\"handleAddOperatorEvent\\\"},\\n\\t\\t{type: \\\"relink-add-parameter\\\", handler: \\\"handleAddParameterEvent\\\"},\\n\\t\\t{type: \\\"relink-add-attribute\\\", handler: \\\"handleAddAttributeEvent\\\"}\\n\\t]);\\n};\\n\\nexports.relinkmangler = RelinkManglerWidget;\\n\\nRelinkManglerWidget.prototype = new Widget();\\n\\n// This wraps alert so it can be monkeypatched during testing.\\nRelinkManglerWidget.prototype.alert = function(message) {\\n\\talert(message);\\n};\\n\\nRelinkManglerWidget.prototype.handleAddFieldEvent = function(event) {\\n\\tvar param = event.paramObject;\\n\\tif (typeof param !== \\\"object\\\" || !param.field) {\\n\\t\\t// Can't handle it.\\n\\t\\treturn true;\\n\\t}\\n\\tvar trimmedName = param.field.trim();\\n\\tif (!trimmedName) {\\n\\t\\t// Still can't handle it, but don't warn.\\n\\t\\treturn true;\\n\\t}\\n\\tif(!$tw.utils.isValidFieldName(trimmedName)) {\\n\\t\\tthis.alert($tw.language.getString(\\n\\t\\t\\t\\\"InvalidFieldName\\\",\\n\\t\\t\\t{variables:\\n\\t\\t\\t\\t{fieldName: trimmedName}\\n\\t\\t\\t}\\n\\t\\t));\\n\\t} else {\\n\\t\\tadd(this.wiki, \\\"fields\\\", trimmedName);\\n\\t}\\n\\treturn true;\\n};\\n\\n/**Not much validation, even though there are definitely illegal\\n * operator names. If you input on, Relink won't relink it, but it\\n * won't choke on it either. Tiddlywiki will...\\n */\\nRelinkManglerWidget.prototype.handleAddOperatorEvent = function(event) {\\n\\tvar param = event.paramObject;\\n\\tif (param) {\\n\\t\\tadd(this.wiki, \\\"operators\\\", param.operator);\\n\\t}\\n\\treturn true;\\n};\\n\\nRelinkManglerWidget.prototype.handleAddParameterEvent = function(event) {\\n\\tvar param = event.paramObject;\\n\\tif (param && param.macro && param.parameter) {\\n\\t\\tif (/\\\\s/.test(param.macro.trim())) {\\n\\t\\t\\tthis.alert(language.getString(\\n\\t\\t\\t\\t\\\"text/plain\\\",\\n\\t\\t\\t\\t\\\"Error/InvalidMacroName\\\",\\n\\t\\t\\t\\t{ variables: {macroName: param.macro},\\n\\t\\t\\t\\t wiki: this.wiki\\n\\t\\t\\t\\t}\\n\\t\\t\\t));\\n\\t\\t} else if (/[ \\\\/]/.test(param.parameter.trim())) {\\n\\t\\t\\tthis.alert(language.getString(\\n\\t\\t\\t\\t\\\"text/plain\\\",\\n\\t\\t\\t\\t\\\"Error/InvalidParameterName\\\",\\n\\t\\t\\t\\t{ variables: {parameterName: param.parameter},\\n\\t\\t\\t\\t wiki: this.wiki\\n\\t\\t\\t\\t}\\n\\t\\t\\t));\\n\\t\\t} else {\\n\\t\\t\\tadd(this.wiki, \\\"macros\\\", param.macro, param.parameter);\\n\\t\\t}\\n\\t}\\n\\treturn true;\\n};\\n\\nRelinkManglerWidget.prototype.handleAddAttributeEvent = function(event) {\\n\\tvar param = event.paramObject;\\n\\tif (param && param.element && param.attribute) {\\n\\t\\tif (/[ \\\\/]/.test(param.element.trim())) {\\n\\t\\t\\tthis.alert(language.getString(\\n\\t\\t\\t\\t\\\"text/plain\\\",\\n\\t\\t\\t\\t\\\"Error/InvalidElementName\\\",\\n\\t\\t\\t\\t{ variables: {elementName: param.element},\\n\\t\\t\\t\\t wiki: this.wiki\\n\\t\\t\\t\\t}\\n\\t\\t\\t));\\n\\t\\t} else if (/[ \\\\/]/.test(param.attribute.trim())) {\\n\\t\\t\\tthis.alert(language.getString(\\n\\t\\t\\t\\t\\\"text/plain\\\",\\n\\t\\t\\t\\t\\\"Error/InvalidAttributeName\\\",\\n\\t\\t\\t\\t{ variables: {attributeName: param.attribute},\\n\\t\\t\\t\\t wiki: this.wiki\\n\\t\\t\\t\\t}\\n\\t\\t\\t));\\n\\t\\t} else {\\n\\t\\t\\tadd(this.wiki, \\\"attributes\\\", param.element, param.attribute);\\n\\t\\t}\\n\\t}\\n\\treturn true;\\n};\\n\\nfunction add(wiki, category/*, path parts*/) {\\n\\tvar path = \\\"$:/config/flibbles/relink/\\\" + category;\\n\\tfor (var x = 2; x \u003C arguments.length; x++) {\\n\\t\\tvar part = arguments[x];\\n\\t\\t// Abort if it's falsy, or only whitespace. Also, trim spaces\\n\\t\\tif (!part || !(part = part.trim())) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\tpath = path + \\\"/\\\" + part;\\n\\t}\\n\\tvar def = utils.getDefaultType(wiki);\\n\\twiki.addTiddler({title: path, text: def});\\n};\\n\",\"module-type\":\"widget\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/fields.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/fields.js\",\"text\":\"/*\\\\\\n\\nHandles all fields specified in the plugin configuration. Currently, this\\nonly supports single-value fields.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = 'fields';\\n\\nexports.report = function(tiddler, callback, options) {\\n\\tvar fields = options.settings.getFields();\\n\\t$tw.utils.each(fields, function(handler, field) {\\n\\t\\tvar input = tiddler.fields[field];\\n\\t\\tif (input) {\\n\\t\\t\\tif (field === 'list' && tiddler.fields['plugin-type']) {\\n\\t\\t\\t\\t// We have a built-in exception here. plugins use their list\\n\\t\\t\\t\\t// field differently. There's a whole mechanism for what\\n\\t\\t\\t\\t// they actually point to, but let's not bother with that now\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\thandler.report(input, function(title, blurb) {\\n\\t\\t\\t\\tif (blurb) {\\n\\t\\t\\t\\t\\tcallback(title, field + ': ' + blurb);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tcallback(title, field);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}, options);\\n\\t\\t}\\n\\t});\\n};\\n\\nexports.relink = function(tiddler, fromTitle, toTitle, changes, options) {\\n\\tvar fields = options.settings.getFields();\\n\\t$tw.utils.each(fields, function(handler, field) {\\n\\t\\tvar input = tiddler.fields[field];\\n\\t\\tif (input) {\\n\\t\\t\\tif (field === 'list' && tiddler.fields['plugin-type']) {\\n\\t\\t\\t\\t// Same deal as above. Skip.\\n\\t\\t\\t\\treturn;\\n\\t\\t\\t}\\n\\t\\t\\tvar entry = handler.relink(input, fromTitle, toTitle, options);\\n\\t\\t\\tif (entry !== undefined) {\\n\\t\\t\\t\\tchanges[field] = entry;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\",\"module-type\":\"relinkoperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text.js\",\"text\":\"/*\\\\\\n\\nDepending on the tiddler type, this will apply textOperators which may\\nrelink titles within the body.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar defaultOperator = \\\"text/vnd.tiddlywiki\\\";\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\n\\nexports.name = 'text';\\n\\nvar textOperators = utils.getModulesByTypeAsHashmap('relinktext', 'type');\\n\\n// These are deprecated. Don't use them.\\nvar oldTextOperators = utils.getModulesByTypeAsHashmap('relinktextoperator', 'type');\\n\\n// $:/DefaultTiddlers is a tiddler which has type \\\"text/vnd.tiddlywiki\\\",\\n// but it lies. It doesn't contain wikitext. It contains a filter, so\\n// we pretend it has a filter type.\\n// If you want to be able to add more exceptions for your plugin, let me know.\\nvar exceptions = {\\n\\t\\\"$:/DefaultTiddlers\\\": \\\"text/x-tiddler-filter\\\"\\n};\\n\\nexports.report = function(tiddler, callback, options) {\\n\\tvar fields = tiddler.fields;\\n\\tif (fields.text) {\\n\\t\\tvar type = exceptions[fields.title] || fields.type || defaultOperator;\\n\\t\\tif (textOperators[type]) {\\n\\t\\t\\ttextOperators[type].report(tiddler.fields.text, callback, options);\\n\\t\\t} else if (oldTextOperators[type]) {\\n\\t\\t\\t// For the deprecated text operators\\n\\t\\t\\toldTextOperators[type].report(tiddler, callback, options);\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(tiddler, fromTitle, toTitle, changes, options) {\\n\\tvar fields = tiddler.fields;\\n\\tif (fields.text) {\\n\\t\\tvar type = exceptions[fields.title] || fields.type || defaultOperator,\\n\\t\\t\\tentry;\\n\\t\\tif (textOperators[type]) {\\n\\t\\t\\tentry = textOperators[type].relink(tiddler.fields.text, fromTitle, toTitle, options);\\n\\t\\t} else if (oldTextOperators[type]) {\\n\\t\\t\\t// For the deprecated text operators\\n\\t\\t\\tentry = oldTextOperators[type].relink(tiddler, fromTitle, toTitle, options);\\n\\t\\t}\\n\\t\\tif (entry) {\\n\\t\\t\\tchanges.text = entry;\\n\\t\\t}\\n\\t}\\n};\\n\",\"module-type\":\"relinkoperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/filtertext.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/filtertext.js\",\"text\":\"/*\\\\\\n\\nThis relinks tiddlers which contain filters in their body, as oppose to\\nwikitext.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar filterHandler = require(\\\"$:/plugins/flibbles/relink/js/utils\\\").getType('filter');\\n\\nexports.type = 'text/x-tiddler-filter';\\n\\nexports.report = filterHandler.report;\\nexports.relink = filterHandler.relink;\\n\",\"module-type\":\"relinktext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/listtext.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/listtext.js\",\"text\":\"/*\\\\\\n\\nThis relinks tiddlers which contain a tiddler list as their body.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar listHandler = require(\\\"$:/plugins/flibbles/relink/js/utils\\\").getType('list');\\n\\nexports.type = 'text/x-tiddler-list';\\n\\nexports.report = listHandler.report;\\nexports.relink = listHandler.relink;\\n\",\"module-type\":\"relinktext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/referencetext.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/referencetext.js\",\"text\":\"/*\\\\\\n\\nThis relinks tiddlers which contain a tiddler reference as their body.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar refHandler = require(\\\"$:/plugins/flibbles/relink/js/utils\\\").getType('reference');\\n\\nexports.type = 'text/x-tiddler-reference';\\n\\nexports.report = refHandler.report;\\nexports.relink = refHandler.relink;\\n\",\"module-type\":\"relinktext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/titletext.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/titletext.js\",\"text\":\"/*\\\\\\n\\nThis relinks tiddlers which contain a single title as their body.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar titleHandler = require(\\\"$:/plugins/flibbles/relink/js/utils\\\").getType('title');\\n\\nexports.type = 'text/x-tiddler-title';\\n\\nexports.report = titleHandler.report;\\nexports.relink = titleHandler.relink;\\n\",\"module-type\":\"relinktext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext.js\",\"text\":\"/*\\\\\\n\\nChecks for fromTitle in text. If found, sees if it's relevant,\\nand tries to swap it out if it is.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nvar Placeholder = require(\\\"$:/plugins/flibbles/relink/js/utils/placeholder.js\\\");\\nvar wikitextHandler = require('$:/plugins/flibbles/relink/js/utils.js').getType('wikitext');\\n\\nexports.type = 'text/vnd.tiddlywiki';\\n\\nexports.report = wikitextHandler.report;\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar placeholder = new Placeholder();\\n\\tvar currentOptions = Object.create(options);\\n\\tcurrentOptions.placeholder = placeholder;\\n\\tvar entry = wikitextHandler.relink(text, fromTitle, toTitle, currentOptions);\\n\\tif (entry && entry.output) {\\n\\t\\t// If there's output, we've also got to prepend any macros\\n\\t\\t// that the placeholder defined.\\n\\t\\tvar preamble = placeholder.getPreamble();\\n\\t\\tentry.output = preamble + entry.output;\\n\\t}\\n\\treturn entry;\\n};\\n\",\"module-type\":\"relinktext\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/code.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/code.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles code blocks. Or rather //doesn't// handle them, since we should\\nignore their contents.\\n\\n\\\"`` [[Renamed Title]] ``\\\" will remain unchanged.\\n\\n\\\\*/\\n\\nexports.name = [\\\"codeinline\\\", \\\"codeblock\\\"];\\n\\nexports.relink = function(text) {\\n\\tvar reEnd;\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// I'm lazy. This relink method works for both codeblock and codeinline\\n\\tif (this.match[0].length > 2) {\\n\\t\\t// Must be a codeblock\\n\\t\\treEnd = /\\\\r?\\\\n```$/mg;\\n\\t} else {\\n\\t\\t// Must be a codeinline\\n\\t\\treEnd = new RegExp(this.match[1], \\\"mg\\\");\\n\\t}\\n\\treEnd.lastIndex = this.parser.pos;\\n\\tvar match = reEnd.exec(text);\\n\\tif (match) {\\n\\t\\tthis.parser.pos = match.index + match[0].length;\\n\\t} else {\\n\\t\\tthis.parser.pos = this.parser.sourceLength;\\n\\t}\\n\\treturn undefined;\\n};\\n\\n// Same thing. Just skip the pos ahead.\\nexports.report = exports.relink;\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/comment.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/comment.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles comment blocks. Or rather //doesn't// handle them, since we should\\nignore their contents.\\n\\n\\\"\u003C!-- [[Renamed Title]] -->\\\" will remain unchanged.\\n\\n\\\\*/\\n\\nexports.name = [\\\"commentinline\\\", \\\"commentblock\\\"];\\n\\nexports.relink = function(text) {\\n\\tthis.parser.pos = this.endMatchRegExp.lastIndex;\\n\\treturn undefined;\\n};\\n\\nexports.report = exports.relink;\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/filteredtransclude.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/filteredtransclude.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles replacement of filtered transclusions in wiki text like,\\n\\n{{{ [tag[docs]] }}}\\n{{{ [tag[docs]] |tooltip}}}\\n{{{ [tag[docs]] ||TemplateTitle}}}\\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\\n\\nThis renames both the list and the template field.\\n\\n\\\\*/\\n\\nexports.name = ['filteredtranscludeinline', 'filteredtranscludeblock'];\\n\\nvar filterHandler = require(\\\"$:/plugins/flibbles/relink/js/utils\\\").getType('filter');\\nvar utils = require(\\\"./utils.js\\\");\\n\\nexports.report = function(text, callback, options) {\\n\\tvar m = this.match,\\n\\t\\tfilter = m[1],\\n\\t\\ttemplate = $tw.utils.trim(m[3]),\\n\\t\\tappend = template ? '||' + template + '}}}' : '}}}';\\n\\tfilterHandler.report(filter, function(title, blurb) {\\n\\t\\tcallback(title, '{{{' + blurb + append);\\n\\t}, options);\\n\\tif (template) {\\n\\t\\tcallback(template, '{{{' + $tw.utils.trim(filter).replace(/\\\\r?\\\\n/mg, ' ') + '||}}}');\\n\\t}\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar m = this.match,\\n\\t\\tfilter = m[1],\\n\\t\\ttooltip = m[2],\\n\\t\\ttemplate = m[3],\\n\\t\\tstyle = m[4],\\n\\t\\tclasses = m[5],\\n\\t\\tparser = this.parser,\\n\\t\\tentry = {};\\n\\tparser.pos = this.matchRegExp.lastIndex;\\n\\tvar modified = false;\\n\\n\\tvar filterEntry = filterHandler.relink(filter, fromTitle, toTitle, options);\\n\\tif (filterEntry !== undefined) {\\n\\t\\tif (filterEntry.output) {\\n\\t\\t\\tfilter = filterEntry.output;\\n\\t\\t\\tmodified = true;\\n\\t\\t}\\n\\t\\tif (filterEntry.impossible) {\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t}\\n\\t}\\n\\n\\tif ($tw.utils.trim(template) === fromTitle) {\\n\\t\\t// preserves user-inputted whitespace\\n\\t\\ttemplate = template.replace(fromTitle, toTitle);\\n\\t\\tmodified = true;\\n\\t}\\n\\tif (!modified) {\\n\\t\\tif (!entry.impossible) {\\n\\t\\t\\treturn undefined;\\n\\t\\t}\\n\\t} else {\\n\\t\\tvar output = this.makeFilteredtransclude(this.parser, filter, tooltip, template, style, classes);\\n\\t\\tif (output === undefined) {\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t} else {\\n\\t\\t\\t// By copying over the ending newline of the original\\n\\t\\t\\t// text if present, thisrelink method thus works for\\n\\t\\t\\t// both the inline and block rule\\n\\t\\t\\tentry.output = output + utils.getEndingNewline(m[0]);\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\\nexports.makeFilteredtransclude = function(parser, filter, tooltip, template, style, classes) {\\n\\tif (canBePretty(filter) && canBePrettyTemplate(template)) {\\n\\t\\treturn prettyList(filter, tooltip, template, style, classes);\\n\\t}\\n\\tif (classes !== undefined) {\\n\\t\\tclasses = classes.split('.').join(' ');\\n\\t}\\n\\treturn utils.makeWidget(parser, '$list', {\\n\\t\\tfilter: filter,\\n\\t\\ttooltip: tooltip,\\n\\t\\ttemplate: template,\\n\\t\\tstyle: style || undefined,\\n\\t\\titemClass: classes});\\n};\\n\\nfunction prettyList(filter, tooltip, template, style, classes) {\\n\\tif (tooltip === undefined) {\\n\\t\\ttooltip = '';\\n\\t} else {\\n\\t\\ttooltip = \\\"|\\\" + tooltip;\\n\\t}\\n\\tif (template === undefined) {\\n\\t\\ttemplate = '';\\n\\t} else {\\n\\t\\ttemplate = \\\"||\\\" + template;\\n\\t}\\n\\tif (classes === undefined) {\\n\\t\\tclasses = '';\\n\\t} else {\\n\\t\\tclasses = \\\".\\\" + classes;\\n\\t}\\n\\tstyle = style || '';\\n\\treturn \\\"{{{\\\"+filter+tooltip+template+\\\"}}\\\"+style+\\\"}\\\"+classes;\\n};\\n\\nfunction canBePretty(filter) {\\n\\treturn filter.indexOf('|') \u003C 0 && filter.indexOf('}}') \u003C 0;\\n};\\n\\nfunction canBePrettyTemplate(template) {\\n\\treturn !template || (\\n\\t\\ttemplate.indexOf('|') \u003C 0\\n\\t\\t&& template.indexOf('{') \u003C 0\\n\\t\\t&& template.indexOf('}') \u003C 0);\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles replacement in attributes of widgets and html elements\\nThis is configurable to select exactly which attributes of which elements\\nshould be changed.\\n\\n\u003C$link to=\\\"TiddlerTitle\\\" />\\n\\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\nvar relinkUtils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar htmlOperators = relinkUtils.getModulesByTypeAsHashmap('relinkhtml', 'name');\\n\\nexports.name = \\\"html\\\";\\n\\nexports.report = function(text, callback, options) {\\n\\tvar element = this.nextTag.tag;\\n\\tvar nestedOptions = Object.create(options);\\n\\tnestedOptions.settings = this.parser.context;\\n\\tfor (var operator in htmlOperators) {\\n\\t\\thtmlOperators[operator].report(this.nextTag, this.parser, function(title, blurb) {\\n\\t\\t\\tcallback(title, '\u003C' + blurb + ' />');\\n\\t\\t}, nestedOptions);\\n\\t}\\n\\tthis.parse();\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar widgetEntry = {};\\n\\twidgetEntry.attributes = Object.create(null);\\n\\twidgetEntry.element = this.nextTag.tag;\\n\\tvar elem = this.nextTag;\\n\\tvar changed = false;\\n\\tvar nestedOptions = Object.create(options);\\n\\tnestedOptions.settings = this.parser.context;\\n\\tfor (var operator in htmlOperators) {\\n\\t\\tvar entry = htmlOperators[operator].relink(this.nextTag, this.parser, fromTitle, toTitle, nestedOptions);\\n\\t\\tif (entry) {\\n\\t\\t\\tif (entry.output) {\\n\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (entry.impossible) {\\n\\t\\t\\t\\twidgetEntry.impossible = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\tvar tag = this.parse()[0];\\n\\tif (tag.children) {\\n\\t\\tfor (var i = 0; i \u003C tag.children.length; i++) {\\n\\t\\t\\tvar child = tag.children[i];\\n\\t\\t\\tif (child.output) {\\n\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (child.impossible) {\\n\\t\\t\\t\\twidgetEntry.impossible = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\tif (changed) {\\n\\t\\tvar builder = new Rebuilder(text, elem.start);\\n\\t\\tfor (var attributeName in elem.attributes) {\\n\\t\\t\\tvar attr = elem.attributes[attributeName];\\n\\t\\t\\tvar quotedValue;\\n\\t\\t\\tswitch (attr.type) {\\n\\t\\t\\tcase 'string':\\n\\t\\t\\t\\tif (attr.valueless) {\\n\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar quote = relinkUtils.determineQuote(text, attr);\\n\\t\\t\\t\\tquotedValue = utils.wrapAttributeValue(attr.value, quote)\\n\\t\\t\\t\\tif (quotedValue === undefined) {\\n\\t\\t\\t\\t\\t// The value was unquotable. We need to make\\n\\t\\t\\t\\t\\t// a macro in order to replace it.\\n\\t\\t\\t\\t\\tif (!options.placeholder) {\\n\\t\\t\\t\\t\\t\\t// but we can't...\\n\\t\\t\\t\\t\\t\\twidgetEntry.impossible = true;\\n\\t\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tvar value = options.placeholder.getPlaceholderFor(attr.value,attr.handler)\\n\\t\\t\\t\\t\\t\\tquotedValue = \\\"\u003C\u003C\\\"+value+\\\">>\\\";\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase 'indirect':\\n\\t\\t\\t\\tquotedValue = \\\"{{\\\" + attr.textReference + \\\"}}\\\";\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase 'filtered':\\n\\t\\t\\t\\tquotedValue = \\\"{{{\\\" + attr.filter + \\\"}}}\\\";\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\tcase 'macro':\\n\\t\\t\\t\\tif (attr.output) {\\n\\t\\t\\t\\t\\tquotedValue = attr.output;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tquotedValue = undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\t// Else If output isn't set, this wasn't ever changed\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tvar ptr = attr.start;\\n\\t\\t\\tptr = $tw.utils.skipWhiteSpace(text, ptr);\\n\\t\\t\\tif (attributeName !== attr.name) {\\n\\t\\t\\t\\t// Ooh, the attribute name changed\\n\\t\\t\\t\\tbuilder.add(attr.name, ptr, ptr + attributeName.length);\\n\\t\\t\\t}\\n\\t\\t\\tif (quotedValue) {\\n\\t\\t\\t\\t// We have a new attribute value\\n\\t\\t\\t\\tptr += attributeName.length;\\n\\t\\t\\t\\tptr = $tw.utils.skipWhiteSpace(text, ptr);\\n\\t\\t\\t\\tptr++; // For the equals\\n\\t\\t\\t\\tptr = $tw.utils.skipWhiteSpace(text, ptr);\\n\\t\\t\\t\\tbuilder.add(quotedValue, ptr, attr.end);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (tag.children) {\\n\\t\\t\\tfor (var i = 0; i \u003C tag.children.length; i++) {\\n\\t\\t\\t\\tvar child = tag.children[i];\\n\\t\\t\\t\\tif (child.output) {\\n\\t\\t\\t\\t\\tbuilder.add(child.output, child.start, child.end);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\twidgetEntry.output = builder.results(this.parser.pos);\\n\\t}\\n\\tif (widgetEntry.output || widgetEntry.impossible) {\\n\\t\\treturn widgetEntry;\\n\\t}\\n\\treturn undefined;\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes.js\",\"text\":\"/*\\\\\\n\\nHandles all element attribute values. Most widget relinking happens here.\\n\\n\\\\*/\\n\\nvar relinkUtils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar refHandler = relinkUtils.getType('reference');\\nvar filterHandler = relinkUtils.getType('filter');\\nvar macrocall = require(\\\"$:/plugins/flibbles/relink/js/utils/macrocall.js\\\");\\nvar attributeOperators = relinkUtils.getModulesByTypeAsHashmap('relinkhtmlattributes', 'name');\\n\\nexports.name = \\\"attributes\\\";\\n\\nexports.report = function(element, parser, callback, options) {\\n\\tfor (var attributeName in element.attributes) {\\n\\t\\tvar attr = element.attributes[attributeName];\\n\\t\\tvar nextEql = parser.source.indexOf('=', attr.start);\\n\\t\\t// This is the rare case of changing tiddler\\n\\t\\t// \\\"true\\\" to something else when \\\"true\\\" is\\n\\t\\t// implicit, like \u003C$link to /> We ignore those.\\n\\t\\tif (nextEql \u003C 0 || nextEql > attr.end) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tvar entry;\\n\\t\\tswitch (attr.type) {\\n\\t\\tcase \\\"string\\\":\\n\\t\\t\\tfor (var operatorName in attributeOperators) {\\n\\t\\t\\t\\tvar operator = attributeOperators[operatorName];\\n\\t\\t\\t\\tvar handler = operator.getHandler(element, attr, options);\\n\\t\\t\\t\\tif (handler) {\\n\\t\\t\\t\\t\\thandler.report(attr.value, function(title, blurb) {\\n\\t\\t\\t\\t\\t\\tif (operator.formBlurb) {\\n\\t\\t\\t\\t\\t\\t\\tcallback(title, operator.formBlurb(element, attr, blurb, options));\\n\\t\\t\\t\\t\\t\\t} else if (blurb) {\\n\\t\\t\\t\\t\\t\\t\\tcallback(title, element.tag + ' ' + attributeName + '=\\\"' + blurb + '\\\"');\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tcallback(title, element.tag + ' ' + attributeName);\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}, options);\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"indirect\\\":\\n\\t\\t\\tentry = refHandler.report(attr.textReference, function(title, blurb) {\\n\\t\\t\\t\\tcallback(title, element.tag + ' ' + attributeName + '={{' + (blurb || '') + '}}');\\n\\t\\t\\t}, options);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"filtered\\\":\\n\\t\\t\\tentry = filterHandler.report(attr.filter, function(title, blurb) {\\n\\t\\t\\t\\tcallback(title, element.tag + ' ' + attributeName + '={{{' + blurb + '}}}');\\n\\t\\t\\t}, options);\\n\\t\\t\\tbreak;\\n\\t\\tcase \\\"macro\\\":\\n\\t\\t\\tvar macro = attr.value;\\n\\t\\t\\tentry = macrocall.report(options.settings, macro, function(title, blurb) {\\n\\t\\t\\t\\tcallback(title, element.tag + ' ' + attributeName + '=\u003C\u003C' + blurb + '>>');\\n\\t\\t\\t}, options);\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(element, parser, fromTitle, toTitle, options) {\\n\\tvar changed = undefined, impossible = undefined;\\n\\tfor (var attributeName in element.attributes) {\\n\\t\\tvar attr = element.attributes[attributeName];\\n\\t\\tvar nextEql = parser.source.indexOf('=', attr.start);\\n\\t\\t// This is the rare case of changing tiddler\\n\\t\\t// \\\"true\\\" to something else when \\\"true\\\" is\\n\\t\\t// implicit, like \u003C$link to /> We ignore those.\\n\\t\\tif (nextEql \u003C 0 || nextEql > attr.end) {\\n\\t\\t\\tattr.valueless = true;\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tvar entry;\\n\\t\\tswitch (attr.type) {\\n\\t\\tcase 'string':\\n\\t\\t\\tfor (var operatorName in attributeOperators) {\\n\\t\\t\\t\\tvar operator = attributeOperators[operatorName];\\n\\t\\t\\t\\tvar handler = operator.getHandler(element, attr, options);\\n\\t\\t\\t\\tif (handler) {\\n\\t\\t\\t\\t\\tentry = handler.relink(attr.value, fromTitle, toTitle, options);\\n\\t\\t\\t\\t\\tif (entry && entry.output) {\\n\\t\\t\\t\\t\\t\\tattr.value = entry.output;\\n\\t\\t\\t\\t\\t\\tattr.handler = handler.name;\\n\\t\\t\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tbreak;\\n\\t\\tcase 'indirect':\\n\\t\\t\\tentry = refHandler.relinkInBraces(attr.textReference, fromTitle, toTitle, options);\\n\\t\\t\\tif (entry && entry.output) {\\n\\t\\t\\t\\tattr.textReference = entry.output;\\n\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t}\\n\\t\\t\\tbreak;\\n\\t\\tcase 'filtered':\\n\\t\\t\\tentry = filterHandler.relinkInBraces(attr.filter, fromTitle, toTitle, options);\\n\\t\\t\\tif (entry && entry.output) {\\n\\t\\t\\t\\tattr.filter = entry.output;\\n\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t}\\n\\t\\t\\tbreak;\\n\\t\\tcase 'macro':\\n\\t\\t\\tvar macro = attr.value;\\n\\t\\t\\tentry = macrocall.relink(options.settings, macro, parser.source, fromTitle, toTitle, false, options);\\n\\t\\t\\tif (entry && entry.output) {\\n\\t\\t\\t\\tattr.output = macrocall.reassemble(entry.output, parser.source, options);\\n\\t\\t\\t\\tattr.value = entry.output;\\n\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (entry && entry.impossible) {\\n\\t\\t\\timpossible = true;\\n\\t\\t}\\n\\t}\\n\\tif (changed || impossible) {\\n\\t\\treturn {output: changed, impossible: impossible};\\n\\t}\\n};\\n\",\"module-type\":\"relinkhtml\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/fields.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/fields.js\",\"text\":\"/*\\\\ \\nHandles replacement in widgets which allow arbitrary attributes that\\ncorrespond to tiddler fields.\\n\\n\\\\*/\\n\\nexports.name = \\\"fields\\\";\\n\\nexports.getHandler = function(element, attribute, options) {\\n\\tvar regexp = options.settings.getConfig(\\\"fieldattributes\\\")[element.tag];\\n\\tif (regexp) {\\n\\t\\tvar results = regexp.exec(attribute.name);\\n\\t\\tif (results && results[0] === attribute.name) {\\n\\t\\t\\treturn options.settings.getFields()[results[1]];\\n\\t\\t}\\n\\t}\\n};\\n\",\"module-type\":\"relinkhtmlattributes\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/macrocall.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/macrocall.js\",\"text\":\"/*\\\\\\n\\nHandles replacement in $macrocall widgets\\n\\n\\\\*/\\n\\nexports.name = \\\"macrocall\\\";\\n\\nexports.getHandler = function(element, attribute, options) {\\n\\tif (element.tag === \\\"$macrocall\\\") {\\n\\t\\tvar nameAttr = element.attributes[\\\"$name\\\"];\\n\\t\\tif (nameAttr) {\\n\\t\\t\\tvar setting = options.settings.getMacro(nameAttr.value);\\n\\t\\t\\treturn setting && setting[attribute.name];\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.formBlurb = function(element, attribute, blurb, options) {\\n\\tvar nameAttr = element.attributes[\\\"$name\\\"];\\n\\tvar newBlurb = '\u003C' + nameAttr.value + ' ' + attribute.name;\\n\\tif (blurb) {\\n\\t\\tnewBlurb += '=\\\"' + blurb + '\\\"';\\n\\t}\\n\\treturn newBlurb;\\n};\\n\",\"module-type\":\"relinkhtmlattributes\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/whitelist.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/whitelist.js\",\"text\":\"/*\\\\ \\n\\nHandles replacement of widget attributes that are specified in the whitelist.\\n\\n\\\\*/\\n\\nexports.name = \\\"whitelist\\\";\\n\\nexports.getHandler = function(element, attribute, options) {\\n\\tvar setting = options.settings.getAttribute(element.tag);\\n\\treturn setting && setting[attribute.name];\\n};\\n\",\"module-type\":\"relinkhtmlattributes\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/importvariables.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/importvariables.js\",\"text\":\"/*\\\\\\n\\nHandles state updating required for $importvariables widgets\\n\\n\\\\*/\\n\\nvar relinkUtils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar ImportContext = relinkUtils.getContext('import');\\n\\nexports.name = \\\"importvariables\\\";\\n\\nexports.report = function(element, parser, callback, options) {\\n\\tif (element.tag === \\\"$importvariables\\\") {\\n\\t\\tprocessImport(element, parser, options);\\n\\t}\\n};\\n\\nexports.relink = function(element, parser, fromTitle, toTitle, options) {\\n\\tif (element.tag === \\\"$importvariables\\\") {\\n\\t\\tprocessImport(element, parser, options);\\n\\t}\\n};\\n\\nfunction processImport(element, parser, options) {\\n\\tvar importFilterAttr = element.attributes.filter;\\n\\tif (importFilterAttr) {\\n\\t\\tprocessImportFilter(parser, importFilterAttr, options);\\n\\t}\\n};\\n\\n// This processes a \u003C$importvariables> filter attribute and adds any new\\n// variables to our parser.\\nfunction processImportFilter(parser, importAttribute, options) {\\n\\tif (typeof importAttribute === \\\"string\\\") {\\n\\t\\t// It was changed. Reparse it. It'll be a quoted\\n\\t\\t// attribute value. Add a dummy attribute name.\\n\\t\\timportAttribute = $tw.utils.parseAttribute(\\\"p=\\\"+importAttribute, 0)\\n\\t}\\n\\tvar context = parser.context;\\n\\tvar importFilter = computeAttribute(context, importAttribute, options);\\n\\tparser.context = new ImportContext(options.wiki, context, importFilter);\\n};\\n\\nfunction computeAttribute(context, attribute, options) {\\n\\tvar value;\\n\\tif(attribute.type === \\\"filtered\\\") {\\n\\t\\tvar parentWidget = context.widget;\\n\\t\\tvalue = options.wiki.filterTiddlers(attribute.filter,parentWidget)[0] || \\\"\\\";\\n\\t} else if(attribute.type === \\\"indirect\\\") {\\n\\t\\tvar parentWidget = context.widget;\\n\\t\\tvalue = options.wiki.getTextReference(attribute.textReference,\\\"\\\",parentWidget.variables.currentTiddler.value);\\n\\t} else if(attribute.type === \\\"macro\\\") {\\n\\t\\tvar parentWidget = context.widget;\\n\\t\\tvalue = parentWidget.getVariable(attribute.value.name,{params: attribute.value.params});\\n\\t} else { // String attribute\\n\\t\\tvalue = attribute.value;\\n\\t}\\n\\treturn value;\\n};\\n\",\"module-type\":\"relinkhtml\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/image.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/image.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles replacement in wiki text inline rules, like,\\n\\n[img[tiddler.jpg]]\\n\\n[img width=23 height=24 [Description|tiddler.jpg]]\\n\\n\\\\*/\\n\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\nvar refHandler = require(\\\"$:/plugins/flibbles/relink/js/fieldtypes/reference\\\");\\nvar filterHandler = require(\\\"$:/plugins/flibbles/relink/js/utils\\\").getType('filter');\\nvar macrocall = require(\\\"./macrocall.js\\\");\\nvar utils = require(\\\"./utils.js\\\");\\nvar relinkUtils = require('$:/plugins/flibbles/relink/js/utils.js');\\n\\nexports.name = \\\"image\\\";\\n\\nexports.report = function(text, callback, options) {\\n\\tvar ptr = this.nextImage.start + 4; //[img\\n\\tvar inSource = false;\\n\\tfor (var attributeName in this.nextImage.attributes) {\\n\\t\\tvar attr = this.nextImage.attributes[attributeName];\\n\\t\\tif (attributeName === \\\"source\\\" || attributeName === \\\"tooltip\\\") {\\n\\t\\t\\tif (inSource) {\\n\\t\\t\\t\\tptr = text.indexOf('|', ptr);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tptr = text.indexOf('[', ptr);\\n\\t\\t\\t\\tinSource = true;\\n\\t\\t\\t}\\n\\t\\t\\tptr += 1;\\n\\t\\t}\\n\\t\\tif (attributeName === \\\"source\\\") {\\n\\t\\t\\tvar tooltip = this.nextImage.attributes.tooltip;\\n\\t\\t\\tvar blurb = '[img[' + (tooltip ? tooltip.value : '') + ']]';\\n\\t\\t\\tcallback(attr.value, blurb);\\n\\t\\t\\tptr = text.indexOf(attr.value, ptr);\\n\\t\\t\\tptr = text.indexOf(']]', ptr) + 2;\\n\\t\\t} else if (attributeName !== \\\"tooltip\\\") {\\n\\t\\t\\tptr = reportAttribute(this.parser, attr, callback, options);\\n\\t\\t}\\n\\t}\\n\\tthis.parser.pos = ptr;\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar ptr = this.nextImage.start,\\n\\t\\tbuilder = new Rebuilder(text, ptr),\\n\\t\\tmakeWidget = false,\\n\\t\\tskipSource = false,\\n\\t\\timageEntry;\\n\\tif (this.nextImage.attributes.source.value === fromTitle && !canBePretty(toTitle, this.nextImage.attributes.tooltip)) {\\n\\t\\tif (this.parser.context.allowWidgets() && (utils.wrapAttributeValue(toTitle) || options.placeholder)) {\\n\\t\\t\\tmakeWidget = true;\\n\\t\\t\\tbuilder.add(\\\"\u003C$image\\\", ptr, ptr+4);\\n\\t\\t} else {\\n\\t\\t\\t// We won't be able to make a placeholder to replace\\n\\t\\t\\t// the source attribute. We check now so we don't\\n\\t\\t\\t// prematurely convert into a widget.\\n\\t\\t\\t// Keep going in case other attributes need replacing.\\n\\t\\t\\tskipSource = true;\\n\\t\\t}\\n\\t}\\n\\tptr += 4; //[img\\n\\tvar inSource = false;\\n\\tfor (var attributeName in this.nextImage.attributes) {\\n\\t\\tvar attr = this.nextImage.attributes[attributeName];\\n\\t\\tif (attributeName === \\\"source\\\" || attributeName === \\\"tooltip\\\") {\\n\\t\\t\\tif (inSource) {\\n\\t\\t\\t\\tptr = text.indexOf('|', ptr);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tptr = text.indexOf('[', ptr);\\n\\t\\t\\t\\tinSource = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (makeWidget) {\\n\\t\\t\\t\\tif (\\\" \\\\t\\\\n\\\".indexOf(text[ptr-1]) >= 0) {\\n\\t\\t\\t\\t\\tbuilder.add('', ptr, ptr+1);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tbuilder.add(' ', ptr, ptr+1);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tptr += 1;\\n\\t\\t}\\n\\t\\tif (attributeName === \\\"source\\\") {\\n\\t\\t\\tptr = text.indexOf(attr.value, ptr);\\n\\t\\t\\tif (attr.value === fromTitle) {\\n\\t\\t\\t\\tif (makeWidget) {\\n\\t\\t\\t\\t\\tvar quotedValue = utils.wrapAttributeValue(toTitle);\\n\\t\\t\\t\\t\\tif (quotedValue === undefined) {\\n\\t\\t\\t\\t\\t\\tvar key = options.placeholder.getPlaceholderFor(toTitle);\\n\\t\\t\\t\\t\\t\\tbuilder.add(\\\"source=\u003C\u003C\\\"+key+\\\">>\\\", ptr, ptr+fromTitle.length);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tbuilder.add(\\\"source=\\\"+quotedValue, ptr, ptr+fromTitle.length);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} else if (!skipSource) {\\n\\t\\t\\t\\t\\tbuilder.add(toTitle, ptr, ptr+fromTitle.length);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tbuilder.impossible = true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tptr = text.indexOf(']]', ptr);\\n\\t\\t\\tif (makeWidget) {\\n\\t\\t\\t\\tbuilder.add(\\\"/>\\\", ptr, ptr+2);\\n\\t\\t\\t}\\n\\t\\t\\tptr += 2;\\n\\t\\t} else if (attributeName === \\\"tooltip\\\") {\\n\\t\\t\\tif (makeWidget) {\\n\\t\\t\\t\\tptr = text.indexOf(attr.value, ptr);\\n\\t\\t\\t\\tvar quotedValue = utils.wrapAttributeValue(attr.value);\\n\\t\\t\\t\\tbuilder.add(\\\"tooltip=\\\"+quotedValue, ptr, ptr+attr.value.length);\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tptr = relinkAttribute(this.parser, attr, builder, fromTitle, toTitle, options);\\n\\t\\t}\\n\\t}\\n\\tthis.parser.pos = ptr;\\n\\tif (builder.changed() || builder.impossible) {\\n\\t\\timageEntry = {\\n\\t\\t\\toutput: builder.results(ptr),\\n\\t\\t\\timpossible: builder.impossible };\\n\\t}\\n\\treturn imageEntry;\\n};\\n\\nfunction reportAttribute(parser, attribute, callback, options) {\\n\\tvar text = parser.source;\\n\\tvar ptr = text.indexOf(attribute.name, attribute.start);\\n\\tvar end;\\n\\tptr += attribute.name.length;\\n\\tptr = text.indexOf('=', ptr);\\n\\tif (attribute.type === \\\"string\\\") {\\n\\t\\tptr = text.indexOf(attribute.value, ptr)\\n\\t\\tvar quote = relinkUtils.determineQuote(text, attribute);\\n\\t\\t// ignore first quote. We already passed it\\n\\t\\tend = ptr + quote.length + attribute.value.length;\\n\\t} else if (attribute.type === \\\"indirect\\\") {\\n\\t\\tptr = text.indexOf('{{', ptr);\\n\\t\\tvar end = ptr + attribute.textReference.length + 4;\\n\\t\\trefHandler.report(attribute.textReference, function(title, blurb) {\\n\\t\\t\\tcallback(title, '[img ' + attribute.name + '={{' + (blurb || '') + '}}]');\\n\\t\\t}, options);\\n\\t} else if (attribute.type === \\\"filtered\\\") {\\n\\t\\tptr = text.indexOf('{{{', ptr);\\n\\t\\tvar end = ptr + attribute.filter.length + 6;\\n\\t\\tfilterHandler.report(attribute.filter, function(title, blurb) {\\n\\t\\t\\tcallback(title, '[img ' + attribute.name + '={{{' + blurb + '}}}]');\\n\\t\\t}, options);\\n\\t} else if (attribute.type === \\\"macro\\\") {\\n\\t\\tptr = text.indexOf(\\\"\u003C\u003C\\\", ptr);\\n\\t\\tvar end = attribute.value.end;\\n\\t\\tvar macro = attribute.value;\\n\\t\\toldValue = attribute.value;\\n\\t\\tmacrocall.reportAttribute(parser, macro, function(title, blurb) {\\n\\t\\t\\tcallback(title, '[img ' + attribute.name + '=' + blurb + ']');\\n\\t\\t}, options);\\n\\t}\\n\\treturn end;\\n};\\n\\nfunction relinkAttribute(parser, attribute, builder, fromTitle, toTitle, options) {\\n\\tvar text = builder.text;\\n\\tvar ptr = text.indexOf(attribute.name, attribute.start);\\n\\tvar end;\\n\\tptr += attribute.name.length;\\n\\tptr = text.indexOf('=', ptr);\\n\\tif (attribute.type === \\\"string\\\") {\\n\\t\\tptr = text.indexOf(attribute.value, ptr)\\n\\t\\tvar quote = relinkUtils.determineQuote(text, attribute);\\n\\t\\t// ignore first quote. We already passed it\\n\\t\\tend = ptr + quote.length + attribute.value.length;\\n\\t} else if (attribute.type === \\\"indirect\\\") {\\n\\t\\tptr = text.indexOf('{{', ptr);\\n\\t\\tvar end = ptr + attribute.textReference.length + 4;\\n\\t\\tvar ref = refHandler.relinkInBraces(attribute.textReference, fromTitle, toTitle, options);\\n\\t\\tif (ref) {\\n\\t\\t\\tif (ref.impossible) {\\n\\t\\t\\t\\tbuilder.impossible = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (ref.output) {\\n\\t\\t\\t\\tbuilder.add(\\\"{{\\\"+ref.output+\\\"}}\\\", ptr, end);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else if (attribute.type === \\\"filtered\\\") {\\n\\t\\tptr = text.indexOf('{{{', ptr);\\n\\t\\tvar end = ptr + attribute.filter.length + 6;\\n\\t\\tvar filter = filterHandler.relinkInBraces(attribute.filter, fromTitle, toTitle, options);\\n\\t\\tif (filter !== undefined) {\\n\\t\\t\\tif (filter.impossible) {\\n\\t\\t\\t\\tbuilder.impossible = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (filter.output) {\\n\\t\\t\\t\\tvar quoted = \\\"{{{\\\"+filter.output+\\\"}}}\\\";\\n\\t\\t\\t\\tbuilder.add(quoted, ptr, end);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t} else if (attribute.type === \\\"macro\\\") {\\n\\t\\tptr = text.indexOf(\\\"\u003C\u003C\\\", ptr);\\n\\t\\tvar end = attribute.value.end;\\n\\t\\tvar macro = attribute.value;\\n\\t\\toldValue = attribute.value;\\n\\t\\tvar macroEntry = macrocall.relinkAttribute(parser, macro, text, fromTitle, toTitle, options);\\n\\t\\tif (macroEntry !== undefined) {\\n\\t\\t\\tif (macroEntry.impossible) {\\n\\t\\t\\t\\tbuilder.impossible = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (macroEntry.output) {\\n\\t\\t\\t\\tbuilder.add(macroEntry.output, ptr, end);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn end;\\n};\\n\\nfunction canBePretty(title, tooltip) {\\n\\treturn title.indexOf(']') \u003C 0 && (tooltip || title.indexOf('|') \u003C 0);\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/import.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/import.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles import pragmas\\n\\n\\\\import [tag[MyTiddler]]\\n\\\\*/\\n\\nvar utils = require(\\\"$:/plugins/flibbles/relink/js/utils.js\\\");\\nvar filterRelinker = utils.getType('filter');\\nvar ImportContext = utils.getContext('import');\\n\\nexports.name = \\\"import\\\";\\n\\nexports.report = function(text, callback, options) {\\n\\t// This moves the pos for us\\n\\tvar parseTree = this.parse();\\n\\tvar filter = parseTree[0].attributes.filter.value || '';\\n\\tfilterRelinker.report(filter, function(title, blurb) {\\n\\t\\tif (blurb) {\\n\\t\\t\\tblurb = '\\\\\\\\import ' + blurb;\\n\\t\\t} else {\\n\\t\\t\\tblurb = '\\\\\\\\import';\\n\\t\\t}\\n\\t\\tcallback(title, blurb);\\n\\t}, options);\\n\\t// Before we go, we need to actually import the variables\\n\\t// it's calling for, and any /relink pragma\\n\\tthis.parser.context = new ImportContext(options.wiki, this.parser.context, filter);\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\t// In this one case, I'll let the parser parse out the filter and move\\n\\t// the ptr.\\n\\tvar start = this.matchRegExp.lastIndex,\\n\\t\\tparseTree = this.parse(),\\n\\t\\tfilter = parseTree[0].attributes.filter.value || '',\\n\\t\\tentry = filterRelinker.relink(filter, fromTitle, toTitle, options);\\n\\tif (entry !== undefined && entry.output) {\\n\\t\\tvar newline = text.substring(start+filter.length, this.parser.pos);\\n\\t\\tfilter = entry.output;\\n\\t\\tentry.output = \\\"\\\\\\\\import \\\" + filter + newline;\\n\\t}\\n\\n\\t// Before we go, we need to actually import the variables\\n\\t// it's calling for, and any /relink pragma\\n\\tthis.parser.context = new ImportContext(options.wiki, this.parser.context, filter);\\n\\n\\treturn entry;\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrocall.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrocall.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles macro calls.\\n\\n\u003C\u003CmyMacro '[[MyFilter]]' 'myTitle'>>\\n\\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\nvar relinkUtils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar macrocall = require('$:/plugins/flibbles/relink/js/utils/macrocall.js');\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\nvar EntryNode = require('$:/plugins/flibbles/relink/js/utils/entry');\\n\\nexports.name = [\\\"macrocallinline\\\", \\\"macrocallblock\\\"];\\n\\nexports.report = function(text, callback, options) {\\n\\tvar macroInfo = getInfoFromRule(this);\\n\\tthis.parser.pos = macroInfo.end;\\n\\tthis.reportAttribute(this.parser, macroInfo, callback, options);\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar macroInfo = getInfoFromRule(this);\\n\\tvar managedMacro = this.parser.context.getMacro(macroInfo.name);\\n\\tthis.parser.pos = macroInfo.end;\\n\\tif (!managedMacro) {\\n\\t\\t// We don't manage this macro. Bye.\\n\\t\\treturn undefined;\\n\\t}\\n\\tvar mayBeWidget = this.parser.context.allowWidgets();\\n\\tvar names = getParamNames(this.parser, macroInfo.name, macroInfo.params, options);\\n\\tif (names === undefined) {\\n\\t\\t// Needed the definition, and couldn't find it. So if a single\\n\\t\\t// parameter needs to placeholder, just fail.\\n\\t\\tmayBeWidget = false;\\n\\t}\\n\\tvar entry = macrocall.relink(this.parser.context, macroInfo, text, fromTitle, toTitle, mayBeWidget, options);\\n\\tif (entry && entry.output) {\\n\\t\\tentry.output = macroToString(entry.output, text, names, options);\\n\\t}\\n\\treturn entry;\\n};\\n\\n/** Relinks macros that occur as attributes, like \u003C$element attr=\u003C\u003C...>> />\\n * Processes the same, except it can't downgrade into a widget if the title\\n * is complicated.\\n * Kept for backward compatibility reasons\\n */\\nexports.relinkAttribute = function(parser, macro, text, fromTitle, toTitle, options) {\\n\\tvar entry = macrocall.relink(parser.context, macro, text, fromTitle, toTitle, false, options);\\n\\tif (entry && entry.output) {\\n\\t\\tentry.output = macrocall.reassemble(entry.output, text, options);\\n\\t}\\n\\treturn entry;\\n};\\n\\n/** As in, report a macrocall invocation that is an html attribute.\\n * Kept for backward compatibility reasons\\n */\\nexports.reportAttribute = function(parser, macro, callback, options) {\\n\\tmacrocall.report(parser.context, macro, function(title, blurb) {\\n\\t\\tcallback(title, \\\"\u003C\u003C\\\" + blurb + \\\">>\\\");\\n\\t}, options);\\n};\\n\\nfunction getInfoFromRule(rule) {\\n\\t// Get all the details of the match\\n\\tvar macroInfo = rule.nextCall;\\n\\tif (!macroInfo) {\\n\\t\\t// rule.match is used \u003Cv5.1.24\\n\\t\\tvar match = rule.match,\\n\\t\\t\\toffset = $tw.utils.skipWhiteSpace(match[0], match[1].length+2);\\n\\t\\tmacroInfo = {\\n\\t\\t\\tname: match[1],\\n\\t\\t\\tstart: rule.matchRegExp.lastIndex - match[0].length,\\n\\t\\t\\tend: rule.matchRegExp.lastIndex,\\n\\t\\t};\\n\\t\\tmacroInfo.params = parseParams(match[2], offset+macroInfo.start);\\n\\t}\\n\\treturn macroInfo;\\n};\\n\\nfunction mustBeAWidget(macro) {\\n\\tfor (var i = 0; i \u003C macro.params.length; i++) {\\n\\t\\tif (macro.params[i].type === \\\"macro\\\") {\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t}\\n\\treturn false\\n};\\n\\n/**Given a macro object ({name:, params:, start: end:}), and the text where\\n * it was parsed from, returns a new macro that maintains any syntactic\\n * structuring.\\n */\\nfunction macroToString(macro, text, names, options) {\\n\\tif (mustBeAWidget(macro)) {\\n\\t\\tvar attrs = [];\\n\\t\\tfor (var i = 0; i \u003C macro.params.length; i++) {\\n\\t\\t\\tvar p = macro.params[i];\\n\\t\\t\\tvar val;\\n\\t\\t\\tif (p.newValue) {\\n\\t\\t\\t\\tval = p.newValue;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tval = utils.wrapAttributeValue(p.value);\\n\\t\\t\\t}\\n\\t\\t\\tattrs.push(\\\" \\\"+names[i]+\\\"=\\\"+val);\\n\\t\\t}\\n\\t\\treturn \\\"\u003C$macrocall $name=\\\"+utils.wrapAttributeValue(macro.name)+attrs.join('')+\\\"/>\\\";\\n\\t} else {\\n\\t\\treturn macrocall.reassemble(macro, text, options);\\n\\t}\\n};\\n\\nfunction getParamNames(parser, macroName, params, options) {\\n\\tvar used = Object.create(null);\\n\\tvar rtn = new Array(params.length);\\n\\tvar anonsExist = false;\\n\\tvar i;\\n\\tfor (i = 0; i \u003C params.length; i++) {\\n\\t\\tvar name = params[i].name;\\n\\t\\tif (name) {\\n\\t\\t\\trtn[i] = name;\\n\\t\\t\\tused[name] = true;\\n\\t\\t} else {\\n\\t\\t\\tanonsExist = true;\\n\\t\\t}\\n\\t}\\n\\tif (anonsExist) {\\n\\t\\tvar def = parser.context.getMacroDefinition(macroName);\\n\\t\\tif (def === undefined) {\\n\\t\\t\\t// If there are anonymous parameters, and we can't\\n\\t\\t\\t// find the definition, then we can't hope to create\\n\\t\\t\\t// a widget.\\n\\t\\t\\treturn undefined;\\n\\t\\t}\\n\\t\\tvar defParams = def.params || [];\\n\\t\\tvar defPtr = 0;\\n\\t\\tfor (i = 0; i \u003C params.length; i++) {\\n\\t\\t\\tif (rtn[i] === undefined) {\\n\\t\\t\\t\\twhile(defPtr \u003C defParams.length && used[defParams[defPtr].name]) {\\n\\t\\t\\t\\t\\tdefPtr++;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (defPtr >= defParams.length) {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\trtn[i] = defParams[defPtr].name;\\n\\t\\t\\t\\tused[defParams[defPtr].name] = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn rtn;\\n};\\n\\nfunction parseParams(paramString, pos) {\\n\\tvar params = [],\\n\\t\\treParam = /\\\\s*(?:([A-Za-z0-9\\\\-_]+)\\\\s*:)?(?:\\\\s*(?:\\\"\\\"\\\"([\\\\s\\\\S]*?)\\\"\\\"\\\"|\\\"([^\\\"]*)\\\"|'([^']*)'|\\\\[\\\\[([^\\\\]]*)\\\\]\\\\]|([^\\\"'\\\\s]+)))/mg,\\n\\t\\tparamMatch = reParam.exec(paramString);\\n\\twhile(paramMatch) {\\n\\t\\t// Process this parameter\\n\\t\\tvar paramInfo = { };\\n\\t\\t// We need to find the group match that isn't undefined.\\n\\t\\tfor (var i = 2; i \u003C= 6; i++) {\\n\\t\\t\\tif (paramMatch[i] !== undefined) {\\n\\t\\t\\t\\tparamInfo.value = paramMatch[i];\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(paramMatch[1]) {\\n\\t\\t\\tparamInfo.name = paramMatch[1];\\n\\t\\t}\\n\\t\\t//paramInfo.start = pos;\\n\\t\\tparamInfo.end = reParam.lastIndex + pos;\\n\\t\\tparams.push(paramInfo);\\n\\t\\t// Find the next match\\n\\t\\tparamMatch = reParam.exec(paramString);\\n\\t}\\n\\treturn params;\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrodef.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrodef.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles pragma macro definitions. Except we only update placeholder macros\\nthat we may have previously install.\\n\\n\\\\define relink-?() Tough title\\n\\n\\\\*/\\n\\nvar utils = require(\\\"$:/plugins/flibbles/relink/js/utils\\\");\\nvar VariableContext = utils.getContext('variable');\\n\\nexports.name = \\\"macrodef\\\";\\n\\nexports.report = function(text, callback, options) {\\n\\tvar setParseTreeNode = this.parse(),\\n\\t\\tm = this.match,\\n\\t\\tname = m[1];\\n\\tthis.parser.context = new VariableContext(this.parser.context, setParseTreeNode[0]);\\n\\t// Parse set the pos pointer, but we don't want to skip the macro body.\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tvar endMatch = getBodyMatch(text, this.parser.pos, m[3]);\\n\\tif (endMatch) {\\n\\t\\tvar value = endMatch[2],\\n\\t\\t\\thandler = utils.getType(getActiveType(name, m[2]) || 'wikitext');\\n\\t\\tif (handler) {\\n\\t\\t\\tvar entry = handler.report(value, function(title, blurb) {\\n\\t\\t\\t\\tvar macroStr = '\\\\\\\\define ' + name + '()';\\n\\t\\t\\t\\tif (blurb) {\\n\\t\\t\\t\\t\\tmacroStr += ' ' + blurb;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcallback(title, macroStr);\\n\\t\\t\\t}, options);\\n\\t\\t}\\n\\t\\tthis.parser.pos = endMatch.index + endMatch[0].length;\\n\\t}\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar setParseTreeNode = this.parse(),\\n\\t\\tentry,\\n\\t\\tm = this.match,\\n\\t\\tname = m[1],\\n\\t\\tparams = m[2],\\n\\t\\tmultiline = m[3];\\n\\tthis.parser.context = new VariableContext(this.parser.context, setParseTreeNode[0]);\\n\\t// Parse set the pos pointer, but we don't want to skip the macro body.\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tvar endMatch = getBodyMatch(text, this.parser.pos, multiline);\\n\\tif (endMatch) {\\n\\t\\tvar value = endMatch[2],\\n\\t\\t\\ttype = getActiveType(name, params),\\n\\t\\t\\thandler = utils.getType(type || 'wikitext');\\n\\t\\tif (handler) {\\n\\t\\t\\t// If this is an active relink placeholder, then let's remember it\\n\\t\\t\\tif (type && options.placeholder) {\\n\\t\\t\\t\\toptions.placeholder.registerExisting(name, value);\\n\\t\\t\\t}\\n\\t\\t\\t// Relink the contents\\n\\t\\t\\tentry = handler.relink(value, fromTitle, toTitle, options);\\n\\t\\t\\tif (entry && entry.output) {\\n\\t\\t\\t\\tentry.output = m[0] + endMatch[1] + entry.output + endMatch[0];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tthis.parser.pos = endMatch.index + endMatch[0].length;\\n\\t}\\n\\treturn entry;\\n};\\n\\n// Return another match for the body, but tooled uniquely\\n// m[1] = whitespace before body\\n// m[2] = body\\n// m.index + m[0].length -> end of match\\nfunction getBodyMatch(text, pos, isMultiline) {\\n\\tvar whitespace,\\n\\t\\tvalueRegExp;\\n\\tif (isMultiline) {\\n\\t\\tvalueRegExp = /\\\\r?\\\\n\\\\\\\\end[^\\\\S\\\\n\\\\r]*(?:\\\\r?\\\\n|$)/mg;\\n\\t\\twhitespace = '';\\n\\t} else {\\n\\t\\tvalueRegExp = /(?:\\\\r?\\\\n|$)/mg;\\n\\t\\tvar newPos = $tw.utils.skipWhiteSpace(text, pos);\\n\\t\\twhitespace = text.substring(pos, newPos);\\n\\t\\tpos = newPos;\\n\\t}\\n\\tvalueRegExp.lastIndex = pos;\\n\\tvar match = valueRegExp.exec(text);\\n\\tif (match) {\\n\\t\\tmatch[1] = whitespace;\\n\\t\\tmatch[2] = text.substring(pos, match.index);\\n\\t}\\n\\treturn match;\\n};\\n\\nfunction getActiveType(macroName, parameters) {\\n\\tvar placeholder = /^relink-(?:(\\\\w+)-)?\\\\d+$/.exec(macroName);\\n\\t// normal macro or special placeholder?\\n\\tif (placeholder && parameters === '') {\\n\\t\\treturn placeholder[1] || 'title';\\n\\t}\\n\\treturn undefined;\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles replacement in wiki text inline rules, like,\\n\\n[[Introduction]]\\n\\n[[link description|TiddlerTitle]]\\n\\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\n\\nexports.name = \\\"prettylink\\\";\\n\\nexports.report = function(text, callback, options) {\\n\\tvar text = this.match[1],\\n\\t\\tlink = this.match[2] || text;\\n\\tif (!$tw.utils.isLinkExternal(link)) {\\n\\t\\tcallback(link, '[[' + text + ']]');\\n\\t}\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tvar caption, m = this.match;\\n\\tif (m[2] === fromTitle) {\\n\\t\\t// format is [[caption|MyTiddler]]\\n\\t\\tcaption = m[1];\\n\\t} else if (m[2] !== undefined || m[1] !== fromTitle) {\\n\\t\\t// format is [[MyTiddler]], and it doesn't match\\n\\t\\treturn undefined;\\n\\t}\\n\\tvar entry = { output: utils.makePrettylink(this.parser, toTitle, caption) };\\n\\tif (entry.output === undefined) {\\n\\t\\tentry.impossible = true;\\n\\t}\\n\\treturn entry;\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/quoteblock.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/quoteblock.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles the quote blocks, as in:\\n\\n\u003C\u003C\u003C\\n...\\n\u003C\u003C\u003C\\n\\n\\\\*/\\n\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\n\\nexports.name = \\\"quoteblock\\\";\\n\\nexports.type = {block: true};\\n\\nexports.report = function(text, callback, options) {\\n\\tvar reEndString = \\\"^\\\" + this.match[1] + \\\"(?!\u003C)\\\";\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\tthis.parser.parseClasses();\\n\\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\\n\\n\\t// Parse the optional cite\\n\\treportCite(this.parser, this.match[1]);\\n\\t// Now parse the body of the quote\\n\\tthis.parser.parseBlocks(reEndString);\\n\\tif (this.match) {\\n\\t\\t// Now parse the closing cite\\n\\t\\treportCite(this.parser, this.match[1]);\\n\\t}\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar reEndString = \\\"^\\\" + this.match[1] + \\\"(?!\u003C)\\\";\\n\\tvar builder = new Rebuilder(text, this.parser.pos);\\n\\tvar entry;\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\n\\tthis.parser.parseClasses();\\n\\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\\n\\n\\t// Parse the optional cite\\n\\tmergeRelinks(builder, this.parser.parseInlineRun(/(\\\\r?\\\\n)/mg));\\n\\t// Now parse the body of the quote\\n\\tmergeRelinks(builder, this.parser.parseBlocks(reEndString));\\n\\t// Now parse the closing cite\\n\\tmergeRelinks(builder, this.parser.parseInlineRun(/(\\\\r?\\\\n)/mg));\\n\\n\\tif (builder.changed() || builder.impossible) {\\n\\t\\tentry = {};\\n\\t\\tentry.output = builder.results(this.parser.pos);\\n\\t\\tif (builder.impossible) {\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\\nfunction reportCite(parser, delimeter) {\\n\\tvar callback = parser.callback;\\n\\ttry {\\n\\t\\tparser.callback = function(title, blurb) {\\n\\t\\t\\treturn callback(title, delimeter + \\\" \\\" + blurb);\\n\\t\\t};\\n\\t\\tparser.parseInlineRun(/(\\\\r?\\\\n)/mg);\\n\\t} finally {\\n\\t\\tparser.callback = callback;\\n\\t}\\n};\\n\\nfunction mergeRelinks(builder, output) {\\n\\tif (output.length > 0) {\\n\\t\\tfor (var i = 0; i \u003C output.length; i++) {\\n\\t\\t\\tvar o = output[i];\\n\\t\\t\\tif (o.output) {\\n\\t\\t\\t\\tbuilder.add(o.output, o.start, o.end);\\n\\t\\t\\t}\\n\\t\\t\\tif (o.impossible) {\\n\\t\\t\\t\\tbuilder.impossible = true;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/relink.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/relink.js\",\"text\":\"/*\\\\\\nmodule-type: wikirule\\n\\nThis defines the \\\\relink inline pragma used to locally declare\\nrelink rules for macros.\\n\\nIt takes care of providing its own relink and report rules.\\n\\n\\\\*/\\n\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\\n\\nexports.name = \\\"relink\\\";\\nexports.types = {pragma: true};\\n\\nexports.init = function(parser) {\\n\\tthis.parser = parser;\\n\\tthis.matchRegExp = /^\\\\\\\\relink[^\\\\S\\\\n]+([^(\\\\s]+)([^\\\\r\\\\n]*)(\\\\r?\\\\n)?/mg;\\n};\\n\\n/**This makes the widget that the macro library will later parse to determine\\n * new macro relink state.\\n *\\n * It's a \u003C$set> widget so it can appear BEFORE \\\\define pragma and not\\n * prevent that pragma from being scooped up by importvariables.\\n * (importvariables stops scooping as soon as it sees something besides $set) */\\nexports.parse = function() {\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tvar macroName;\\n\\tvar macroParams = Object.create(null);\\n\\tvar error = undefined;\\n\\tvar rtn = [];\\n\\tvar self = this;\\n\\tthis.interpretSettings(function(macro, parameter, type) {\\n\\t\\tmacroName = macro;\\n\\t\\tif (type && !utils.getType(type)) {\\n\\t\\t\\terror = language.getString(\\\"text/plain\\\", \\\"Error/UnrecognizedType\\\",\\n\\t\\t\\t\\t{variables: {type: type}, wiki: self.parser.wiki});\\n\\t\\t}\\n\\t\\tmacroParams[parameter] = type;\\n\\t});\\n\\t// If no macroname. Return nothing, this rule will be ignored by parsers\\n\\tif (macroName) {\\n\\t\\tvar relink = Object.create(null);\\n\\t\\trelink[macroName] = macroParams;\\n\\t\\trtn.push({\\n\\t\\t\\ttype: \\\"set\\\",\\n\\t\\t\\tattributes: {\\n\\t\\t\\t\\tname: {type: \\\"string\\\", value: \\\"\\\"}\\n\\t\\t\\t},\\n\\t\\t\\tchildren: [],\\n\\t\\t\\tisMacroDefinition: true,\\n\\t\\t\\trelink: relink});\\n\\t}\\n\\tif (error) {\\n\\t\\trtn.push({\\n\\t\\t\\ttype: \\\"element\\\", tag: \\\"span\\\", attributes: {\\n\\t\\t\\t\\t\\\"class\\\": {\\n\\t\\t\\t\\t\\ttype: \\\"string\\\",\\n\\t\\t\\t\\t\\tvalue: \\\"tc-error tc-relink-error\\\"\\n\\t\\t\\t\\t}\\n\\t\\t\\t}, children: [\\n\\t\\t\\t\\t{type: \\\"text\\\", text: error}\\n\\t\\t\\t]});\\n\\t}\\n\\treturn rtn;\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar parser = this.parser;\\n\\tvar currentTiddler = parser.context.widget.variables.currentTiddler.value;\\n\\tparser.pos = this.matchRegExp.lastIndex;\\n\\tthis.interpretSettings(function(macro, parameter, type) {\\n\\t\\toptions.settings.addSetting(parser.wiki, macro, parameter, type, currentTiddler);\\n\\t});\\n\\t// Return nothing, because this rule is ignored by the parser\\n\\treturn undefined;\\n};\\n\\nexports.interpretSettings = function(block) {\\n\\tvar paramString = this.match[2];\\n\\tif (paramString !== \\\"\\\") {\\n\\t\\tvar macro = this.match[1];\\n\\t\\tvar reParam = /\\\\s*([A-Za-z0-9\\\\-_]+)(?:\\\\s*:\\\\s*([^\\\\s]+))?/mg;\\n\\t\\tvar paramMatch = reParam.exec(paramString);\\n\\t\\twhile (paramMatch) {\\n\\t\\t\\tvar parameter = paramMatch[1];\\n\\t\\t\\tvar type = paramMatch[2];\\n\\t\\t\\tblock(macro, parameter, type);\\n\\t\\t\\tparamMatch = reParam.exec(paramString);\\n\\t\\t}\\n\\t}\\n};\\n\",\"module-type\":\"wikirule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/rules.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/rules.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nParses and acknowledges any pragma rules a tiddler has.\\n\\n\\\\rules except html wikilink\\n\\n\\\\*/\\n\\nexports.name = \\\"rules\\\";\\n\\n/**This is all we have to do. The rules rule doesn't parse. It just amends\\n * the rules, which is exactly what I want it to do too.\\n * It also takes care of moving the pos pointer forward.\\n */\\nexports.relink = function() {\\n\\tthis.parse();\\n\\treturn undefined;\\n};\\n\\n// Same deal\\nexports.report = exports.relink;\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/syslink.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/syslink.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles sys links\\n\\n$:/sys/link\\n\\nbut not:\\n\\n~$:/sys/link\\n\\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\n\\nexports.name = \\\"syslink\\\";\\n\\nexports.report = function(text, callback, options) {\\n\\tvar title = this.match[0];\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tif (title[0] !== \\\"~\\\") {\\n\\t\\tcallback(title, '~' + title);\\n\\t}\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar entry = undefined;\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tif (this.match[0] === fromTitle && this.match[0][0] !== \\\"~\\\") {\\n\\t\\tentry = {output: this.makeSyslink(toTitle, options)};\\n\\t\\tif (entry.output === undefined) {\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\\nexports.makeSyslink = function(title, options) {\\n\\tvar match = title.match(this.matchRegExp);\\n\\tif (match && match[0] === title && title[0] !== \\\"~\\\") {\\n\\t\\treturn title;\\n\\t} else {\\n\\t\\treturn utils.makePrettylink(this.parser, title);\\n\\t}\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/table.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/table.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles tables. Or rather handles the cells inside the tables, since tables\\nthemselves aren't relinked.\\n\\n\\\\*/\\n\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\n\\nexports.name = \\\"table\\\";\\n\\nexports.types = {block: true};\\n\\nexports.report = function(text, callback, options) {\\n\\tvar rowRegExp = /^\\\\|([^\\\\n]*)\\\\|([fhck]?)\\\\r?(?:\\\\n|$)/mg,\\n\\t\\trowTermRegExp = /(\\\\|(?:[fhck]?)\\\\r?(?:\\\\n|$))/mg;\\n\\t// Match the row\\n\\trowRegExp.lastIndex = this.parser.pos;\\n\\tvar rowMatch = rowRegExp.exec(this.parser.source);\\n\\twhile(rowMatch && rowMatch.index === this.parser.pos) {\\n\\t\\tvar rowType = rowMatch[2];\\n\\t\\t// Check if it is a class assignment\\n\\t\\tif(rowType === \\\"k\\\") {\\n\\t\\t\\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\\n\\t\\t} else if(rowType === \\\"c\\\") {\\n\\t\\t\\t// Is this a caption row?\\n\\t\\t\\t// If so, move past the opening `|` of the row\\n\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t// Parse the caption\\n\\t\\t\\tvar oldCallback = this.parser.callback;\\n\\t\\t\\tthis.parser.callback = function(title, blurb) {\\n\\t\\t\\t\\tcallback(title, '|' + blurb + '|c');\\n\\t\\t\\t};\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tthis.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\\n\\t\\t\\t} finally {\\n\\t\\t\\t\\tthis.parser.callback = oldCallback;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\t// Process the row\\n\\t\\t\\tprocessRow.call(this, rowType, callback);\\n\\t\\t\\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\\n\\t\\t}\\n\\t\\trowMatch = rowRegExp.exec(this.parser.source);\\n\\t}\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar rowRegExp = /^\\\\|([^\\\\n]*)\\\\|([fhck]?)\\\\r?(?:\\\\n|$)/mg,\\n\\t\\trowTermRegExp = /(\\\\|(?:[fhck]?)\\\\r?(?:\\\\n|$))/mg,\\n\\t\\tbuilder = new Rebuilder(text, this.parser.pos),\\n\\t\\timpossible = false,\\n\\t\\toutput,\\n\\t\\tentry;\\n\\t// Match the row\\n\\trowRegExp.lastIndex = this.parser.pos;\\n\\tvar rowMatch = rowRegExp.exec(this.parser.source);\\n\\twhile(rowMatch && rowMatch.index === this.parser.pos) {\\n\\t\\tvar rowType = rowMatch[2];\\n\\t\\t// Check if it is a class assignment\\n\\t\\tif(rowType === \\\"k\\\") {\\n\\t\\t\\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\\n\\t\\t} else {\\n\\t\\t\\t// Is this a caption row?\\n\\t\\t\\tif(rowType === \\\"c\\\") {\\n\\t\\t\\t\\t// If so, move past the opening `|` of the row\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t\\t// Parse the caption\\n\\t\\t\\t\\toutput = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// Process the row\\n\\t\\t\\t\\toutput = processRow.call(this);\\n\\t\\t\\t\\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\\n\\t\\t\\t}\\n\\t\\t\\tif (output.length > 0) {\\n\\t\\t\\t\\tfor (var i = 0; i \u003C output.length; i++) {\\n\\t\\t\\t\\t\\tvar o = output[i];\\n\\t\\t\\t\\t\\tif (o.output) {\\n\\t\\t\\t\\t\\t\\tbuilder.add(o.output, o.start, o.end);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif (o.impossible) {\\n\\t\\t\\t\\t\\t\\timpossible = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\trowMatch = rowRegExp.exec(this.parser.source);\\n\\t}\\n\\tif (builder.changed() || impossible) {\\n\\t\\tentry = {}\\n\\t\\tentry.output = builder.results(this.parser.pos);\\n\\t\\tif (impossible) {\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\\nvar processRow = function(rowType, callback) {\\n\\tvar cellRegExp = /(?:\\\\|([^\\\\n\\\\|]*)\\\\|)|(\\\\|[fhck]?\\\\r?(?:\\\\n|$))/mg,\\n\\t\\tcellTermRegExp = /((?:\\\\x20*)\\\\|)/mg,\\n\\t\\tchildren = [];\\n\\t// Match a single cell\\n\\tcellRegExp.lastIndex = this.parser.pos;\\n\\tvar cellMatch = cellRegExp.exec(this.parser.source);\\n\\twhile(cellMatch && cellMatch.index === this.parser.pos) {\\n\\t\\tif(cellMatch[2]) {\\n\\t\\t\\t// End of row\\n\\t\\t\\tthis.parser.pos = cellRegExp.lastIndex - 1;\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\tswitch (cellMatch[1]) {\\n\\t\\tcase '~':\\n\\t\\tcase '>':\\n\\t\\tcase '\u003C':\\n\\t\\t\\t// Move to just before the `|` terminating the cell\\n\\t\\t\\tthis.parser.pos = cellRegExp.lastIndex - 1;\\n\\t\\t\\tbreak;\\n\\t\\tdefault:\\n\\t\\t\\t// For ordinary cells, step beyond the opening `|`\\n\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t// Look for a space at the start of the cell\\n\\t\\t\\tvar spaceLeft = false;\\n\\t\\t\\tvar prefix = '|';\\n\\t\\t\\tvar suffix = '|';\\n\\t\\t\\tif(this.parser.source.substr(this.parser.pos).search(/^\\\\^([^\\\\^]|\\\\^\\\\^)/) === 0) {\\n\\t\\t\\t\\tprefix += '^';\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\\n\\t\\t\\t\\tprefix += ',';\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t}\\n\\t\\t\\tvar chr = this.parser.source.substr(this.parser.pos,1);\\n\\t\\t\\twhile(chr === \\\" \\\") {\\n\\t\\t\\t\\tspaceLeft = true;\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t\\tchr = this.parser.source.substr(this.parser.pos,1);\\n\\t\\t\\t}\\n\\t\\t\\tif (spaceLeft) {\\n\\t\\t\\t\\tprefix += ' ';\\n\\t\\t\\t}\\n\\t\\t\\t// Check whether this is a heading cell\\n\\t\\t\\tif(chr === \\\"!\\\") {\\n\\t\\t\\t\\tthis.parser.pos++;\\n\\t\\t\\t\\tprefix += '!';\\n\\t\\t\\t}\\n\\t\\t\\t// Parse the cell\\n\\t\\t\\tvar oldCallback = this.parser.callback;\\n\\t\\t\\tvar reports = [];\\n\\t\\t\\tthis.parser.callback = function(title, blurb) {\\n\\t\\t\\t\\treports.push(title, blurb);\\n\\t\\t\\t};\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tvar output = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\\n\\t\\t\\t\\tif (output.length > 0) {\\n\\t\\t\\t\\t\\tchildren.push(output[0]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(this.parser.source.substr(this.parser.pos - 2,1) === \\\" \\\") { // spaceRight\\n\\t\\t\\t\\t\\tsuffix = ' |';\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tfor (var i = 0; i \u003C reports.length; i += 2) {\\n\\t\\t\\t\\t\\tcallback(reports[i], prefix + reports[i+1] + suffix + rowType);\\n\\t\\t\\t\\t}\\n\\t\\t\\t} finally {\\n\\t\\t\\t\\tthis.parser.callback = oldCallback;\\n\\t\\t\\t}\\n\\t\\t\\t// Move back to the closing `|`\\n\\t\\t\\tthis.parser.pos--;\\n\\t\\t}\\n\\t\\tcellRegExp.lastIndex = this.parser.pos;\\n\\t\\tcellMatch = cellRegExp.exec(this.parser.source);\\n\\t}\\n\\treturn children;\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/transclude.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/transclude.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles replacement of transclusions in wiki text like,\\n\\n{{RenamedTiddler}}\\n{{RenamedTiddler||TemplateTitle}}\\n\\nThis renames both the tiddler and the template field.\\n\\n\\\\*/\\n\\nvar refHandler = require(\\\"$:/plugins/flibbles/relink/js/fieldtypes/reference\\\");\\nvar utils = require(\\\"./utils.js\\\");\\nvar relinkUtils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar referenceOperators = relinkUtils.getModulesByTypeAsHashmap('relinkreference', 'name');\\n\\nexports.name = ['transcludeinline', 'transcludeblock'];\\n\\nexports.report = function(text, callback, options) {\\n\\tvar m = this.match,\\n\\t\\trefString = $tw.utils.trim(m[1]),\\n\\t\\tref = parseTextReference(refString);\\n\\t\\ttemplate = $tw.utils.trim(m[2]);\\n\\tfor (var operator in referenceOperators) {\\n\\t\\treferenceOperators[operator].report(ref, function(title, blurb) {\\n\\t\\t\\tblurb = blurb || \\\"\\\";\\n\\t\\t\\tif (template) {\\n\\t\\t\\t\\tblurb += '||' + template;\\n\\t\\t\\t}\\n\\t\\t\\tcallback(title, \\\"{{\\\" + blurb + \\\"}}\\\");\\n\\t\\t}, options);\\n\\t}\\n\\tif (template) {\\n\\t\\tcallback(template, '{{' + refString + '||}}');\\n\\t}\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar m = this.match,\\n\\t\\treference = parseTextReference(m[1]),\\n\\t\\ttemplate = m[2],\\n\\t\\tentry = undefined,\\n\\t\\timpossible = false,\\n\\t\\tmodified = false;\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tfor (var operator in referenceOperators) {\\n\\t\\tvar result = referenceOperators[operator].relink(reference, fromTitle, toTitle, options);\\n\\t\\tif (result !== undefined) {\\n\\t\\t\\tif (result.impossible) {\\n\\t\\t\\t\\timpossible = true;\\n\\t\\t\\t}\\n\\t\\t\\tif (result.output) {\\n\\t\\t\\t\\treference = result.output;\\n\\t\\t\\t\\tmodified = true\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\tif ($tw.utils.trim(template) === fromTitle) {\\n\\t\\ttemplate = template.replace(fromTitle, toTitle);\\n\\t\\tmodified = true;\\n\\t}\\n\\tif (modified) {\\n\\t\\tvar output = this.makeTransclude(this.parser, reference, template);\\n\\t\\tif (output) {\\n\\t\\t\\t// Adding any newline that might have existed is\\n\\t\\t\\t// what allows this relink method to work for both\\n\\t\\t\\t// the block and inline filter wikitext rule.\\n\\t\\t\\tentry = {output: output + utils.getEndingNewline(m[0])};\\n\\t\\t} else {\\n\\t\\t\\timpossible = true;\\n\\t\\t}\\n\\t}\\n\\tif (impossible) {\\n\\t\\tentry = entry || {};\\n\\t\\tentry.impossible = true;\\n\\t}\\n\\treturn entry;\\n};\\n\\n// I have my own because the core one is deficient for my needs.\\nfunction parseTextReference(textRef) {\\n\\t// Separate out the title, field name and/or JSON indices\\n\\tvar reTextRef = /^([\\\\w\\\\W]*?)(?:!!(\\\\S[\\\\w\\\\W]*)|##(\\\\S[\\\\w\\\\W]*))?$/g;\\n\\t\\tmatch = reTextRef.exec(textRef),\\n\\t\\tresult = {};\\n\\tif(match) {\\n\\t\\t// Return the parts\\n\\t\\tresult.title = match[1];\\n\\t\\tresult.field = match[2];\\n\\t\\tresult.index = match[3];\\n\\t} else {\\n\\t\\t// If we couldn't parse it\\n\\t\\tresult.title = textRef\\n\\t}\\n\\treturn result;\\n};\\n\\n/** This converts a reference and a template into a string representation\\n * of a transclude.\\n */\\nexports.makeTransclude = function(parser, reference, template) {\\n\\tvar rtn;\\n\\tif (!canBePrettyTemplate(template)) {\\n\\t\\tvar widget = utils.makeWidget(parser, '$transclude', {\\n\\t\\t\\ttiddler: $tw.utils.trim(template),\\n\\t\\t\\tfield: reference.field,\\n\\t\\t\\tindex: reference.index});\\n\\t\\tif (reference.title && widget !== undefined) {\\n\\t\\t\\trtn = utils.makeWidget(parser, '$tiddler', {tiddler: $tw.utils.trim(reference.title)}, widget);\\n\\t\\t} else {\\n\\t\\t\\trtn = widget;\\n\\t\\t}\\n\\t} else if (!canBePrettyTitle(reference.title) || !canBePrettyField(reference.field)) {\\n\\t\\t// This block and the next account for the 1%...\\n\\t\\tvar transclude;\\n\\t\\tif (canBePrettyField(reference.field)) {\\n\\t\\t\\tvar reducedRef = {field: reference.field, index: reference.index};\\n\\t\\t\\ttransclude = prettyTransclude(reducedRef, template);\\n\\t\\t} else {\\n\\t\\t\\ttransclude = utils.makeWidget(parser, \\\"$transclude\\\", {tiddler: $tw.utils.trim(reference.title), field: reference.field});\\n\\t\\t}\\n\\t\\trtn = utils.makeWidget(parser, '$tiddler', {tiddler: $tw.utils.trim(reference.title)}, transclude);\\n\\t} else {\\n\\t\\t// This block takes care of 99% of all cases\\n\\t\\trtn = prettyTransclude(reference, template);\\n\\t}\\n\\treturn rtn;\\n};\\n\\nfunction canBePrettyTitle(value) {\\n\\treturn refHandler.canBePretty(value) && canBePrettyTemplate(value);\\n};\\n\\nfunction canBePrettyField(value) {\\n\\treturn !/[\\\\|\\\\}\\\\{]/.test(value);\\n};\\n\\nfunction canBePrettyTemplate(value) {\\n\\treturn !value || (value.indexOf('}') \u003C 0 && value.indexOf('{') \u003C 0 && value.indexOf('|') \u003C 0);\\n};\\n\\nfunction prettyTransclude(textReference, template) {\\n\\tif (typeof textReference !== \\\"string\\\") {\\n\\t\\ttextReference = refHandler.toString(textReference);\\n\\t}\\n\\tif (!textReference) {\\n\\t\\ttextReference = '';\\n\\t}\\n\\tif (template !== undefined) {\\n\\t\\treturn \\\"{{\\\"+textReference+\\\"||\\\"+template+\\\"}}\\\";\\n\\t} else {\\n\\t\\treturn \\\"{{\\\"+textReference+\\\"}}\\\";\\n\\t}\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/typedblock.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/typedblock.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles the typeed blocks, as in:\\n\\n$$$text/vnd.tiddlywiki>text/html\\n...\\n$$$\\n\\n\\\\*/\\n\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\nvar language = require('$:/plugins/flibbles/relink/js/language.js');\\n\\nexports.name = \\\"typedblock\\\";\\n\\nexports.types = {block: true};\\n\\nvar textOperators;\\nvar oldTextOperators;\\n\\nfunction getTextOperator(type, options) {\\n\\tvar operator;\\n\\tif (textOperators === undefined) {\\n\\t\\ttextOperators = utils.getModulesByTypeAsHashmap('relinktext', 'type');\\n\\t\\toldTextOperators = utils.getModulesByTypeAsHashmap('relinktextoperator', 'type');\\n\\t}\\n\\toperator = textOperators[type];\\n\\tif (operator) {\\n\\t\\treturn operator;\\n\\t}\\n\\tvar info = $tw.utils.getFileExtensionInfo(type);\\n\\tif (info && textOperators[info.type]) {\\n\\t\\treturn textOperators[info.type];\\n\\t}\\n\\tvar old = oldTextOperators[type] || (info && oldTextOperators[info.type]);\\n\\tif (old) {\\n\\t\\tvar vars = Object.create(options);\\n\\t\\tvars.variables = {type: old.type, keyword: type};\\n\\t\\tvar warnString = language.getString(\\\"text/html\\\", \\\"Warning/OldRelinkTextOperator\\\", vars)\\n\\t\\tlanguage.warn(warnString);\\n\\t\\toldTextOperators[type] = undefined;\\n\\t}\\n};\\n\\nfunction getText() {\\n\\tvar reEnd = /\\\\r?\\\\n\\\\$\\\\$\\\\$\\\\r?(?:\\\\n|$)/mg;\\n\\t// Move past the match\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\t// Look for the end of the block\\n\\treEnd.lastIndex = this.parser.pos;\\n\\tvar match = reEnd.exec(this.parser.source),\\n\\t\\ttext;\\n\\t// Process the block\\n\\tif(match) {\\n\\t\\ttext = this.parser.source.substring(this.parser.pos,match.index);\\n\\t\\tthis.parser.pos = match.index + match[0].length;\\n\\t} else {\\n\\t\\ttext = this.parser.source.substr(this.parser.pos);\\n\\t\\tthis.parser.pos = this.parser.sourceLength;\\n\\t}\\n\\treturn text;\\n};\\n\\nexports.report = function(text, callback, options) {\\n\\tvar innerText = getText.call(this),\\n\\t\\toperator = getTextOperator(this.match[1], options);\\n\\tif (operator) {\\n\\t\\treturn operator.report(innerText, callback, options);\\n\\t}\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar start = this.parser.pos,\\n\\t\\tinnerStart = this.matchRegExp.lastIndex,\\n\\t\\tinnerText = getText.call(this),\\n\\t\\toperator = getTextOperator(this.match[1], options);\\n\\tif (operator) {\\n\\t\\tvar innerOptions = Object.create(options);\\n\\t\\tinnerOptions.settings = this.parser.context;\\n\\t\\tvar results = operator.relink(innerText, fromTitle, toTitle, innerOptions);\\n\\t\\tif (results && results.output) {\\n\\t\\t\\tvar builder = new Rebuilder(text, start);\\n\\t\\t\\tbuilder.add(results.output, innerStart, innerStart + innerText.length);\\n\\t\\t\\tresults.output = builder.results(this.parser.pos);\\n\\t\\t}\\n\\t\\treturn results;\\n\\t}\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/utils.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/utils.js\",\"text\":\"/*\\\\\\nmodule-type: library\\n\\nUtility methods for the wikitext relink rules.\\n\\n\\\\*/\\n\\nexports.makeWidget = function(parser, tag, attributes, body) {\\n\\tif (!parser.context.allowWidgets()) {\\n\\t\\treturn undefined;\\n\\t}\\n\\tvar string = '\u003C' + tag;\\n\\tfor (var attr in attributes) {\\n\\t\\tvar value = attributes[attr];\\n\\t\\tif (value !== undefined) {\\n\\t\\t\\tvar quoted = exports.wrapAttributeValue(value);\\n\\t\\t\\tif (!quoted) {\\n\\t\\t\\t\\tif (!parser.options.placeholder) {\\n\\t\\t\\t\\t\\t// It's not possible to make this widget\\n\\t\\t\\t\\t\\treturn undefined;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tvar category = getPlaceholderCategory(parser.context, tag, attr);\\n\\t\\t\\t\\tquoted = '\u003C\u003C' + parser.placeholder.getPlaceholderFor(value, category) + '>>';\\n\\t\\t\\t}\\n\\t\\t\\tstring += ' ' + attr + '=' + quoted;\\n\\t\\t}\\n\\t}\\n\\tif (body !== undefined) {\\n\\t\\tstring += '>' + body + '\u003C/' + tag + '>';\\n\\t} else {\\n\\t\\tstring += '/>';\\n\\t}\\n\\treturn string;\\n};\\n\\nfunction getPlaceholderCategory(context, tag, attribute) {\\n\\tvar element = context.getAttribute(tag);\\n\\tvar rule = element && element[attribute];\\n\\t// titles go to relink-\\\\d\\n\\t// plaintext goes to relink-plaintext-\\\\d\\n\\t// because titles are way more common, also legacy\\n\\tif (rule === undefined) {\\n\\t\\treturn 'plaintext';\\n\\t} else {\\n\\t\\trule = rule.fields.text;\\n\\t\\tif (rule === 'title') {\\n\\t\\t\\trule = undefined;\\n\\t\\t}\\n\\t\\treturn rule;\\n\\t}\\n};\\n\\nexports.makePrettylink = function(parser, title, caption) {\\n\\tvar output;\\n\\tif (parser.context.allowPrettylinks() && canBePrettylink(title, caption)) {\\n\\t\\tif (caption !== undefined) {\\n\\t\\t\\toutput = \\\"[[\\\" + caption + \\\"|\\\" + title + \\\"]]\\\";\\n\\t\\t} else {\\n\\t\\t\\toutput = \\\"[[\\\" + title + \\\"]]\\\";\\n\\t\\t}\\n\\t} else if (caption !== undefined) {\\n\\t\\tvar safeCaption = sanitizeCaption(parser, caption);\\n\\t\\tif (safeCaption !== undefined) {\\n\\t\\t\\toutput = exports.makeWidget(parser, '$link', {to: title}, safeCaption);\\n\\t\\t}\\n\\t} else if (exports.shorthandPrettylinksSupported(parser.wiki)) {\\n\\t\\toutput = exports.makeWidget(parser, '$link', {to: title});\\n\\t} else if (parser.context.allowWidgets() && parser.placeholder) {\\n\\t\\t// If we don't have a caption, we must resort to\\n\\t\\t// placeholders anyway to prevent link/caption desync\\n\\t\\t// from later relinks.\\n\\t\\t// It doesn't matter whether the tiddler is quotable.\\n\\t\\tvar ph = parser.placeholder.getPlaceholderFor(title);\\n\\t\\toutput = \\\"\u003C$link to=\u003C\u003C\\\"+ph+\\\">>>\u003C$text text=\u003C\u003C\\\"+ph+\\\">>/>\u003C/$link>\\\";\\n\\t}\\n\\treturn output;\\n};\\n\\n/**In version 5.1.20, Tiddlywiki made it so \u003C$link to\\\"something\\\" /> would\\n * use \\\"something\\\" as a caption. This is preferable. However, Relink works\\n * going back to 5.1.14, so we need to have different handling for both\\n * cases.\\n */\\nvar _supported;\\nexports.shorthandPrettylinksSupported = function(wiki) {\\n\\tif (_supported === undefined) {\\n\\t\\tvar test = wiki.renderText(\\\"text/plain\\\", \\\"text/vnd.tiddlywiki\\\", \\\"\u003C$link to=test/>\\\");\\n\\t\\t_supported = (test === \\\"test\\\");\\n\\t}\\n\\treturn _supported;\\n};\\n\\n/**Return true if value can be used inside a prettylink.\\n */\\nfunction canBePrettylink(value, customCaption) {\\n\\treturn value.indexOf(\\\"]]\\\") \u003C 0 && value[value.length-1] !== ']' && (customCaption !== undefined || value.indexOf('|') \u003C 0);\\n};\\n\\nfunction sanitizeCaption(parser, caption) {\\n\\tvar plaintext = parser.wiki.renderText(\\\"text/plain\\\", \\\"text/vnd.tiddlywiki\\\", caption);\\n\\tif (plaintext === caption && caption.indexOf(\\\"\u003C/$link>\\\") \u003C= 0) {\\n\\t\\treturn caption;\\n\\t} else {\\n\\t\\treturn exports.makeWidget(parser, '$text', {text: caption});\\n\\t}\\n};\\n\\n/**Finds an appropriate quote mark for a given value.\\n *\\n *Tiddlywiki doesn't have escape characters for attribute values. Instead,\\n * we just have to find the type of quotes that'll work for the given title.\\n * There exist titles that simply can't be quoted.\\n * If it can stick with the preference, it will.\\n *\\n * return: Returns the wrapped value, or undefined if it's impossible to wrap\\n */\\nexports.wrapAttributeValue = function(value, preference) {\\n\\tvar whitelist = [\\\"\\\", \\\"'\\\", '\\\"', '\\\"\\\"\\\"'];\\n\\tvar choices = {\\n\\t\\t\\\"\\\": function(v) {return !/([\\\\/\\\\s\u003C>\\\"'=])/.test(v) && v.length > 0; },\\n\\t\\t\\\"'\\\": function(v) {return v.indexOf(\\\"'\\\") \u003C 0; },\\n\\t\\t'\\\"': function(v) {return v.indexOf('\\\"') \u003C 0; },\\n\\t\\t'\\\"\\\"\\\"': function(v) {return v.indexOf('\\\"\\\"\\\"') \u003C 0 && v[v.length-1] != '\\\"';}\\n\\t};\\n\\tif (choices[preference] && choices[preference](value)) {\\n\\t\\treturn wrap(value, preference);\\n\\t}\\n\\tfor (var i = 0; i \u003C whitelist.length; i++) {\\n\\t\\tvar quote = whitelist[i];\\n\\t\\tif (choices[quote](value)) {\\n\\t\\t\\treturn wrap(value, quote);\\n\\t\\t}\\n\\t}\\n\\t// No quotes will work on this\\n\\treturn undefined;\\n};\\n\\nfunction wrap(value, wrapper) {\\n\\tvar wrappers = {\\n\\t\\t\\\"\\\": function(v) {return v; },\\n\\t\\t\\\"'\\\": function(v) {return \\\"'\\\"+v+\\\"'\\\"; },\\n\\t\\t'\\\"': function(v) {return '\\\"'+v+'\\\"'; },\\n\\t\\t'\\\"\\\"\\\"': function(v) {return '\\\"\\\"\\\"'+v+'\\\"\\\"\\\"'; },\\n\\t\\t\\\"[[\\\": function(v) {return \\\"[[\\\"+v+\\\"]]\\\"; }\\n\\t};\\n\\tvar chosen = wrappers[wrapper];\\n\\tif (chosen) {\\n\\t\\treturn chosen(value);\\n\\t} else {\\n\\t\\treturn undefined;\\n\\t}\\n};\\n\\nfunction canBePrettyOperand(value) {\\n\\treturn value.indexOf(']') \u003C 0;\\n};\\n\\n// Finds the newline at the end of a string and returns it. Empty string if\\n// none exists.\\nexports.getEndingNewline = function(string) {\\n\\tvar l = string.length;\\n\\tif (string[l-1] === '\\\\n') {\\n\\t\\treturn (string[l-2] === '\\\\r') ? \\\"\\\\r\\\\n\\\" : \\\"\\\\n\\\";\\n\\t}\\n\\treturn \\\"\\\";\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/wikilink.js\":{\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/wikilink.js\",\"text\":\"/*\\\\\\nmodule-type: relinkwikitextrule\\n\\nHandles CamelCase links\\n\\nWikiLink\\n\\nbut not:\\n\\n~WikiLink\\n\\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\n\\nexports.name = \\\"wikilink\\\";\\n\\nexports.report = function(text, callback, options) {\\n\\tvar title = this.match[0],\\n\\t\\tunlink = $tw.config.textPrimitives.unWikiLink;\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tif (title[0] !== unlink) {\\n\\t\\tcallback(title, unlink + title);\\n\\t}\\n};\\n\\nexports.relink = function(text, fromTitle, toTitle, options) {\\n\\tvar entry = undefined,\\n\\t\\ttitle = this.match[0];\\n\\tthis.parser.pos = this.matchRegExp.lastIndex;\\n\\tif (title === fromTitle && title[0] !== $tw.config.textPrimitives.unWikiLink) {\\n\\t\\tentry = { output: this.makeWikilink(toTitle, options) };\\n\\t\\tif (entry.output === undefined) {\\n\\t\\t\\tentry.impossible = true;\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\\nexports.makeWikilink = function(title, options) {\\n\\tif (title.match(this.matchRegExp) && title[0] !== $tw.config.textPrimitives.unWikiLink) {\\n\\t\\treturn title;\\n\\t} else {\\n\\t\\treturn utils.makePrettylink(this.parser, title);\\n\\t}\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/settings.js\":{\"title\":\"$:/plugins/flibbles/relink/js/settings.js\",\"text\":\"/*\\\\\\nmodule-type: library\\n\\nThis handles the fetching and distribution of relink settings.\\n\\n\\\\*/\\n\\nvar utils = require('./utils');\\n\\n///// Legacy. You used to be able to access the type from utils.\\nexports.getType = utils.getType;\\n/////\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/settings/attributes.js\":{\"title\":\"$:/plugins/flibbles/relink/js/settings/attributes.js\",\"text\":\"/*\\\\\\n\\nFactory method for creating the attributes whitelist cache.\\n\\n\\\\*/\\n\\nvar utils = require('../utils');\\n\\nexports.name = \\\"attributes\\\";\\n\\nexports.generate = function(attributes, tiddler, key) {\\n\\tvar data = utils.getType(tiddler.fields.text.trim());\\n\\tif (data) {\\n\\t\\tdata.source = tiddler.fields.title;\\n\\t\\t// Secret feature. You can access a config tiddler's\\n\\t\\t// fields from inside the fieldtype handler. Cool\\n\\t\\t// tricks can be done with this.\\n\\t\\tdata.fields = tiddler.fields;\\n\\t\\tvar elem = root(key);\\n\\t\\tvar attr = key.substr(elem.length+1);\\n\\t\\tattributes[elem] = attributes[elem] || Object.create(null);\\n\\t\\tattributes[elem][attr] = data;\\n\\t}\\n};\\n\\n/* Returns first bit of a path. path/to/tiddler -> path\\n */\\nfunction root(string) {\\n\\tvar index = string.indexOf('/');\\n\\tif (index >= 0) {\\n\\t\\treturn string.substr(0, index);\\n\\t}\\n};\\n\\n\",\"module-type\":\"relinksetting\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/settings/fields.js\":{\"title\":\"$:/plugins/flibbles/relink/js/settings/fields.js\",\"text\":\"/*\\\\\\n\\nFactory method for creating the fields whitelist cache.\\n\\n\\\\*/\\n\\nvar utils = require('../utils');\\n\\nexports.name = \\\"fields\\\";\\n\\nexports.generate = function(fields, tiddler, name) {\\n\\tvar data = utils.getType(tiddler.fields.text.trim());\\n\\tif (data) {\\n\\t\\tdata.source = tiddler.fields.title;\\n\\t\\t// Secret feature. You can access a config tiddler's\\n\\t\\t// fields from inside the fieldtype handler. Cool\\n\\t\\t// tricks can be done with this.\\n\\t\\tdata.fields = tiddler.fields;\\n\\t\\tfields[name] = data;\\n\\t}\\n};\\n\",\"module-type\":\"relinksetting\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/settings/fieldwidgets.js\":{\"title\":\"$:/plugins/flibbles/relink/js/settings/fieldwidgets.js\",\"text\":\"/*\\\\\\n\\nFactory method for creating the fieldattributes regexp cache.\\n\\n\\\\*/\\n\\nexports.name = \\\"fieldattributes\\\";\\n\\nexports.generate = function(fieldattributes, tiddler, key) {\\n\\tfieldattributes[key] = new RegExp(tiddler.fields.text.trim());\\n};\\n\",\"module-type\":\"relinksetting\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/settings/macros.js\":{\"title\":\"$:/plugins/flibbles/relink/js/settings/macros.js\",\"text\":\"/*\\\\\\n\\nFactory method for creating the macros whitelist cache.\\n\\n\\\\*/\\n\\nvar utils = require('../utils');\\n\\nexports.name = \\\"macros\\\";\\n\\nexports.generate = function(macros, tiddler, key) {\\n\\tvar data = utils.getType(tiddler.fields.text.trim());\\n\\tif (data) {\\n\\t\\tdata.source = tiddler.fields.title;\\n\\t\\t// Secret feature. You can access a config tiddler's\\n\\t\\t// fields from inside the fieldtype handler. Cool\\n\\t\\t// tricks can be done with this.\\n\\t\\tdata.fields = tiddler.fields;\\n\\t\\t// We take the last index, not the first, because macro\\n\\t\\t// parameters can't have slashes, but macroNames can.\\n\\t\\tvar name = dir(key);\\n\\t\\tvar arg = key.substr(name.length+1);\\n\\t\\tmacros[name] = macros[name] || Object.create(null);\\n\\t\\tmacros[name][arg] = data;\\n\\t}\\n};\\n\\n/* Returns all but the last bit of a path. path/to/tiddler -> path/to\\n */\\nfunction dir(string) {\\n\\tvar index = string.lastIndexOf('/');\\n\\tif (index >= 0) {\\n\\t\\treturn string.substr(0, index);\\n\\t}\\n}\\n\\n\",\"module-type\":\"relinksetting\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/settings/operators.js\":{\"title\":\"$:/plugins/flibbles/relink/js/settings/operators.js\",\"text\":\"/*\\\\\\n\\nFactory method for creating the operators whitelist cache.\\n\\n\\\\*/\\n\\nvar utils = require('../utils');\\n\\nexports.name = \\\"operators\\\";\\n\\nexports.generate = function(operators, tiddler, key) {\\n\\tvar data = utils.getType(tiddler.fields.text.trim());\\n\\tif (data) {\\n\\t\\tdata.source = tiddler.fields.title;\\n\\t\\t// Secret feature. You can access a config tiddler's\\n\\t\\t// fields from inside the fieldtype handler. Cool\\n\\t\\t// tricks can be done with this.\\n\\t\\tdata.fields = tiddler.fields;\\n\\t\\tvar pair = key.split('/');\\n\\t\\tvar name = pair[0];\\n\\t\\tdata.key = key;\\n\\t\\toperators[name] = operators[name] || Object.create(null);\\n\\t\\toperators[name][pair[1] || 1] = data;\\n\\t}\\n};\\n\",\"module-type\":\"relinksetting\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/utils.js\":{\"title\":\"$:/plugins/flibbles/relink/js/utils.js\",\"text\":\"/*\\\\\\nmodule-type: library\\n\\nUtility methods for relink.\\n\\n\\\\*/\\n\\nvar macroFilter = \\\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\\\";\\n\\n/**This works nearly identically to $tw.modules.getModulesByTypeAsHashmap\\n * except that this also takes care of migrating V1 relink modules.\\n */\\nexports.getModulesByTypeAsHashmap = function(moduleType, nameField) {\\n\\tvar results = Object.create(null);\\n\\t$tw.modules.forEachModuleOfType(moduleType, function(title, module) {\\n\\t\\tvar key = module[nameField];\\n\\t\\tif (key !== undefined) {\\n\\t\\t\\tresults[key] = module;\\n\\t\\t} else {\\n\\t\\t\\tfor (var entry in module) {\\n\\t\\t\\t\\tresults[entry] = {\\n\\t\\t\\t\\t\\trelink: module[entry],\\n\\t\\t\\t\\t\\treport: function() {}};\\n\\t\\t\\t\\tresults[entry][nameField] = entry;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\nexports.getTiddlerRelinkReferences = function(wiki, title, context) {\\n\\tvar tiddler = wiki.getTiddler(title),\\n\\t\\treferences = Object.create(null),\\n\\t\\toptions = {settings: context, wiki: wiki};\\n\\tif (tiddler) {\\n\\t\\ttry {\\n\\t\\t\\tfor (var relinker in getRelinkOperators()) {\\n\\t\\t\\t\\tgetRelinkOperators()[relinker].report(tiddler, function(title, blurb) {\\n\\t\\t\\t\\t\\treferences[title] = references[title] || [];\\n\\t\\t\\t\\t\\treferences[title].push(blurb || '');\\n\\t\\t\\t\\t}, options);\\n\\t\\t\\t}\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (e.message) {\\n\\t\\t\\t\\te.message = e.message + \\\"\\\\nWhen reporting '\\\" + title + \\\"' Relink references\\\";\\n\\t\\t\\t}\\n\\t\\t\\tthrow e;\\n\\t\\t}\\n\\t}\\n\\treturn references;\\n};\\n\\n/** Returns a pair like this,\\n * { title: {field: entry, ... }, ... }\\n */\\nexports.getRelinkResults = function(wiki, fromTitle, toTitle, context, tiddlerList, options) {\\n\\toptions = options || {};\\n\\toptions.wiki = options.wiki || wiki;\\n\\tfromTitle = (fromTitle || \\\"\\\").trim();\\n\\ttoTitle = (toTitle || \\\"\\\").trim();\\n\\tvar changeList = Object.create(null);\\n\\tif(fromTitle && toTitle !== undefined) {\\n\\t\\tif (tiddlerList === undefined) {\\n\\t\\t\\ttiddlerList = wiki.getRelinkableTitles();\\n\\t\\t}\\n\\t\\tfor (var i = 0; i \u003C tiddlerList.length; i++) {\\n\\t\\t\\tvar title = tiddlerList[i];\\n\\t\\t\\tvar tiddler = wiki.getTiddler(title);\\n\\t\\t\\tif(tiddler) {\\n\\t\\t\\t\\ttry {\\n\\t\\t\\t\\t\\tvar entries = Object.create(null),\\n\\t\\t\\t\\t\\t\\toperators = getRelinkOperators();\\n\\t\\t\\t\\t\\toptions.settings = new Contexts.tiddler(wiki, context, title);\\n\\t\\t\\t\\t\\tfor (var operation in operators) {\\n\\t\\t\\t\\t\\t\\toperators[operation].relink(tiddler, fromTitle, toTitle, entries, options);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tfor (var field in entries) {\\n\\t\\t\\t\\t\\t\\t// So long as there is one key,\\n\\t\\t\\t\\t\\t\\t// add it to the change list.\\n\\t\\t\\t\\t\\t\\tif (tiddler.fields[\\\"plugin-type\\\"]) {\\n\\t\\t\\t\\t\\t\\t\\t// We never change plugins, even if they have links\\n\\t\\t\\t\\t\\t\\t\\tchangeList[title] = {};\\n\\t\\t\\t\\t\\t\\t\\tchangeList[title][field] = {impossible: true};\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\tchangeList[title] = entries;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t} catch (e) {\\n\\t\\t\\t\\t\\t// Should we test for instanceof Error instead?: yes\\n\\t\\t\\t\\t\\t// Does that work in the testing environment?: no\\n\\t\\t\\t\\t\\tif (e.message) {\\n\\t\\t\\t\\t\\t\\te.message = e.message + \\\"\\\\nWhen relinking '\\\" + title + \\\"'\\\";\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tthrow e;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn changeList;\\n};\\n\\nvar Contexts = $tw.modules.applyMethods('relinkcontext');\\n\\nexports.getContext = function(name) {\\n\\treturn Contexts[name];\\n};\\n\\nexports.getWikiContext = function(wiki) {\\n\\t// This gives a fresh context every time. It is up to the indexer or\\n\\t// the cache to preserve those contexts for as long as needed.\\n\\tvar whitelist = new Contexts.whitelist(wiki);\\n\\treturn new Contexts.import(wiki, whitelist, macroFilter);\\n};\\n\\n/** Returns the Relink indexer, or a dummy object which pretends to be one.\\n */\\nexports.getIndexer = function(wiki) {\\n\\tif (!wiki._relink_indexer) {\\n\\t\\twiki._relink_indexer = (wiki.getIndexer && wiki.getIndexer(\\\"RelinkIndexer\\\")) || new (require('$:/plugins/flibbles/relink/js/utils/backupIndexer.js'))(wiki);\\n\\t}\\n\\treturn wiki._relink_indexer;\\n};\\n\\n/**Relinking supports a cache that persists throughout a whole relink op.\\n * This is because the Tiddlywiki caches may get wiped multiple times\\n * throughout the course of a relink.\\n */\\nexports.getCacheForRun = function(options, cacheName, initializer) {\\n\\toptions.cache = options.cache || Object.create(null);\\n\\tif (!$tw.utils.hop(options.cache, cacheName)) {\\n\\t\\toptions.cache[cacheName] = initializer();\\n\\t}\\n\\treturn options.cache[cacheName];\\n};\\n\\n/**Returns a specific relinker.\\n * This is useful for wikitext rules which need to parse a filter or a list\\n */\\nexports.getType = function(name) {\\n\\tvar Handler = getFieldTypes()[name];\\n\\treturn Handler ? new Handler() : undefined;\\n};\\n\\nexports.getTypes = function() {\\n\\t// We don't return fieldTypes, because we don't want it modified,\\n\\t// and we need to filter out legacy names.\\n\\tvar rtn = Object.create(null);\\n\\tfor (var type in getFieldTypes()) {\\n\\t\\tvar typeObject = getFieldTypes()[type];\\n\\t\\trtn[typeObject.typeName] = typeObject;\\n\\t}\\n\\treturn rtn;\\n};\\n\\nexports.getDefaultType = function(wiki) {\\n\\tvar tiddler = wiki.getTiddler(\\\"$:/config/flibbles/relink/settings/default-type\\\");\\n\\tvar defaultType = tiddler && tiddler.fields.text;\\n\\t// make sure the default actually exists, otherwise default\\n\\treturn fieldTypes[defaultType] ? defaultType : \\\"title\\\";\\n};\\n\\nexports.touchModifyField = function(wiki) {\\n\\tvar tiddler = wiki.getTiddler(\\\"$:/config/flibbles/relink/touch-modify\\\");\\n\\treturn tiddler && tiddler.fields.text.trim() === \\\"yes\\\";\\n};\\n\\n/**Given some text, and a param or attribute within that text, this returns\\n * what type of quotation that attribute is using.\\n *\\n * param: An object in the form {end:, ...}\\n */\\nexports.determineQuote = function(text, param) {\\n\\tvar pos = param.end-1;\\n\\tif (text[pos] === \\\"'\\\") {\\n\\t\\treturn \\\"'\\\";\\n\\t}\\n\\tif (text[pos] === '\\\"') {\\n\\t\\tif (text.substr(pos-2, 3) === '\\\"\\\"\\\"') {\\n\\t\\t\\treturn '\\\"\\\"\\\"';\\n\\t\\t} else {\\n\\t\\t\\treturn '\\\"';\\n\\t\\t}\\n\\t}\\n\\tif (text.substr(pos-1,2) === ']]' && text.substr((pos-param.value.length)-3, 2) === '[[') {\\n\\t\\treturn \\\"[[\\\";\\n\\t}\\n\\treturn '';\\n};\\n\\nvar fieldTypes;\\n\\nfunction getFieldTypes() {\\n\\tif (!fieldTypes) {\\n\\t\\tfieldTypes = Object.create(null);\\n\\t\\t$tw.modules.forEachModuleOfType(\\\"relinkfieldtype\\\", function(title, exports) {\\n\\t\\t\\tfunction NewType() {};\\n\\t\\t\\tNewType.prototype = exports;\\n\\t\\t\\tNewType.typeName = exports.name;\\n\\t\\t\\tfieldTypes[exports.name] = NewType;\\n\\t\\t\\t// For legacy, if the NewType doesn't have a report method, we add one\\n\\t\\t\\tif (!exports.report) {\\n\\t\\t\\t\\texports.report = function() {};\\n\\t\\t\\t}\\n\\t\\t\\t// Also for legacy, some of the field types can go by other names\\n\\t\\t\\tif (exports.aliases) {\\n\\t\\t\\t\\t$tw.utils.each(exports.aliases, function(alias) {\\n\\t\\t\\t\\t\\tfieldTypes[alias] = NewType;\\n\\t\\t\\t\\t});\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn fieldTypes;\\n}\\n\\nvar relinkOperators;\\n\\nfunction getRelinkOperators() {\\n\\tif (!relinkOperators) {\\n\\t\\trelinkOperators = exports.getModulesByTypeAsHashmap('relinkoperator', 'name');\\n\\t}\\n\\treturn relinkOperators;\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/utils/backupIndexer.js\":{\"title\":\"$:/plugins/flibbles/relink/js/utils/backupIndexer.js\",\"text\":\"/*\\\\\\nmodule-type: library\\n\\nThis is a backup indexer Relink uses if the real one is disabled, or we're\\n\u003CV5.1.23. It's not nearly as good, but it caches some.\\n\\n\\\\*/\\n\\n\\\"use strict\\\";\\n\\nvar utils = require(\\\"$:/plugins/flibbles/relink/js/utils.js\\\");\\nvar TiddlerContext = utils.getContext('tiddler');\\n\\n// This is the indexer we use if the current wiki doesn't support indexers.\\nfunction BackupIndexer(wiki) {\\n\\tthis.wiki = wiki;\\n};\\n\\nmodule.exports = BackupIndexer;\\n\\nBackupIndexer.prototype.lookup = function(title) {\\n\\treturn getCache(this.wiki).lookup[title];\\n};\\n\\nBackupIndexer.prototype.reverseLookup = function(title) {\\n\\tvar index = getCache(this.wiki);\\n\\tif (!index.reverse[title]) {\\n\\t\\tvar record = Object.create(null);\\n\\t\\tfor (var other in index.lookup) {\\n\\t\\t\\tif (index.lookup[other][title]) {\\n\\t\\t\\t\\trecord[other] = index.lookup[other][title];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tindex.reverse[title] = record;\\n\\t}\\n\\treturn index.reverse[title];\\n};\\n\\n/* The backup indexer doesn't bother caching relink reports. It would always\\n * be called after a draft tiddler had changed, which would defeat the point.\\n */\\nBackupIndexer.prototype.relinkLookup = function(fromTitle, toTitle, options) {\\n\\tvar cache = getCache(this.wiki);\\n\\tif (cache.lastRelinkFrom === fromTitle && cache.lastRelinkTo === toTitle) {\\n\\t\\toptions.cache = cache.lastRelinkCache;\\n\\t\\treturn cache.lastRelink;\\n\\t}\\n\\tcache.lastRelink = utils.getRelinkResults(this.wiki, fromTitle, toTitle, cache.context, undefined, options);\\n\\tcache.lastRelinkFrom = fromTitle;\\n\\tcache.lastRelinkTo = toTitle;\\n\\tcache.lastRelinkCache = options.cache;\\n\\treturn cache.lastRelink;\\n};\\n\\nBackupIndexer.prototype.orphans = function() {\\n\\tvar index = getCache(this.wiki).lookup;\\n\\tvar results = [];\\n\\tfor (var title in index) {\\n\\t\\tvar found = false;\\n\\t\\tfor (var anything in this.reverseLookup(title)) {\\n\\t\\t\\tfound = true;\\n\\t\\t\\tbreak;\\n\\t\\t}\\n\\t\\tif (!found) {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t}\\n\\treturn results;\\n};\\n\\nfunction getCache(wiki) {\\n\\treturn wiki.getGlobalCache('relink', function() {\\n\\t\\tvar tiddlerList = wiki.getRelinkableTitles();\\n\\t\\tvar index = Object.create(null);\\n\\t\\tvar wikiContext = utils.getWikiContext(wiki);\\n\\t\\tfor (var i = 0; i \u003C tiddlerList.length; i++) {\\n\\t\\t\\tvar title = tiddlerList[i];\\n\\t\\t\\tvar tiddler = wiki.getTiddler(title);\\n\\t\\t\\tif (tiddler && !tiddler.fields[\\\"plugin-type\\\"]) {\\n\\t\\t\\t\\tvar context = new TiddlerContext(wiki, wikiContext, title);\\n\\t\\t\\t\\tindex[title] = utils.getTiddlerRelinkReferences(wiki, title, context);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn {\\n\\t\\t\\tlookup: index,\\n\\t\\t\\treverse: Object.create(null),\\n\\t\\t\\tcontext: wikiContext};\\n\\t});\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/utils/entry.js\":{\"title\":\"$:/plugins/flibbles/relink/js/utils/entry.js\",\"text\":\"/*\\\\\\n\\nEntries are deprecated. Don't use them. These classes are here just so that\\nany 3rd party modules built for Relink V1 don't break.\\n\\nJust return an object like, {output: \\\"string\\\", impossible: true|undefined}\\n\\n\\\\*/\\n\\nfunction EntryNode() {\\n\\tthis.children = [];\\n};\\n\\nmodule.exports = EntryNode;\\n\\n/** PURE VIRTUAL\\n * EntryNode.prototype.report = function() -> [\\\"string\\\", ...]\\n */\\n\\nEntryNode.newType = function() {\\n\\treturn EntryNode;\\n};\\n\\nEntryNode.prototype.add = function(entry) {\\n\\tthis.children.push(entry);\\n};\\n\\nfunction EntryCollection() {\\n\\tthis.children = Object.create(null);\\n\\tthis.types = Object.create(null);\\n};\\n\\nEntryNode.newCollection = function(name) {\\n\\treturn EntryCollection;\\n};\\n\\n// Again. I reiterate. Don't use this. All this is just legacy support.\\nObject.defineProperty(EntryCollection, 'impossible', {\\n\\tget: function() {\\n\\t\\tvar imp = this._impossible;\\n\\t\\tthis.eachChild(function(child) { imp = imp || child.impossible; });\\n\\t\\treturn imp;\\n\\t},\\n\\tset: function(impossible) {\\n\\t\\tthis._impossible = true;\\n\\t}\\n});\\n\\nEntryCollection.prototype.eachChild = function(method) {\\n\\tfor (var child in this.children) {\\n\\t\\tmethod(this.children[child]);\\n\\t}\\n};\\n\\nEntryCollection.prototype.addChild = function(child, name, type) {\\n\\tthis.children[name] = child;\\n\\tthis.types[name] = type;\\n};\\n\\nEntryCollection.prototype.hasChildren = function() {\\n\\treturn Object.keys(this.children).length > 0;\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/utils/macrocall.js\":{\"title\":\"$:/plugins/flibbles/relink/js/utils/macrocall.js\",\"text\":\"/*\\\\\\n\\nMethods for reporting and relinking macros. Behaves much like a fieldtype, except that it's not.\\n\\n\\\\*/\\n\\nvar utils = require('$:/plugins/flibbles/relink/js/utils.js');\\nvar Rebuilder = require(\\\"$:/plugins/flibbles/relink/js/utils/rebuilder\\\");\\n\\n// Error thrown when a macro's definition is needed, but can't be found.\\nfunction CannotFindMacroDef() {};\\nCannotFindMacroDef.prototype.impossible = true;\\nCannotFindMacroDef.prototype.name = \\\"macroparam\\\";\\n// Failed relinks due to missing definitions aren't reported for now.\\n// I may want to do something special later on.\\nCannotFindMacroDef.prototype.report = function() { return []; };\\n\\n/** As in, report a macrocall invocation that is an html attribute.\\n * macro: must be a macro object.*/\\nexports.report = function(context, macro, callback, options) {\\n\\tvar managedMacro = context.getMacro(macro.name);\\n\\tif (!managedMacro) {\\n\\t\\t// We don't manage this macro. Bye.\\n\\t\\treturn undefined;\\n\\t}\\n\\tfor (var managedArg in managedMacro) {\\n\\t\\tvar index;\\n\\t\\ttry {\\n\\t\\t\\tindex = getParamIndexWithinMacrocall(context, macro.name, managedArg, macro.params, options);\\n\\t\\t} catch (e) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tif (index \u003C 0) {\\n\\t\\t\\t// The argument was not supplied. Move on to next.\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tvar param = macro.params[index];\\n\\t\\tvar handler = managedMacro[managedArg];\\n\\t\\tvar nestedOptions = Object.create(options);\\n\\t\\tnestedOptions.settings = context;\\n\\t\\tvar entry = handler.report(param.value, function(title, blurb) {\\n\\t\\t\\tvar rtn = managedArg;\\n\\t\\t\\tif (blurb) {\\n\\t\\t\\t\\trtn += ': \\\"' + blurb + '\\\"';\\n\\t\\t\\t}\\n\\t\\t\\tcallback(title, macro.name + ' ' + rtn);\\n\\t\\t}, nestedOptions);\\n\\t}\\n};\\n\\n/**Processes the given macro,\\n * macro: {name:, params:, start:, end:}\\n * each parameters: {name:, end:, value:}\\n * Macro invocation returned is the same, but relinked, and may have new keys:\\n * parameters: {type: macro, start:, newValue: (quoted replacement value)}\\n * Output of the returned entry isn't a string, but a macro object. It needs\\n * to be converted.\\n */\\nexports.relink = function(context, macro, text, fromTitle, toTitle, mayBeWidget, options) {\\n\\tvar managedMacro = context.getMacro(macro.name);\\n\\tvar modified = false;\\n\\tif (!managedMacro) {\\n\\t\\t// We don't manage this macro. Bye.\\n\\t\\treturn undefined;\\n\\t}\\n\\tvar outMacro = $tw.utils.extend({}, macro);\\n\\tvar macroEntry = {};\\n\\toutMacro.params = macro.params.slice();\\n\\tfor (var managedArg in managedMacro) {\\n\\t\\tvar index;\\n\\t\\ttry {\\n\\t\\t\\tindex = getParamIndexWithinMacrocall(context, macro.name, managedArg, macro.params, options);\\n\\t\\t} catch (e) {\\n\\t\\t\\tif (e instanceof CannotFindMacroDef) {\\n\\t\\t\\t\\tmacroEntry.impossible = true;\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (index \u003C 0) {\\n\\t\\t\\t// this arg either was not supplied, or we can't find\\n\\t\\t\\t// the definition, so we can't tie it to an anonymous\\n\\t\\t\\t// argument. Either way, move on to the next.\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tvar param = macro.params[index];\\n\\t\\tvar handler = managedMacro[managedArg];\\n\\t\\tvar nestedOptions = Object.create(options);\\n\\t\\tnestedOptions.settings = context;\\n\\t\\tvar entry = handler.relink(param.value, fromTitle, toTitle, nestedOptions);\\n\\t\\tif (entry === undefined) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\t// Macro parameters can only be string parameters, not\\n\\t\\t// indirect, or macro, or filtered\\n\\t\\tif (entry.impossible) {\\n\\t\\t\\tmacroEntry.impossible = true;\\n\\t\\t}\\n\\t\\tif (!entry.output) {\\n\\t\\t\\tcontinue;\\n\\t\\t}\\n\\t\\tvar quote = utils.determineQuote(text, param);\\n\\t\\tvar quoted = wrapParameterValue(entry.output, quote);\\n\\t\\tvar newParam = $tw.utils.extend({}, param);\\n\\t\\tif (quoted === undefined) {\\n\\t\\t\\tif (!mayBeWidget || !options.placeholder) {\\n\\t\\t\\t\\tmacroEntry.impossible = true;\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\t\\t\\tvar ph = options.placeholder.getPlaceholderFor(entry.output,handler.name);\\n\\t\\t\\tnewParam.newValue = \\\"\u003C\u003C\\\"+ph+\\\">>\\\";\\n\\t\\t\\tnewParam.type = \\\"macro\\\";\\n\\t\\t} else {\\n\\t\\t\\tnewParam.start = newParam.end - (newParam.value.length + (quote.length*2));\\n\\t\\t\\tnewParam.value = entry.output;\\n\\t\\t\\tnewParam.newValue = quoted;\\n\\t\\t}\\n\\t\\toutMacro.params[index] = newParam;\\n\\t\\tmodified = true;\\n\\t}\\n\\tif (modified || macroEntry.impossible) {\\n\\t\\tif (modified) {\\n\\t\\t\\tmacroEntry.output = outMacro;\\n\\t\\t}\\n\\t\\treturn macroEntry;\\n\\t}\\n\\treturn undefined;\\n};\\n\\n/**Converts the macro object into a string, includes the \u003C\u003C..>>.\\n * The text is the old text the macro was formed from. It's used to preserve\\n * whitespace.\\n */\\nexports.reassemble = function(macro, text, options) {\\n\\tvar builder = new Rebuilder(text, macro.start);\\n\\tfor (var i = 0; i \u003C macro.params.length; i++) {\\n\\t\\tvar param = macro.params[i];\\n\\t\\tif (param.newValue) {\\n\\t\\t\\tbuilder.add(param.newValue, param.start, param.end);\\n\\t\\t}\\n\\t}\\n\\treturn builder.results(macro.end);\\n};\\n\\n\\n/** Returns -1 if param definitely isn't in macrocall.\\n */\\nfunction getParamIndexWithinMacrocall(context, macroName, param, params, options) {\\n\\tvar index, i, anonsExist = false;\\n\\tfor (i = 0; i \u003C params.length; i++) {\\n\\t\\tvar name = params[i].name;\\n\\t\\tif (name === param) {\\n\\t\\t\\treturn i;\\n\\t\\t}\\n\\t\\tif (name === undefined) {\\n\\t\\t\\tanonsExist = true;\\n\\t\\t}\\n\\t}\\n\\tif (!anonsExist) {\\n\\t\\t// If no anonymous parameters are present, and we didn't find\\n\\t\\t// it among the named ones, it must not be there.\\n\\t\\treturn -1;\\n\\t}\\n\\tvar expectedIndex = indexOfParameterDef(context, macroName, param, options);\\n\\t// We've got to skip over all the named parameter instances.\\n\\tif (expectedIndex >= 0) {\\n\\t\\tvar anonI = 0;\\n\\t\\tfor (i = 0; i \u003C params.length; i++) {\\n\\t\\t\\tif (params[i].name === undefined) {\\n\\t\\t\\t\\tif (anonI === expectedIndex) {\\n\\t\\t\\t\\t\\treturn i;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tanonI++;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tvar indexOfOther = indexOfParameterDef(context, macroName, params[i].name, options);\\n\\t\\t\\t\\tif (indexOfOther \u003C expectedIndex) {\\n\\t\\t\\t\\t\\tanonI++;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn -1;\\n};\\n\\n// Looks up the definition of a macro, and figures out what the expected index\\n// is for the given parameter.\\nfunction indexOfParameterDef(context, macroName, paramName, options) {\\n\\tvar def = context.getMacroDefinition(macroName);\\n\\tif (def === undefined) {\\n\\t\\tthrow new CannotFindMacroDef();\\n\\t}\\n\\tvar params = def.params || [];\\n\\tfor (var i = 0; i \u003C params.length; i++) {\\n\\t\\tif (params[i].name === paramName) {\\n\\t\\t\\treturn i;\\n\\t\\t}\\n\\t}\\n\\treturn -1;\\n};\\n\\n// Looks up the definition of a macro, and figures out what the expected index\\n// is for the given parameter.\\nfunction indexOfParameterDef(context, macroName, paramName, options) {\\n\\tvar def = context.getMacroDefinition(macroName);\\n\\tif (def === undefined) {\\n\\t\\tthrow new CannotFindMacroDef();\\n\\t}\\n\\tvar params = def.params || [];\\n\\tfor (var i = 0; i \u003C params.length; i++) {\\n\\t\\tif (params[i].name === paramName) {\\n\\t\\t\\treturn i;\\n\\t\\t}\\n\\t}\\n\\treturn -1;\\n};\\n\\n/**Like wrapAttribute value, except for macro parameters, not attributes.\\n *\\n * These are more permissive. Allows brackets,\\n * and slashes and '\u003C' in unquoted values.\\n */\\nfunction wrapParameterValue(value, preference) {\\n\\tvar whitelist = [\\\"\\\", \\\"'\\\", '\\\"', '[[', '\\\"\\\"\\\"'];\\n\\tvar choices = {\\n\\t\\t\\\"\\\": function(v) {return !/([\\\\s>\\\"'=])/.test(v); },\\n\\t\\t\\\"'\\\": function(v) {return v.indexOf(\\\"'\\\") \u003C 0; },\\n\\t\\t'\\\"': function(v) {return v.indexOf('\\\"') \u003C 0; },\\n\\t\\t\\\"[[\\\": canBePrettyOperand,\\n\\t\\t'\\\"\\\"\\\"': function(v) {return v.indexOf('\\\"\\\"\\\"') \u003C 0 && v[v.length-1] != '\\\"';}\\n\\t};\\n\\tif (choices[preference] && choices[preference](value)) {\\n\\t\\treturn wrap(value, preference);\\n\\t}\\n\\tfor (var i = 0; i \u003C whitelist.length; i++) {\\n\\t\\tvar quote = whitelist[i];\\n\\t\\tif (choices[quote](value)) {\\n\\t\\t\\treturn wrap(value, quote);\\n\\t\\t}\\n\\t}\\n\\t// No quotes will work on this\\n\\treturn undefined;\\n};\\n\\nfunction canBePrettyOperand(value) {\\n\\treturn value.indexOf(']') \u003C 0;\\n};\\n\\n\\nfunction wrap(value, wrapper) {\\n\\tvar wrappers = {\\n\\t\\t\\\"\\\": function(v) {return v; },\\n\\t\\t\\\"'\\\": function(v) {return \\\"'\\\"+v+\\\"'\\\"; },\\n\\t\\t'\\\"': function(v) {return '\\\"'+v+'\\\"'; },\\n\\t\\t'\\\"\\\"\\\"': function(v) {return '\\\"\\\"\\\"'+v+'\\\"\\\"\\\"'; },\\n\\t\\t\\\"[[\\\": function(v) {return \\\"[[\\\"+v+\\\"]]\\\"; }\\n\\t};\\n\\tvar chosen = wrappers[wrapper];\\n\\tif (chosen) {\\n\\t\\treturn chosen(value);\\n\\t} else {\\n\\t\\treturn undefined;\\n\\t}\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/utils/placeholder.js\":{\"title\":\"$:/plugins/flibbles/relink/js/utils/placeholder.js\",\"text\":\"/*\\\\\\n\\nA method which doles out placeholders when requested, and constructs\\nthe necessary supporting pragma when requested.\\n\\n\\\\*/\\n\\nvar utils = require('../utils');\\n\\nfunction Placeholder() {\\n\\tthis.placeholders = Object.create(null);\\n\\tthis.reverseMap = {};\\n\\tthis.used = Object.create(null);\\n};\\n\\nmodule.exports = Placeholder;\\n\\nPlaceholder.prototype.getPlaceholderFor = function(value, category) {\\n\\tthis.reverseMap[category] = this.reverseMap[category] || Object.create(null);\\n\\tvar placeholder = this.reverseMap[category][value];\\n\\tif (placeholder) {\\n\\t\\treturn placeholder;\\n\\t}\\n\\tvar config = (this.parser && this.parser.context) || utils.getWikiContext(this.parser.wiki);\\n\\tvar number = 0;\\n\\tvar prefix = \\\"relink-\\\"\\n\\tif (category && category !== \\\"title\\\") {\\n\\t\\t// I don't like \\\"relink-title-1\\\". \\\"relink-1\\\" should be for\\n\\t\\t// titles. lists, and filters can have descriptors though.\\n\\t\\tprefix += category + \\\"-\\\";\\n\\t}\\n\\tdo {\\n\\t\\tnumber += 1;\\n\\t\\tplaceholder = prefix + number;\\n\\t} while (config.getMacroDefinition(placeholder) || this.used[placeholder]);\\n\\tthis.placeholders[placeholder] = value;\\n\\tthis.reverseMap[category][value] = placeholder;\\n\\tthis.used[placeholder] = true;\\n\\treturn placeholder;\\n};\\n\\n// For registering placeholders that already existed\\nPlaceholder.prototype.registerExisting = function(key, value) {\\n\\tthis.reverseMap[value] = key;\\n\\tthis.used[key] = true;\\n};\\n\\nPlaceholder.prototype.getPreamble = function() {\\n\\tvar results = [];\\n\\tvar keys = Object.keys(this.placeholders);\\n\\tif (keys.length > 0) {\\n\\t\\tkeys.sort();\\n\\t\\tfor (var i = 0; i \u003C keys.length; i++) {\\n\\t\\t\\tvar name = keys[i];\\n\\t\\t\\tvar val = this.placeholders[name];\\n\\t\\t\\tresults.push(\\\"\\\\\\\\define \\\"+name+\\\"() \\\"+val+\\\"\\\\n\\\");\\n\\t\\t}\\n\\t}\\n\\treturn results.join('');\\n};\\n\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/utils/rebuilder.js\":{\"title\":\"$:/plugins/flibbles/relink/js/utils/rebuilder.js\",\"text\":\"/*\\\\\\n\\nThis helper class aids in reconstructing an existing string with new parts.\\n\\n\\\\*/\\n\\nfunction Rebuilder(text, start) {\\n\\tthis.text = text;\\n\\tthis.index = start || 0;\\n\\tthis.pieces = [];\\n};\\n\\nmodule.exports = Rebuilder;\\n\\n/**Pieces must be added consecutively.\\n * Start and end are the indices in the old string specifying where to graft\\n * in the new piece.\\n */\\nRebuilder.prototype.add = function(value, start, end) {\\n\\tthis.pieces.push(this.text.substring(this.index, start), value);\\n\\tthis.index = end;\\n};\\n\\nRebuilder.prototype.changed = function() {\\n\\treturn this.pieces.length > 0;\\n};\\n\\nRebuilder.prototype.results = function(end) {\\n\\tif (this.changed()) {\\n\\t\\tthis.pieces.push(this.text.substring(this.index, end));\\n\\t\\treturn this.pieces.join('');\\n\\t}\\n\\treturn undefined;\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/js/wikimethods.js\":{\"title\":\"$:/plugins/flibbles/relink/js/wikimethods.js\",\"text\":\"/*\\\\\\nmodule-type: wikimethod\\n\\nIntroduces some utility methods used by Relink.\\n\\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\n\\nexports.getTiddlerRelinkReferences = function(title) {\\n\\treturn utils.getIndexer(this).lookup(title);\\n};\\n\\nexports.getTiddlerRelinkBackreferences = function(title) {\\n\\treturn utils.getIndexer(this).reverseLookup(title);\\n};\\n\\nexports.getRelinkableTitles = function() {\\n\\tvar toUpdate = \\\"$:/config/flibbles/relink/to-update\\\";\\n\\tvar wiki = this;\\n\\treturn this.getCacheForTiddler(toUpdate, \\\"relink-toUpdate\\\", function() {\\n\\t\\tvar tiddler = wiki.getTiddler(toUpdate);\\n\\t\\tif (tiddler) {\\n\\t\\t\\treturn wiki.compileFilter(tiddler.fields.text);\\n\\t\\t} else {\\n\\t\\t\\treturn wiki.allTitles;\\n\\t\\t}\\n\\t})();\\n};\\n\\nexports.getRelinkOrphans = function() {\\n\\treturn utils.getIndexer(this).orphans();\\n};\\n\",\"module-type\":\"wikimethod\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink/language/Buttons/Delete/Hint\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/Delete/Hint\",\"text\":\"delete\"},\"$:/plugins/flibbles/relink/language/Buttons/LinkToInline/Hint\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/LinkToInline/Hint\",\"text\":\"go to defining tiddler\"},\"$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Caption\",\"text\":\"add\"},\"$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Hint\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewAttribute/Hint\",\"text\":\"Specify a new widget/element attribute to be updated whenever a tiddler is renamed\"},\"$:/plugins/flibbles/relink/language/Buttons/NewField/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewField/Caption\",\"text\":\"add\"},\"$:/plugins/flibbles/relink/language/Buttons/NewField/Hint\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewField/Hint\",\"text\":\"Specify a new field to be updated whenever a tiddler is renamed\"},\"$:/plugins/flibbles/relink/language/Buttons/NewOperator/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewOperator/Caption\",\"text\":\"add\"},\"$:/plugins/flibbles/relink/language/Buttons/NewOperator/Hint\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewOperator/Hint\",\"text\":\"Specify a new filter operator to be considered whenever a tiddler is renamed\"},\"$:/plugins/flibbles/relink/language/Buttons/NewParameter/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewParameter/Caption\",\"text\":\"add\"},\"$:/plugins/flibbles/relink/language/Buttons/NewParameter/Hint\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewParameter/Hint\",\"text\":\"Specify a new macro parameter to be updated whenever a tiddler is renamed\"},\"$:/plugins/flibbles/relink/language/Error/InvalidAttributeName\":{\"title\":\"$:/plugins/flibbles/relink/language/Error/InvalidAttributeName\",\"text\":\"Illegal characters in attribute name \\\"\u003C$text text=\u003C\u003CattributeName>>/>\\\". Attributes cannot contain slashes ('/'), closing angle or square brackets ('>' or ']'), quotes or apostrophes ('\\\"' or \\\"'\\\"), equals ('='), or whitespace\"},\"$:/plugins/flibbles/relink/language/Error/InvalidElementName\":{\"title\":\"$:/plugins/flibbles/relink/language/Error/InvalidElementName\",\"text\":\"Illegal characters in element/widget name \\\"\u003C$text text=\u003C\u003CelementName>>/>\\\". Element tags can only contain letters and the characters hyphen (`-`) and dollar sign (`$`)\"},\"$:/plugins/flibbles/relink/language/Error/InvalidMacroName\":{\"title\":\"$:/plugins/flibbles/relink/language/Error/InvalidMacroName\",\"text\":\"Illegal characters in macro name \\\"\u003C$text text=\u003C\u003CmacroName>>/>\\\". Macros cannot contain whitespace\"},\"$:/plugins/flibbles/relink/language/Error/InvalidParameterName\":{\"title\":\"$:/plugins/flibbles/relink/language/Error/InvalidParameterName\",\"text\":\"Illegal characters in parameter name \\\"\u003C$text text=\u003C\u003CparameterName>>/>\\\". Parameters can only contain letters, digits, and the characters underscore (`_`) and hyphen (`-`)\"},\"$:/plugins/flibbles/relink/language/Error/RelinkFilterOperator\":{\"title\":\"$:/plugins/flibbles/relink/language/Error/RelinkFilterOperator\",\"text\":\"Filter Error: Unknown suffix for the 'relink' filter operator\"},\"$:/plugins/flibbles/relink/language/Error/ReportFailedRelinks\":{\"title\":\"$:/plugins/flibbles/relink/language/Error/ReportFailedRelinks\",\"text\":\"Relink could not update '\u003C\u003Cfrom>>' to '\u003C\u003Cto>>' inside the following tiddlers:\"},\"$:/plugins/flibbles/relink/language/Error/UnrecognizedType\":{\"title\":\"$:/plugins/flibbles/relink/language/Error/UnrecognizedType\",\"text\":\"Relink parse error: Unrecognized field type '\u003C\u003Ctype>>'\"},\"$:/plugins/flibbles/relink/language/Filters/Missing\":{\"title\":\"$:/plugins/flibbles/relink/language/Filters/Missing\",\"text\":\"//Relink// Missing tiddlers\"},\"$:/plugins/flibbles/relink/language/Filters/Orphans\":{\"title\":\"$:/plugins/flibbles/relink/language/Filters/Orphans\",\"text\":\"//Relink// Orphans tiddlers\"},\"$:/plugins/flibbles/relink/language/Help/Attributes\":{\"title\":\"$:/plugins/flibbles/relink/language/Help/Attributes\",\"text\":\"See the \u003Ca href={{{[{$:/plugins/flibbles/relink!!demo}addsuffix[#Attributes]]}}} class=\\\"tc-tiddlylink-external\\\">Attributes documentation page\u003C/a> for details.\"},\"$:/plugins/flibbles/relink/language/Help/Fields\":{\"title\":\"$:/plugins/flibbles/relink/language/Help/Fields\",\"text\":\"See the \u003Ca href={{{[{$:/plugins/flibbles/relink!!demo}addsuffix[#Fields]]}}} class=\\\"tc-tiddlylink-external\\\">Fields documentation page\u003C/a> for details.\"},\"$:/plugins/flibbles/relink/language/Help/Macros\":{\"title\":\"$:/plugins/flibbles/relink/language/Help/Macros\",\"text\":\"See the \u003Ca href={{{[{$:/plugins/flibbles/relink!!demo}addsuffix[#Macros]]}}} class=\\\"tc-tiddlylink-external\\\">Macros documentation page\u003C/a> for details.\"},\"$:/plugins/flibbles/relink/language/Help/Operators\":{\"title\":\"$:/plugins/flibbles/relink/language/Help/Operators\",\"text\":\"See the \u003Ca href={{{[{$:/plugins/flibbles/relink!!demo}addsuffix[#Operators]]}}} class=\\\"tc-tiddlylink-external\\\">Operators documentation page\u003C/a> for details.\"},\"$:/plugins/flibbles/relink/language/SideBar/Missing/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/SideBar/Missing/Caption\",\"text\":\"//Relink//\u003Cbr>Missing\"},\"$:/plugins/flibbles/relink/language/SideBar/Orphans/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/SideBar/Orphans/Caption\",\"text\":\"//Relink//\u003Cbr>Orphans\"},\"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Caption\",\"text\":\"//Relink// References\"},\"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Description\":{\"title\":\"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Description\",\"text\":\"The following tiddlers contain fields, links, macros, transclusions, or widgets referencing this one:\"},\"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Empty\":{\"title\":\"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Empty\",\"text\":\"No tiddlers contain any fields, links, macros, transclusions, or widgets referencing this one\"},\"$:/plugins/flibbles/relink/language/Warning/OldRelinkTextOperator\":{\"title\":\"$:/plugins/flibbles/relink/language/Warning/OldRelinkTextOperator\",\"text\":\"Relink cannot parse your \u003Ccode>$$$\u003C\u003Ckeyword>>\u003C/code> wikitext until you migrate your \\\"\u003C\u003Ctype>>\\\" relink module from the deprecated ''relinktextoperator'' module-type to ''relinktext''.\u003Cbr>\u003Cbr>See \u003Ca href={{{ [[Versions/2.1.0]addprefix[#]addprefix{$:/plugins/flibbles/relink!!demo}encodeuri[]] }}} class=\\\"tc-tiddlylink-external\\\">the online documentation\u003C/a> for details.\"},\"$:/plugins/flibbles/relink/language/ui/Attributes/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/ui/Attributes/Caption\",\"text\":\"Attributes\"},\"$:/plugins/flibbles/relink/language/ui/Fields/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/ui/Fields/Caption\",\"text\":\"Fields\"},\"$:/plugins/flibbles/relink/language/ui/Macros/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/ui/Macros/Caption\",\"text\":\"Macros\"},\"$:/plugins/flibbles/relink/language/ui/Operators/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/ui/Operators/Caption\",\"text\":\"Operators\"},\"$:/plugins/flibbles/relink/license\":{\"title\":\"$:/plugins/flibbles/relink/license\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\u003Ca href={{$:/plugins/flibbles/relink!!demo}} class=\\\"tc-tiddlylink-external\\\">Relink Plugin\u003C/a> Copyright (c) 2019-\u003C\u003Cnow YYYY>> Cameron Fischer\\n\\n[[BSD 3-Clause License|https://raw.githubusercontent.com/flibbles/tw5-relink/master/LICENSE]]\\n\"},\"$:/plugins/flibbles/relink/readme\":{\"title\":\"$:/plugins/flibbles/relink/readme\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"When renaming a tiddler, Relink can update the fields, filters, and widgets\\nof all other tiddlers. However, it works through whitelisting.\\n\\nIt's already configured to update tiddler titles for all core widgets, filters,\\nand fields, but the whitelists can be customized for each of this in the\\nconfiguration panel.\\n\\nSee \u003Ca href={{$:/plugins/flibbles/relink!!source}} class=\\\"tc-tiddlylink-external\\\">the tw5-relink website\u003C/a> for more details and examples.\\n\"},\"$:/plugins/flibbles/relink/ui/ListItemTemplate\":{\"title\":\"$:/plugins/flibbles/relink/ui/ListItemTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$set\\n\\tname=\\\"classes\\\"\\n\\tfilter=\\\"[\u003ClistItem>relink:impossible\u003CtoTitle>]\\\"\\n\\tvalue=\\\"tc-menu-list-item tc-relink-impossible\\\"\\n\\temptyValue=\\\"tc-menu-list-item\\\">\\n\u003Cdiv class=\u003C\u003Cclasses>>>\\n\u003C$link to=\u003C\u003ClistItem>>>\u003C$text text=\u003C\u003ClistItem>> />\u003C/$link>\\n\u003C/div>\\n\u003C/$set>\\n\"},\"$:/plugins/flibbles/relink/ui/ListItemWithBlurbTemplate\":{\"title\":\"$:/plugins/flibbles/relink/ui/ListItemWithBlurbTemplate\",\"text\":\"\u003Cdiv class=\\\"tc-menu-list-item\\\">\u003C$link />\u003C/div>\\n\u003C$list variable=blurb filter=\\\"[\u003CcurrentTiddler>relink:report\u003CmissingTiddler>]\\\">\u003Cdiv class=\\\"tc-relink-menu-missing-blurb\\\">\u003C$text text=\u003C\u003Cblurb>> />\u003C/div>\\n\"},\"$:/plugins/flibbles/relink/ui/MissingTemplate\":{\"title\":\"$:/plugins/flibbles/relink/ui/MissingTemplate\",\"text\":\"\\\\whitespace trim\\n\u003C$set name=\\\"missingTiddler\\\" value=\u003C\u003CcurrentTiddler>> >\\n\u003Cdiv class=\\\"tc-tiddler-missing\\\">\\n\u003C$button popup=\u003C\u003Cqualify \\\"$:/state/relink/popup/missing\\\">> class=\\\"tc-btn-invisible tc-missing-tiddler-label\\\">\\n\u003C$view field=\\\"title\\\" format=\\\"text\\\" />\\n\u003C/$button>\\n\u003C$reveal state=\u003C\u003Cqualify \\\"$:/state/relink/popup/missing\\\">> type=\\\"popup\\\" position=\\\"below\\\" animate=\\\"yes\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003Chr>\\n\u003C$list filter=\\\"[all[current]relink:backreferences[]sort[title]]\\\" template=\\\"$:/plugins/flibbles/relink/ui/ListItemWithBlurbTemplate\\\"/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/div>\\n\u003C/$set>\\n\"},\"$:/plugins/flibbles/relink/ui/MoreSideBar/Missing\":{\"title\":\"$:/plugins/flibbles/relink/ui/MoreSideBar/Missing\",\"caption\":\"{{$:/plugins/flibbles/relink/language/SideBar/Missing/Caption}}\",\"tags\":\"$:/tags/MoreSideBar\",\"text\":\"\u003C$list filter={{$:/plugins/flibbles/relink/Filters/Missing!!filter}} template=\\\"$:/plugins/flibbles/relink/ui/MissingTemplate\\\" />\\n\"},\"$:/plugins/flibbles/relink/ui/MoreSideBar/Orphans\":{\"title\":\"$:/plugins/flibbles/relink/ui/MoreSideBar/Orphans\",\"caption\":\"{{$:/plugins/flibbles/relink/language/SideBar/Orphans/Caption}}\",\"tags\":\"$:/tags/MoreSideBar\",\"text\":\"\u003C$list filter={{$:/plugins/flibbles/relink/Filters/Orphans!!filter}} template=\\\"$:/core/ui/ListItemTemplate\\\" />\\n\"},\"$:/plugins/flibbles/relink/ui/TiddlerInfo/References\":{\"title\":\"$:/plugins/flibbles/relink/ui/TiddlerInfo/References\",\"caption\":\"{{$:/plugins/flibbles/relink/language/TiddlerInfo/References/Caption}}\",\"tags\":\"$:/tags/TiddlerInfo\",\"text\":\"\\\\define lingo-base() $:/plugins/flibbles/relink/language/TiddlerInfo/\\n\\\\define filter() [all[current]relink:backreferences[]!title[$:/StoryList]!prefix[$:/temp/]sort[title]]\\n\\\\whitespace trim\\n\u003C$list filter=\\\"[subfilter\u003Cfilter>first[]]\\\">\\n\u003C\u003Clingo References/Description>>\\n\u003C/$list>\\n\u003Ctable class=\\\"tc-relink-references-table\\\">\\n\u003Ctbody>\\n\u003C$list filter=\u003C\u003Cfilter>> emptyMessage=\u003C\u003Clingo References/Empty>> variable=\\\"listItem\\\" template=\\\"$:/plugins/flibbles/relink/ui/TiddlerInfo/ReferencesTemplate\\\" />\\n\u003C/tbody>\\n\u003C/table>\\n\"},\"$:/plugins/flibbles/relink/ui/TiddlerInfo/ReferencesTemplate\":{\"title\":\"$:/plugins/flibbles/relink/ui/TiddlerInfo/ReferencesTemplate\",\"text\":\"\\\\whitespace trim\\n\u003Ctr class=\\\"tc-relink-references\\\">\\n\u003Ctd class=\\\"tc-relink-references-title\\\">\\n\u003C$link to=\u003C\u003ClistItem>>/>\\n\u003C/td>\\n\u003Ctd class=\\\"tc-relink-references-report\\\">\\n\u003C$list filter=\\\"[\u003ClistItem>relink:report\u003CcurrentTiddler>]\\\">\\n\\n\u003C$text text=\u003C\u003CcurrentTiddler>> />\\n\u003C/$list>\\n\\n\u003C/td>\\n\u003C/tr>\\n\"},\"$:/plugins/flibbles/relink/ui/components/button-delete\":{\"title\":\"$:/plugins/flibbles/relink/ui/components/button-delete\",\"text\":\"\\\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\\n\\\\define prefix() $:/config/flibbles/relink/\\n\\\\whitespace trim\\n\\n\u003C$list\\n\\tfilter=\\\"[all[current]prefix\u003Cprefix>]\\\"\\n\\temptyMessage=\\\"\u003C$link>\u003C$button class='tc-btn-invisible' tooltip={{$:/plugins/flibbles/relink/language/Buttons/LinkToInline/Hint}}>{{$:/core/images/link}}\u003C/$button>\u003C/$link>\\\">\\n\u003C$button class=\\\"tc-btn-invisible\\\" tooltip={{$:/plugins/flibbles/relink/language/Buttons/Delete/Hint}}>\u003C$list filter=\\\"[all[current]is[tiddler]]\\\">\\n\u003C$action-deletetiddler $tiddler=\u003C\u003CcurrentTiddler>> />\\n\u003C/$list>\u003C$list filter=\\\"[all[current]is[shadow]]\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003CtiddlerName>> text=\\\"\\\" />\\n\u003C/$list>\\n{{$:/core/images/delete-button}}\\n\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/plugins/flibbles/relink/ui/components/select-fieldtype\":{\"title\":\"$:/plugins/flibbles/relink/ui/components/select-fieldtype\",\"text\":\"\\\\define prefix() $:/config/flibbles/relink/\\n\\\\whitespace trim\\n\\n\u003C$vars type={{{ [\u003Csignature>relink:type[]] }}} >\\n\u003C$list filter=\\\"[all[current]prefix\u003Cprefix>]\\\" >\\n\u003C$select tiddler=\u003C\u003CcurrentTiddler>> >\\n\u003C$list variable=\\\"option\\\" filter=\\\"[relink:types[]]\\\">\\n\u003Coption>\u003C$text text=\u003C\u003Coption>> />\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\u003C/$list>\u003C$list filter=\\\"[all[current]!prefix\u003Cprefix>]\\\">\\n\u003C$text text=\u003C\u003Ctype>> />\\n\u003C/$list>\\n\u003C/$vars>\\n\"},\"$:/plugins/flibbles/relink/ui/components/tables\":{\"title\":\"$:/plugins/flibbles/relink/ui/components/tables\",\"text\":\"\\\\define .make-table(title, plugin, default-table-state:yes)\\n\\\\whitespace trim\\n\\n\u003C$list variable=\\\"render\\\" filter=\\\"[relink:signatures\u003C__plugin__>prefix\u003C__category__>first[]]\\\">\\n\u003C$set name=\\\"table-state\\\" value=\u003C\u003Cqualify \\\"\\\"\\\"$:/state/flibbles/relink/tables/$title$\\\"\\\"\\\">>>\\n\u003Ctr>\u003Cth class=\\\"tc-relink-header-plugin\\\" colspan=\u003C\u003Ccolumn-count>> >\\n\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Ctable-state>> text=\\\"yes\\\" default=\\\"\\\"\\\"$default-table-state$\\\"\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003Ctable-state>> setTo=\\\"yes\\\">\\n{{$:/core/images/right-arrow}} $title$\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" state=\u003C\u003Ctable-state>> text=\\\"yes\\\" default=\\\"\\\"\\\"$default-table-state$\\\"\\\"\\\">\\n\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003Ctable-state>> setTo=\\\"no\\\">\\n{{$:/core/images/down-arrow}} $title$\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/th>\u003C/tr>\\n\u003C$list\\n\\tvariable=\\\"signature\\\"\\n\\tfilter=\\\"[relink:signatures\u003C__plugin__>prefix\u003C__category__>sort[]]\\\">\\n\u003C$vars key={{{ [\u003Csignature>removeprefix\u003C__category__>removeprefix[/]] }}} >\\n\u003C$tiddler tiddler={{{[\u003Csignature>relink:source[]]}}} >\\n\u003C$reveal tag=\\\"tr\\\" type=\\\"match\\\" state=\u003C\u003Ctable-state>> text=\\\"yes\\\" default=\\\"\\\"\\\"$default-table-state$\\\"\\\"\\\">\\n\u003C$macrocall $name=\u003C\u003C__list-row-macro__>> signature=\u003C\u003Csignature>> />\\n\u003Ctd class=\\\"tc-relink-column-type\\\">{{||$:/plugins/flibbles/relink/ui/components/select-fieldtype}}\u003C/td>\\n\u003Ctd class=\\\"tc-relink-column-delete\\\">{{||$:/plugins/flibbles/relink/ui/components/button-delete}}\u003C/td>\\n\u003C/$reveal>\\n\u003C/$tiddler>\\n\u003C/$vars>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define tables(category, list-row-macro, header-list)\\n\\\\whitespace trim\\n\u003C$vars\\n\\tcolumn-count={{{[enlist\u003C__header-list__>] [[DeleteColumn]] +[count[]]}}}>\\n\u003Ctable class=\\\"tc-relink-whitelist\\\">\u003Ctbody>\\n\u003Ctr>\\n\u003C$list variable=\\\"header\\\" filter=\\\"[enlist\u003C__header-list__>butlast[]]\\\">\u003Cth>\u003C\u003Cheader>>\u003C/th>\u003C/$list>\\n\u003C!-- We have the last column extend into the delete/link column, which is unlabeled. -->\\n\u003Cth colspan=2>\u003C$text text={{{ [enlist\u003C__header-list__>last[]] }}} />\u003C/th>\\n\u003C/tr>\\n\u003C\u003C.make-table Custom \\\"\\\" yes>>\\n\\n\u003C$list\\n\\tfilter=\\\"[plugin-type[plugin]![$:/core]![$:/plugins/flibbles/relink]]\\\">\\n\u003C$set name=\\\"subtitle\\\" filter=\\\"[all[current]has[description]]\\\" value=\\\"''{{!!name}}'': \u003C$text text={{!!description}}/>\\\" emptyValue=\\\"''{{!!name}}''\\\" >\\n\u003C$macrocall $name=\\\".make-table\\\" title=\u003C\u003Csubtitle>> plugin=\u003C\u003CcurrentTiddler>> />\\n\u003C/$set>\\n\u003C/$list>\\n\u003C\u003C.make-table Core \\\"$:/plugins/flibbles/relink\\\">>\\n\\n\u003C/tbody>\u003C/table>\\n\u003C/$vars>\\n\\\\end\\n\"},\"$:/plugins/flibbles/relink/ui/configuration/Attributes\":{\"title\":\"$:/plugins/flibbles/relink/ui/configuration/Attributes\",\"caption\":\"{{$:/plugins/flibbles/relink/language/ui/Attributes/Caption}}\",\"tags\":\"$:/tags/flibbles/relink/Configuration\",\"text\":\"\\\\import $:/plugins/flibbles/relink/ui/components/tables\\n\\\\define prefix-attr() $:/config/flibbles/relink/attributes/\\n\\\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\\n\\\\define element-name-tiddler() $:/state/flibbles/relink/element-name\\n\\\\define attribute-name-tiddler() $:/state/flibbles/relink/attribute-name\\n\\n\\\\define row()\\n\\\\whitespace trim\\n\u003C$set name='element'\\n value={{{[\u003Ckey>splitbefore[/]removesuffix[/]]}}}>\\n\u003C$set name=\\\"attribute\\\"\\n value={{{[\u003Ckey>removeprefix\u003Celement>removeprefix[/]]}}}>\\n\u003Ctd>\u003C$text text=\u003C\u003Celement>> />\u003C/td>\\n\u003Ctd>\u003C$text text=\u003C\u003Cattribute>> />\u003C/td>\\n\u003C/$set>\u003C/$set>\\n\\\\end\\n\\\\define body()\\n\\\\whitespace trim\\n\\n\u003Cem class=\\\"tc-edit\\\">Add a new attribute:\u003C/em>\\n \\n\u003C$edit-text\\n\\ttiddler=\u003C\u003Celement-name-tiddler>>\\n\\ttag=\\\"input\\\"\\n\\tdefault=\\\"\\\"\\n\\tplaceholder=\\\"widget/element\\\" />\\n \\n\u003C$edit-text\\n\\ttiddler=\u003C\u003Cattribute-name-tiddler>>\\n\\ttag=\\\"input\\\"\\n\\tdefault=\\\"\\\"\\n\\tplaceholder=\\\"attribute\\\" />\\n \\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" state=\u003C\u003Celement-name-tiddler>> >\\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" state=\u003C\u003Cattribute-name-tiddler>> >\\n\u003C$relinkmangler>\\n\u003C$button\\n\\ttooltip={{$(lingo-base)$NewAttribute/Hint}}\\n\\taria-label={{$(lingo-base)$NewAttribute/Caption}}>\\n\u003C$action-sendmessage\\n\\t$message=\\\"relink-add-attribute\\\"\\n\\telement={{$(element-name-tiddler)$}}\\n\\tattribute={{$(attribute-name-tiddler)$}} />\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cattribute-name-tiddler>> />\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Celement-name-tiddler>> />\\n\u003C$text text={{$(lingo-base)$NewAttribute/Caption}}/>\\n\u003C/$button>\\n\u003C/$relinkmangler>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" state=\u003C\u003Cattribute-name-tiddler>> >\\n\u003C$button>\\n\u003C$text text={{$(lingo-base)$NewAttribute/Caption}}/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" state=\u003C\u003Celement-name-tiddler>> >\\n\u003C$button>\\n\u003C$text text={{$(lingo-base)$NewAttribute/Caption}}/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$macrocall\\n\\t$name=tables\\n\\tcategory=\\\"attributes\\\"\\n\\theader-list=\\\"[[Widget/HTML Element]] Attribute Type\\\"\\n\\tlist-row-macro=\\\"row\\\" />\\n\\\\end\\n\\n{{$:/plugins/flibbles/relink/language/Help/Attributes}}\\n\\n\u003C\u003Cbody>>\\n\"},\"$:/plugins/flibbles/relink/ui/configuration/Fields\":{\"title\":\"$:/plugins/flibbles/relink/ui/configuration/Fields\",\"caption\":\"{{$:/plugins/flibbles/relink/language/ui/Fields/Caption}}\",\"tags\":\"$:/tags/flibbles/relink/Configuration\",\"text\":\"\\\\import $:/plugins/flibbles/relink/ui/components/tables\\n\\\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\\n\\\\define field-name-tiddler() $:/state/flibbles/relink/field-name\\n\\n\\\\define row()\\n\u003Ctd>\u003C$text text=\u003C\u003Ckey>> />\u003C/td>\\n\\\\end\\n\\n\\\\define body()\\n\\\\whitespace trim\\n\\n\u003Cem class='tc-edit'>Add a new field:\u003C/em>\\n \\n\u003C$edit-text\\n\\ttiddler=\u003C\u003Cfield-name-tiddler>>\\n\\ttag=\\\"input\\\"\\n\\tdefault=\\\"\\\"\\n\\tplaceholder=\\\"field name\\\" />\\n \\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" state=\u003C\u003Cfield-name-tiddler>> >\\n\u003C$relinkmangler>\\n\u003C$button\\n\\ttooltip={{$(lingo-base)$NewField/Hint}}\\n\\taria-label={{$(lingo-base)$NewField/Caption}}>\\n\u003C$action-sendmessage\\n\\t$message=\\\"relink-add-field\\\"\\n\\tfield={{$(field-name-tiddler)$}} />\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cfield-name-tiddler>> />\\n\u003C$text text={{$(lingo-base)$NewField/Caption}}/>\\n\u003C/$button>\\n\u003C/$relinkmangler>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" state=\u003C\u003Cfield-name-tiddler>> >\\n\u003C$button>\\n\u003C$text text={{$(lingo-base)$NewField/Caption}}/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$macrocall\\n\\t$name=tables\\n\\tcategory=\\\"fields\\\"\\n\\theader-list=\\\"[[Field Name]] [[Field Type]]\\\"\\n\\tlist-row-macro=\\\"row\\\" />\\n\\\\end\\n\\n{{$:/plugins/flibbles/relink/language/Help/Fields}}\\n\\n\u003C\u003Cbody>>\\n\"},\"$:/plugins/flibbles/relink/ui/configuration/Macros\":{\"title\":\"$:/plugins/flibbles/relink/ui/configuration/Macros\",\"caption\":\"{{$:/plugins/flibbles/relink/language/ui/Macros/Caption}}\",\"tags\":\"$:/tags/flibbles/relink/Configuration\",\"text\":\"\\\\import $:/plugins/flibbles/relink/ui/components/tables\\n\\\\define prefix-macro() $:/config/flibbles/relink/macros/\\n\\\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\\n\\\\define macro-name-tiddler() $:/state/flibbles/relink/macro-name\\n\\\\define parameter-name-tiddler() $:/state/flibbles/relink/parameter-name\\n\\n\\\\define row()\\n\\\\whitespace trim\\n\u003C$set name=\\\"parameter\\\"\\n value={{{[\u003Ckey>relink:splitafter[/]]}}}>\\n\u003C$set name='macro'\\n value={{{[\u003Ckey>removesuffix\u003Cparameter>removesuffix[/]]}}}>\\n\u003Ctd>\u003C$text text=\u003C\u003Cmacro>> />\u003C/td>\\n\u003Ctd>\u003C$text text=\u003C\u003Cparameter>> />\u003C/td>\\n\u003C/$set>\u003C/$set>\\n\\\\end\\n\\n\\\\define body()\\n\\\\whitespace trim\\n\\n\u003Cem class=\\\"tc-edit\\\">Add a new macro parameter:\u003C/em>\\n \\n\u003C$edit-text\\n\\ttiddler=\u003C\u003Cmacro-name-tiddler>>\\n\\ttag=\\\"input\\\"\\n\\tdefault=\\\"\\\"\\n\\tplaceholder=\\\"macro\\\" />\\n \\n\u003C$edit-text\\n\\ttiddler=\u003C\u003Cparameter-name-tiddler>>\\n\\ttag=\\\"input\\\"\\n\\tdefault=\\\"\\\"\\n\\tplaceholder=\\\"parameter\\\" />\\n \\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" state=\u003C\u003Cmacro-name-tiddler>> >\\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" state=\u003C\u003Cparameter-name-tiddler>> >\\n\u003C$relinkmangler>\\n\u003C$button\\n\\ttooltip={{$(lingo-base)$NewParameter/Hint}}\\n\\taria-label={{$(lingo-base)$NewParameter/Caption}}>\\n\u003C$action-sendmessage\\n\\t$message=\\\"relink-add-parameter\\\"\\n\\tmacro={{$(macro-name-tiddler)$}}\\n\\tparameter={{$(parameter-name-tiddler)$}} />\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cparameter-name-tiddler>> />\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cmacro-name-tiddler>> />\\n\u003C$text text={{$(lingo-base)$NewParameter/Caption}}/>\\n\u003C/$button>\\n\u003C/$relinkmangler>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" state=\u003C\u003Cparameter-name-tiddler>> >\\n\u003C$button>\\n\u003C$text text={{$(lingo-base)$NewParameter/Caption}}/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" state=\u003C\u003Cmacro-name-tiddler>> >\\n\u003C$button>\\n\u003C$text text={{$(lingo-base)$NewParameter/Caption}}/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$macrocall\\n\\t$name=tables\\n\\tcategory=\\\"macros\\\"\\n\\theader-list=\\\"Macro Parameter Type\\\"\\n\\tlist-row-macro=\\\"row\\\" />\\n\\\\end\\n\\n{{$:/plugins/flibbles/relink/language/Help/Macros}}\\n\\n\u003C\u003Cbody>>\\n\"},\"$:/plugins/flibbles/relink/ui/configuration/Operators\":{\"title\":\"$:/plugins/flibbles/relink/ui/configuration/Operators\",\"caption\":\"{{$:/plugins/flibbles/relink/language/ui/Operators/Caption}}\",\"tags\":\"$:/tags/flibbles/relink/Configuration\",\"text\":\"\\\\import $:/plugins/flibbles/relink/ui/components/tables\\n\\\\define lingo-base() $:/plugins/flibbles/relink/language/Buttons/\\n\\\\define operator-name-tiddler() $:/state/flibbles/relink/operator-name\\n\\n\\\\define row()\\n\u003Ctd>\u003C$text text=\u003C\u003Ckey>> />\u003C/td>\\n\\\\end\\n\\n\\\\define body()\\n\\\\whitespace trim\\n\\n\u003Cem class='tc-edit'>Add a new filter operator:\u003C/em>\\n \\n\u003C$edit-text\\n\\ttiddler=\u003C\u003Coperator-name-tiddler>>\\n\\ttag=\\\"input\\\"\\n\\tdefault=\\\"\\\"\\n\\tplaceholder=\\\"operator name\\\" />\\n \\n\u003C$reveal type=\\\"nomatch\\\" text=\\\"\\\" state=\u003C\u003Coperator-name-tiddler>>>\\n\u003C$relinkmangler>\\n\u003C$button\\n\\ttooltip={{$(lingo-base)$NewOperator/Hint}}\\n\\taria-label={{$(lingo-base)$NewOperator/Caption}}>\\n\u003C$action-sendmessage\\n\\t$message=\\\"relink-add-operator\\\"\\n\\toperator={{$(operator-name-tiddler)$}} />\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Coperator-name-tiddler>> />\\n\u003C$text text={{$(lingo-base)$NewOperator/Caption}}/>\\n\u003C/$button>\\n\u003C/$relinkmangler>\\n\u003C/$reveal>\\n\u003C$reveal type=\\\"match\\\" text=\\\"\\\" state=\u003C\u003Coperator-name-tiddler>>>\\n\u003C$button>\\n\u003C$text text={{$(lingo-base)$NewOperator/Caption}}/>\\n\u003C/$button>\\n\u003C/$reveal>\\n\u003C$macrocall\\n\\t$name=tables\\n\\tcategory=\\\"operators\\\"\\n\\theader-list=\\\"[[Filter Operator]] [[Operand Type]]\\\"\\n\\tlist-row-macro=\\\"row\\\" />\\n\\\\end\\n\\n{{$:/plugins/flibbles/relink/language/Help/Operators}}\\n\\n\u003C\u003Cbody>>\\n\"},\"$:/plugins/flibbles/relink/ui/stylesheet.css\":{\"title\":\"$:/plugins/flibbles/relink/ui/stylesheet.css\",\"tags\":\"$:/tags/Stylesheet\",\"text\":\".tc-relink-references {\\n}\\n\\n.tc-relink-references-table {\\n\\twidth: 100%;\\n\\tborder: none;\\n}\\n\\n.tc-relink-references-table td {\\n\\tborder-left: none;\\n}\\n\\n.tc-relink-references-table tr:first-child td {\\n\\tborder-top: none;\\n}\\n\\n.tc-relink-references-title {\\n\\ttext-align: left;\\n\\tvertical-align: top;\\n}\\n\\n.tc-relink-references-occurrence {\\n\\tfont-style: italic;\\n\\ttext-align: left;\\n\\tfont-weight: 200;\\n\\tpadding-left: 25px;\\n\\tvertical-align: top;\\n}\\n\\n.tc-relink-header-plugin {\\n\\ttext-align: left;\\n}\\n\\n.tc-relink-header-plugin button {\\n\\twidth: 100%\\n}\\n\\n.tc-relink-column-type {\\n\\twidth: 8em;\\n}\\n\\n.tc-relink-column-type select {\\n\\twidth: 100%;\\n}\\n\\n.tc-relink-column-delete {\\n\\tborder-left: none;\\n\\ttext-align: left;\\n}\\n\\n.tc-relink-column-delete button {\\n\\tpadding-left: 1em;\\n}\\n\\n.tc-relink-impossible a.tc-tiddlylink {\\n\\tcolor: \u003C\u003Ccolour relink-impossible>>;\\n}\\n\\n.tc-relink-menu-missing-blurb {\\n\\tmargin-left: 30pt;\\n}\\n\"}}}"}, @@ -583,7 +584,7 @@ {"title":"$:/state/add-plugin-info/$:/temp/ServerConnection/https://tobibeer.github.io/tw5-plugins/library/index.html/$:/temp/RemoteAssetInfo/https://tobibeer.github.io/tw5-plugins/library/index.html/$:/plugins/tobibeer/split","created":"20221109144756834","modified":"20230116211830913","text":"yes"}, {"title":"$:/state/add-plugin-info/$:/temp/ServerConnection/https://tobibeer.github.io/tw5-plugins/library/index.html/$:/temp/RemoteAssetInfo/https://tobibeer.github.io/tw5-plugins/library/index.html/$:/plugins/tobibeer/value","created":"20221109162512951","modified":"20230108200106539","text":"no"}, {"title":"$:/state/addplugins/tab-1342078386","created":"20221109142817793","creator":"Octt","modified":"20240129010808326","modifier":"Octt","text":"$:/config/OfficialPluginLibrary"}, -{"title":"$:/state/advancedsearch/currentTab","created":"20230109143853256","creator":"Octt","modified":"20240129010520349","modifier":"Octt","text":"$:/core/ui/AdvancedSearch/Shadows"}, +{"title":"$:/state/advancedsearch/currentTab","created":"20230109143853256","creator":"Octt","modified":"20240129215548626","modifier":"Octt","text":"$:/core/ui/AdvancedSearch/Filter"}, {"title":"$:/state/codemirror-6/translate/Draft of 'TiddlyWiki/ThirdParty' by Octt","created":"20240128231636637","creator":"Octt","modified":"20240128231640844","modifier":"Octt","text":"yes"}, {"title":"$:/state/commander/log-tiddler","created":"20230203222356189","creator":"Octt","modified":"20240129002728746","modifier":"Octt","text":"$:/temp/commander/logs/tid-1"}, {"title":"$:/state/commander/reveal/$:/plugins/kookma/commander/search/selection-668442618","created":"20230117113820190","creator":"Octt","modified":"20230206203755250","modifier":"Octt","text":"open"}, @@ -770,13 +771,18 @@ {"title":"$:/state/plugin-info--700587726-$:/plugins/tiddlywiki/railroad--1474474028","created":"20230108195626498","modified":"20230108195657298","text":"readme"}, {"title":"$:/state/plugin-info--700587726-$:/plugins/tiddlywiki/text-slicer","created":"20230217120516279","creator":"Octt","modified":"20230217120707613","modifier":"Octt","text":"yes"}, {"title":"$:/state/plugin-info--700587726-$:/plugins/tiddlywiki/text-slicer---920678886","created":"20230217120521622","creator":"Octt","modified":"20230217120600695","modifier":"Octt","text":"contents"}, +{"title":"$:/state/plugin-info-1162058394-$:/plugins/felixhayashi/hotzone---732013664","created":"20240129230328326","creator":"Octt","modified":"20240129230338052","modifier":"Octt","text":"Configuration"}, {"title":"$:/state/plugin-info-1601463112-$:/themes/tiddlywiki/vanilla","created":"20221108210136971","modified":"20221108221817102","text":"yes"}, {"title":"$:/state/plugin-info-1681283782-$:/plugins/felixhayashi/hotzone--1392385024","created":"20230127160156542","creator":"Octt","modified":"20230127160158749","modifier":"Octt","text":"Configuration"}, {"title":"$:/state/plugin-info-1681785288-$:/plugins/tiddlywiki/qrcode--106465074","created":"20230108195813986","modified":"20230108195833018","text":"readme"}, {"title":"$:/state/plugin-info-1711918554-$:/plugins/danielo515/ContextPlugin---1520134501","created":"20240128222350314","creator":"Octt","modified":"20240128222350314","modifier":"Octt","text":"contents"}, {"title":"$:/state/plugin-info-1785259528-$:/plugins/tiddlywiki/codemirror-mode-x-tiddlywiki---1739364784","created":"20221108100203119","modified":"20221108100244432","text":"contents"}, -{"title":"$:/state/plugin-info-1867135918-$:/plugins/btheado/BrowserStorage","created":"20230926062532938","creator":"Octt","modified":"20230927064016618","modifier":"Octt","text":"no"}, -{"title":"$:/state/plugin-info-1867135918-$:/plugins/btheado/BrowserStorage--473245636","created":"20230926065207438","creator":"Octt","modified":"20230927063919442","modifier":"Octt","text":"contents"}, +{"title":"$:/state/plugin-info-1867135918-$:/plugins/btheado/BrowserStorage","created":"20230926062532938","creator":"Octt","modified":"20240129220638368","modifier":"Octt","text":"no"}, +{"title":"$:/state/plugin-info-1867135918-$:/plugins/btheado/BrowserStorage--473245636","created":"20230926065207438","creator":"Octt","modified":"20240129220635867","modifier":"Octt","text":"readme"}, +{"title":"$:/state/plugin-info-1867135918-$:/plugins/danielo515/2click2edit","created":"20240129220639389","creator":"Octt","modified":"20240129220643686","modifier":"Octt","text":"no"}, +{"title":"$:/state/plugin-info-1867135918-$:/plugins/danielo515/2click2edit--1015749129","created":"20240129220642063","creator":"Octt","modified":"20240129220642063","modifier":"Octt","text":"contents"}, +{"title":"$:/state/plugin-info-1867135918-$:/plugins/ebalster/condition","created":"20240129221641393","creator":"Octt","modified":"20240129221654922","modifier":"Octt","text":"no"}, +{"title":"$:/state/plugin-info-1867135918-$:/plugins/ebalster/condition---1294715929","created":"20240129221643958","creator":"Octt","modified":"20240129221653446","modifier":"Octt","text":"readme"}, {"title":"$:/state/plugin-info-1867135918-$:/plugins/souk21/commandpalette","created":"20240129144142837","creator":"Octt","modified":"20240129165231216","modifier":"Octt","text":"no"}, {"title":"$:/state/plugin-info-1867135918-$:/plugins/tiddlywiki/browser-storage","created":"20230925173654392","creator":"Octt","modified":"20230926093053607","modifier":"Octt","text":"no"}, {"title":"$:/state/plugin-info-1867135918-$:/plugins/tiddlywiki/browser-storage---483250576","created":"20230925173657720","creator":"Octt","modified":"20230926093000668","modifier":"Octt","text":"settings"}, @@ -785,14 +791,14 @@ {"title":"$:/state/plugin-info-2030122776-$:/plugins/oeyoews/tiddlywiki-codemirror-6---1853744903","created":"20240128215059448","creator":"Octt","modified":"20240128224806116","modifier":"Octt","text":"readme"}, {"title":"$:/state/plugin-info-496662381-$:/languages/it-IT","created":"20230218113830823","creator":"Octt","modified":"20230218114059177","modifier":"Octt","text":"no"}, {"title":"$:/state/search/currentTab","created":"20230501095944427","creator":"Octt","modified":"20240128225117219","modifier":"Octt","text":"$:/core/ui/DefaultSearchResultList"}, -{"title":"$:/state/showeditpreview","created":"20220920140732083","creator":"Octt","modified":"20240129100429521","modifier":"Octt","text":"no"}, +{"title":"$:/state/showeditpreview","created":"20220920140732083","creator":"Octt","modified":"20240129223326435","modifier":"Octt","text":"no"}, {"title":"$:/state/ShowPaletteEditor","created":"20220920114858684","modified":"20220920114858684","text":"yes"}, {"title":"$:/state/sidebar","created":"20220920174307633","creator":"Octt","modified":"20240129133637373","modifier":"Octt","text":"yes"}, {"title":"$:/state/tab--1091387428","created":"20220922115715109","creator":"Octt","modified":"20230508210119459","modifier":"Octt","text":"$:/Octt/Music Archiving Status/VANTAGE"}, {"title":"$:/state/tab--1421386850","created":"20230209145707201","creator":"Octt","modified":"20230209145717889","modifier":"Octt","text":"$:/core/ui/TiddlerInfo/Tools"}, {"title":"$:/state/tab--1440231522","created":"20230217120532762","creator":"Octt","modified":"20230217120533957","modifier":"Octt","text":"$:/plugins/tiddlywiki/text-slicer/docs/usage"}, {"title":"$:/state/tab--1442537726","created":"20230919170930485","creator":"Octt","modified":"20230919170934924","modifier":"Octt","text":"$:/core/ui/TiddlerInfo/Fields"}, -{"title":"$:/state/tab--1498284803","created":"20230109143853256","creator":"Octt","modified":"20240129010520350","modifier":"Octt","text":"$:/core/ui/AdvancedSearch/Shadows"}, +{"title":"$:/state/tab--1498284803","created":"20230109143853256","creator":"Octt","modified":"20240129215548628","modifier":"Octt","text":"$:/core/ui/AdvancedSearch/Filter"}, {"title":"$:/state/tab--1581376822","created":"20230117125310625","creator":"Octt","modified":"20230117125313877","modifier":"Octt","text":"$:/plugins/flibbles/relink/ui/TiddlerInfo/References"}, {"title":"$:/state/tab--1588928600","created":"20230110152826768","modified":"20230110152833719","text":"$:/core/ui/TiddlerInfo/Fields"}, {"title":"$:/state/tab--1672778217","created":"20240128222933768","creator":"Octt","modified":"20240128222934548","modifier":"Octt","text":"$:/plugins/kookma/commander/tiddler/uicomp/delete-tiddlers"}, @@ -810,7 +816,7 @@ {"title":"$:/state/tab-1410043539","created":"20230203222331010","creator":"Octt","modified":"20230207221424319","modifier":"Octt","text":"$:/plugins/kookma/commander/tag/uicomp/add-remove-tags"}, {"title":"$:/state/tab-1558774480","created":"20230926071540758","creator":"Octt","modified":"20230926071548108","modifier":"Octt","text":"$:/core/ui/TiddlerInfo/Advanced"}, {"title":"$:/state/tab-1606569932","created":"20230508205451649","creator":"Octt","modified":"20230508210959773","modifier":"Octt","text":"$:/Octt/Music Archiving Status/(Misc)"}, -{"title":"$:/state/tab-1749438307","created":"20220920090405977","creator":"Octt","modified":"20240129165232809","modifier":"Octt","text":"$:/core/ui/ControlPanel/KeyboardShortcuts"}, +{"title":"$:/state/tab-1749438307","created":"20220920090405977","creator":"Octt","modified":"20240129230306596","modifier":"Octt","text":"$:/core/ui/ControlPanel/Appearance"}, {"title":"$:/state/tab-1754034960","created":"20230110215926447","modified":"20230110215935623","text":"$:/core/ui/TiddlerInfo/References"}, {"title":"$:/state/tab-1912911341","created":"20231107221031452","creator":"Octt","modified":"20231107221034852","modifier":"Octt","text":"$:/plugins/kookma/commander/tag/uicomp/add-remove-tags"}, {"title":"$:/state/tab-2025781229","created":"20220922151106305","modified":"20220922151357705","text":"Music Archiving Status/Android52"}, @@ -827,12 +833,12 @@ {"title":"$:/state/tab-99014043","created":"20220921221238452","creator":"Octt","modified":"20230218224826352","modifier":"Octt","text":"$:/core/ui/ControlPanel/TiddlerIcon"}, {"title":"$:/state/tab/moresidebar-1850697562","created":"20220920114911876","creator":"Octt","modified":"20230920153329472","modifier":"Octt","text":"$:/core/ui/MoreSideBar/Explorer"}, {"title":"$:/state/tab/search-results/sidebar","created":"20230501095944427","creator":"Octt","modified":"20240128225117219","modifier":"Octt","text":"$:/core/ui/DefaultSearchResultList"}, -{"title":"$:/state/tab/sidebar--595412856","created":"20220920092307479","creator":"Octt","modified":"20240129160508199","modifier":"Octt","text":"OcttKB/Index"}, +{"title":"$:/state/tab/sidebar--595412856","created":"20220920092307479","creator":"Octt","modified":"20240129223648813","modifier":"Octt","text":"OcttKB/Index"}, {"title":"$:/state/tabs/controlpanel/toolbars-1345989671","created":"20220920114638764","creator":"Octt","modified":"20240129143019544","modifier":"Octt","text":"$:/core/ui/ControlPanel/Toolbars/ViewToolbar"}, {"title":"$:/state/tag-cloud-count","created":"20230109231545587","modified":"20230109231831243","text":"inline"}, {"title":"$:/state/toc-$:/OcttKB/ToC-2084057354","created":"20230301190128004","creator":"Octt","modified":"20230301190128780","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Apps--1446284390","created":"20240127224228610","creator":"Octt","modified":"20240127224229697","modifier":"Octt","text":"close"}, -{"title":"$:/state/toc/$:/ToC-$:/Apps--1697730578","created":"20230817233312379","creator":"Octt","modified":"20240129171402153","modifier":"Octt","text":"close"}, +{"title":"$:/state/toc/$:/ToC-$:/Apps--1697730578","created":"20230817233312379","creator":"Octt","modified":"20240129234150066","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Apps--777438282","created":"20230301202315129","creator":"Octt","modified":"20230301210025400","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Apps-1513105244","created":"20230905203425374","creator":"Octt","modified":"20230905203427031","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Apps-747701490","created":"20230221195052164","creator":"Octt","modified":"20230508212939248","modifier":"Octt","text":"close"}, @@ -842,7 +848,7 @@ {"title":"$:/state/toc/$:/ToC-$:/Games-1491465924","created":"20230227182906960","creator":"Octt","modified":"20230301140227063","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Games-747701490","created":"20230225112101049","creator":"Octt","modified":"20230301115417837","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools--1446284390","created":"20240127224231676","creator":"Octt","modified":"20240127224233280","modifier":"Octt","text":"close"}, -{"title":"$:/state/toc/$:/ToC-$:/Tools--1697730578","created":"20230817233308156","creator":"Octt","modified":"20240129161429270","modifier":"Octt","text":"close"}, +{"title":"$:/state/toc/$:/ToC-$:/Tools--1697730578","created":"20230817233308156","creator":"Octt","modified":"20240129215819354","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools--685112640","created":"20230217211142634","creator":"Octt","modified":"20230217211145890","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools--777438282","created":"20230301202335134","creator":"Octt","modified":"20230301204324760","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-$:/Tools-1491465924","created":"20230227182905552","creator":"Octt","modified":"20230227182906545","modifier":"Octt","text":"close"}, @@ -863,6 +869,7 @@ {"title":"$:/state/toc/$:/ToC-Spacc--1697730578","created":"20230916143818761","creator":"Octt","modified":"20240127224434310","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-Spacc--777438282","created":"20230301202324703","creator":"Octt","modified":"20230301210030801","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC-Spacc-747701490","created":"20230209095658308","creator":"Octt","modified":"20230301120250411","modifier":"Octt","text":"close"}, +{"title":"$:/state/toc/$:/ToC/$:/Apps-$:/Apps/MagicBox--1697730578","created":"20240129224805142","creator":"Octt","modified":"20240129224805142","modifier":"Octt","text":"open"}, {"title":"$:/state/toc/$:/ToC/$:/Games-Tetris--777438282","created":"20230301205510583","creator":"Octt","modified":"20230301205510583","modifier":"Octt","text":"open"}, {"title":"$:/state/toc/$:/ToC/$:/Games-Tetris-747701490","created":"20230225144236373","creator":"Octt","modified":"20230225183845279","modifier":"Octt","text":"close"}, {"title":"$:/state/toc/$:/ToC/Octt-OcttKB--685112640","created":"20230217211205809","creator":"Octt","modified":"20230217211208921","modifier":"Octt","text":"close"}, @@ -893,7 +900,7 @@ {"title":"$:/state/tree/$:/.tb/macros/","created":"20230110224517512","modified":"20230110224517512","text":"show"}, {"title":"$:/state/tree/$:/Apps/","created":"20221109225835632","modified":"20230110163406585","text":"hide"}, {"title":"$:/state/tree/$:/Apps/Dashboard/","created":"20221109225836608","creator":"Octt","modified":"20230817233316723","modifier":"Octt","text":"show"}, -{"title":"$:/state/tree/$:/Apps/MagicBox/Shortcuts/","created":"20240129165309464","creator":"Octt","modified":"20240129165309464","modifier":"Octt","text":"show"}, +{"title":"$:/state/tree/$:/Apps/MagicBox/Shortcuts/","created":"20240129165309464","creator":"Octt","modified":"20240129231142511","modifier":"Octt","text":"show"}, {"title":"$:/state/tree/$:/boot/","created":"20221107223501670","creator":"Octt","modified":"20230225111138843","modifier":"Octt","text":"hide"}, {"title":"$:/state/tree/$:/config/","created":"20221107223451478","creator":"Octt","modified":"20240128215219255","modifier":"Octt","text":"hide"}, {"title":"$:/state/tree/$:/Config/","created":"20230110224406161","creator":"Octt","modified":"20230124111914349","modifier":"Octt","text":"hide"}, @@ -936,7 +943,7 @@ {"title":"$:/state/tree/$:/Macros/View/","created":"20230125093534902","creator":"Octt","modified":"20230125114608509","modifier":"Octt","text":"hide"}, {"title":"$:/state/tree/$:/Manager/","created":"20230111091330393","creator":"Octt","modified":"20230219102903632","modifier":"Octt","text":"hide"}, {"title":"$:/state/tree/$:/Manager/ItemMain/","created":"20230124111902915","creator":"Octt","modified":"20230124111902915","modifier":"Octt","text":"show"}, -{"title":"$:/state/tree/$:/Octt/","created":"20230227072955115","creator":"Octt","modified":"20230925173912043","modifier":"Octt","text":"hide"}, +{"title":"$:/state/tree/$:/Octt/","created":"20230227072955115","creator":"Octt","modified":"20240129222612819","modifier":"Octt","text":"hide"}, {"title":"$:/state/tree/$:/Octt/Music Archiving Status/","created":"20230227073001488","creator":"Octt","modified":"20230905205312681","modifier":"Octt","text":"hide"}, {"title":"$:/state/tree/$:/OcttKB/","created":"20230111084703963","creator":"Octt","modified":"20240128221252219","modifier":"Octt","text":"hide"}, {"title":"$:/state/tree/$:/OcttKB/Config/","created":"20230225225512618","creator":"Octt","modified":"20231105214436728","modifier":"Octt","text":"hide"}, @@ -1159,7 +1166,7 @@ {"title":"Copyright","created":"20231022234706178","creator":"Octt","modified":"20231022234838813","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Copyright>>\n\n* [[Um, is it normal for someone to casually admit to pirating stuff?|https://www.resetera.com/threads/um-is-it-normal-for-someone-to-casually-admit-to-pirating-stuff.156559/]] --- This thread made me laugh, \"did you admit to a crime\" LMAO\n"}, {"title":"Creative Commons/BY-SA 4.0:en","created":"20220925131851817","modified":"20230206111552087","modifier":"Octt","tags":"TODO $:/i18n:en","text":"!! Creative Commons\n\n!!! ''Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)''\n\nThis is a human-readable summary of (and not a substitute for) the [[license|https://creativecommons.org/licenses/by-sa/4.0/legalcode]].\n\n\u003Cdetails>\n\u003Csummary>Disclaimer\u003C/summary>\n\u003Cp>This deed highlights only some of the key features and terms of the actual license. It is not a license and has no legal value. You should carefully review all of the terms and conditions of the actual license before using the licensed material.\u003C/p>\n\n\u003Cp>Creative Commons is not a law firm and does not provide legal services. Distributing, displaying, or linking to this deed or the license that it summarizes does not create a lawyer-client or any other relationship.\u003C/p>\n\u003C/details>\n\n[img[$:/ThirdParty/Buttons/CC BY-SA.svg]]\n\n!!!'' You are free to:''\n\n''Share'' — copy and redistribute the material in any medium or format\n\n''Adapt'' — remix, transform, and build upon the material\nfor any purpose, even commercially.\n\nThe licensor cannot revoke these freedoms as long as you follow the license terms.\n\n!!! ''Under the following terms:''\n\n''Attribution'' — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.\n\n''ShareAlike'' — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.\n\n''No additional restrictions'' — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.\n\n!!! ''Notices:''\nYou do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.\n\nNo warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material."}, {"title":"Cryptocurrency","created":"20230218181942782","creator":"Octt","modified":"20240127233538211","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Cryptocurrency>>\n\n* Cryptocurrencies are usually decentralized; in such cases, they are based on a [[Blockchain]].\n\n!! Some cryptocurrencies (+ tokens)\n\n!!! ''[[Bitcoin|https://bitcoin.org/]]'' (BTC)\n\n* https://github.com/bitcoin\n\n; Self-custocial Wallets\n: [[Mycelium|https://wallet.mycelium.com/]] (Android) - \u003C\u003C[ \"[[Git|https://github.com/mycelium-com]]\">>\n\n\n!!! [[Dash|https://www.dash.org/]]\n\n//Dash is an experimental digital currency that enables instant, private payments to anyone, anywhere in the world.//\n\nIt's a fork of Bitcoin. There are some advantages, some technical and some situational, but a strange disadvantage I have seen appears to be that wallet syncs take a lot of time.\n\n* https://github.com/dashpay\n\n!!! [[Duino-Coin|https://github.com/revoxhere/duino-coin]]\n\n//Simple, eco-friendly, centralized coin that can be mined with microcontrollers.//\n\n* https://github.com/revoxhere/duino-coin\n\n!!! ''[[Ethereum|https://ethereum.org/]]'' (ETH)\n\n* https://github.com/ethereum\n\n; Self-custodial Wallets\n: [[AlphaWallet|https://alphawallet.com/]] (Android) - \u003C\u003C[ \"[[Git|https://github.com/AlphaWallet]]\">>\n: [[Metamask|https://metamask.io/]] (Web Extension, Android) - \u003C\u003C[ \"[[Git|https://github.com/MetaMask]]\">>\n\n\n!!! ''[[Monero|https://www.getmonero.org/]]'' (XMR)\n\n* https://github.com/monero-project\n\n; Self-custodial Wallets\n: [[MyMonero|https://mymonero.com/]] (Web, Android, PC) - \u003C\u003C[ \" [[Git|https://github.com/mymonero]]\">>\n"}, -{"title":"CSS","created":"20230209150101862","creator":"Octt","icon":"💅","modified":"20240107152919931","modifier":"Octt","page-cover":"https://images.unsplash.com/photo-1523437113738-bbd3cc89fb19","tags":"Web Frontend","text":"\u003C\u003C^wikipediaframe CSS en>>\n\n!!! ''References''\n\n* [[CSS Attribute Selectors|https://www.w3schools.com/css/css_attribute_selectors.asp]]\n* [[CSS Borders [w3s]|https://www.w3schools.com/css/css_border.asp]]\n** \u003C\u003CMDNLink Web/CSS/border-style border-style>> --- all ways to style a border, not only colors\n\n!!! ''Frameworks''\n\n* [[Bulma|https://bulma.io/]] --- //modern CSS framework that just works//\n* [[PaperCSS|https://www.getpapercss.com/]] --- //the less formal CSS framework//\n* [[W3.CSS|https://www.w3schools.com/w3css/default.asp]] --- //A Quality Alternative to Bootstrap, is Smaller, Faster and Easier to Use.//\n\n!!! ''Amazing''\n\n* [[CSS Zen Garden|https://csszengarden.com/]] --- //The Beauty of CSS Design//\n* [[Pure CSS Minesweeper|https://codepen.io/bali_balo/pen/BLJONZ?editors=1100]]\n* [[Spinning Diagrams with CSS|https://x.st/spinning-diagrams-with-css]]\n* [[Bubble Sort...in PURE CSS? [No JS] 😱|https://dev.to/grahamthedev/bubble-sortin-pure-css-no-js-3bb1]]\n* [[25 CSS Paper Effects|https://freefrontend.com/css-paper-effects/]]\n* [[Reusable CSS \"Sticker\" Effect|https://dev.to/5t3ph/reusable-css-sticker-effect-44lc]]\n"}, +{"title":"CSS","created":"20230209150101862","creator":"Octt","icon":"💅","modified":"20240130004423944","modifier":"Octt","page-cover":"https://images.unsplash.com/photo-1523437113738-bbd3cc89fb19","tags":"Web Frontend","text":"\u003C\u003C^wikipediaframe CSS en>>\n\n!!! ''References''\n\n* [[CSS Attribute Selectors|https://www.w3schools.com/css/css_attribute_selectors.asp]]\n* [[CSS Borders [w3s]|https://www.w3schools.com/css/css_border.asp]]\n** \u003C\u003CMDNLink Web/CSS/border-style border-style>> --- all ways to style a border, not only colors\n\n!!! ''Tips''\n\n* [[How to disable a link using only CSS|https://stackoverflow.com/questions/2091168/how-to-disable-a-link-using-only-css]] --- essentially, `pointer-events: none;` for the functional side, + other rules for styling\n\n!!! ''Frameworks''\n\n* [[Bulma|https://bulma.io/]] --- //modern CSS framework that just works//\n* [[PaperCSS|https://www.getpapercss.com/]] --- //the less formal CSS framework//\n* [[W3.CSS|https://www.w3schools.com/w3css/default.asp]] --- //A Quality Alternative to Bootstrap, is Smaller, Faster and Easier to Use.//\n\n!!! ''Amazing''\n\n* [[CSS Zen Garden|https://csszengarden.com/]] --- //The Beauty of CSS Design//\n* [[Pure CSS Minesweeper|https://codepen.io/bali_balo/pen/BLJONZ?editors=1100]]\n* [[Spinning Diagrams with CSS|https://x.st/spinning-diagrams-with-css]]\n* [[Bubble Sort...in PURE CSS? [No JS] 😱|https://dev.to/grahamthedev/bubble-sortin-pure-css-no-js-3bb1]]\n* [[25 CSS Paper Effects|https://freefrontend.com/css-paper-effects/]]\n* [[Reusable CSS \"Sticker\" Effect|https://dev.to/5t3ph/reusable-css-sticker-effect-44lc]]\n"}, {"title":"CTGP Nitro","created":"20230205150034992","creator":"Octt","modified":"20230213165348163","modifier":"Octt","tags":"Mod [[Mario Kart DS]]","text":"//Rediscover Mario Kart DS once again!//\n\n//''[[CTGP Nitro|https://dswiki.garhoogin.com/ctgp-n/]]'' is the biggest, most ambitious Mario Kart DS Rom Hack to date. Instead of replacing the existing tracks, it preserves the whole vanilla experience and adds new tracks, speedrunning quality of life improvements, online mode adjustments, new skins for characters and much more!//\n"}, {"title":"CUPS","created":"20230825221340887","creator":"Octt","modified":"20230902000445288","modifier":"Octt","tags":"Unix Printing","type":"","text":"\u003C\u003C^wikipediaframe CUPS>>\n\n* [[CUPS: Command-Line Printing and Options|http://www.it.uu.se/datordrift/maskinpark/skrivare/cups/]] including Linux-specific ones.\n* [[CUPS-PDF, Print to PDF from any Application|https://cubiclenate.com/2021/01/21/cups-pdf-print-to-pdf-from-any-application/]] --- Must probably be installed separately via `cups-pdf` package --- Outputs are by default in `~/PDF/`\n\n* [[How do you administer CUPS remotely using the web interface?|https://askubuntu.com/questions/23936/how-do-you-administer-cups-remotely-using-the-web-interface]] --- `cupsctl --remote-admin --remote-any ` (and optionally `--share-printers`), then restart `cups` service, and visit `http://{IpAddress}:631`. Redo commands but with `no-` suffix to flags to disable the feature.\n"}, {"title":"CyanogenMod:en","created":"20230202230421306","creator":"Octt","modified":"20230206111552091","modifier":"Octt","tags":"Android $:/i18n:en","text":"\u003C\u003CMediaWiki CyanogenMod en 4>>"}, @@ -1246,7 +1253,7 @@ {"title":"Hardware","created":"20231221155549063","creator":"Octt","modified":"20231223214751769","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Hardware>>\n\n* [[The Hardware Book [HwB]|http://www.hardwarebook.info/]] --- //Internet's largest free collection of connector pinouts and cable descriptions//\n* [[PinoutGuide.com|https://pinoutguide.com/]] --- //Handbook of hardware schemes, cables and connectors layouts pinouts//\n"}, {"title":"Hashing","created":"20230711110503152","creator":"Octt","modified":"20231220005057044","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Hash function\">>\n\n\u003C\u003C^wikipediaframe MD5>>\n\n* [[Generate md5 checksum for all files in a directory|https://askubuntu.com/questions/318530/generate-md5-checksum-for-all-files-in-a-directory]] --- `find -type f -exec md5sum \"{}\" + > checklist.chk`\n\nMD5 nowadays is known much vulnerable to collisions:\n\n* [[Are there two data blocks causing and MD5 collision?|https://crypto.stackexchange.com/questions/1434/are-there-two-known-strings-which-have-the-same-md5-hash-value]]\n** [[MD5 Collision Demo|https://www.mscs.dal.ca/~selinger/md5collision/]]\n** [[Create your own MD5 collisions|https://natmchugh.blogspot.com/2015/02/create-your-own-md5-collisions.html]]\n"}, {"title":"Holiday","created":"20231221144043421","creator":"Octt","modified":"20231222213859630","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Holiday>>\n\n!! Christmas\n\n\u003C\u003C^wikipediaframe Christmas>>\n\n* [[Padoru [KYM]|https://knowyourmeme.com/memes/padoru]]\n** [[🎄 Distrazioni di Natale: l'albero Padoru|https://sitoctt.octt.eu.org/Posts/2022-12-17-Distrazioni-di-Natale-Albero-Padoru.html]]\n* [[Weird Christmas ~ Create your card!|http://christmas.rogue.studio/]] --- //Share some holiday spirit with these historical and bizarre old Holiday cards. Laugh, love, and have a weird Christmas!//\n* [[Whamageddon|https://whamageddon.com/]] --- //The objective is to go as long as possible without hearing WHAM's Christmas classic; \"Last Christmas\".//\n"}, -{"title":"Homebrew","created":"20231102231258441","creator":"Octt","modified":"20240107114852326","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Homebrew (video games)\">>\n\n* [[PDRoms|https://pdroms.de]] --- //Homebrew 4 you// (abandoned)\n** [[Retro Veteran|https://www.retroveteran.com/]] --- //Retro is our thing!// --- continuation for the above site\n\n* ''[[Homebrew Hub|https://hh.gbdev.io/]]'' is a community-led initiative to collect, archive and preserve homebrew software developed for Game Boy (Color) and the Game Boy Advance. --- \u003C\u003C[# Git\"https://github.com/gbdev/homebrewhub\">>\n* [[Universal-Team|https://universal-team.net/]] --- //We make homebrew apps for the DS(i) and 3DS. We hope you find them useful! 😄// --- \u003C\u003C[# Git\"https://github.com/Universal-Team\">>\n"}, +{"title":"Homebrew","created":"20231102231258441","creator":"Octt","modified":"20240130003805680","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"Homebrew (video games)\">>\n\n* [[PDRoms|https://pdroms.de]] --- //Homebrew 4 you// (abandoned)\n** [[Retro Veteran|https://www.retroveteran.com/]] --- //Retro is our thing!// --- continuation for the above site\n\n* ''[[Homebrew Hub|https://hh.gbdev.io/]]'' is a community-led initiative to collect, archive and preserve homebrew software developed for Game Boy (Color) and the Game Boy Advance. --- \u003C\u003C[# Git\"https://github.com/gbdev/homebrewhub\">>\n* [[Universal-Team|https://universal-team.net/]] --- //We make homebrew apps for the DS(i) and 3DS. We hope you find them useful! 😄// --- \u003C\u003C[# Git\"https://github.com/Universal-Team\">>\n\n* [[Rinnegatamante's Archive|https://rinnegatamante.it/]]\n"}, {"title":"HTML","created":"20230202224901337","creator":"Octt","icon":"📰","modified":"20240128235735551","modifier":"Octt","page-cover":"https://images.unsplash.com/photo-1517134062979-e1234be8a085","tags":"Web Markup","text":"\u003C\u003C^WikipediaFrame HTML en>>\n\n* [[Security risks of user generated HTML?|https://security.stackexchange.com/questions/220447/security-risks-of-user-generated-html]]\n** \u003C\u003CWikipediaL HTML_sanitization>> ; [[Sanitizing untrusted HTML5|https://stackoverflow.com/questions/17691758/sanitizing-untrusted-html5]]\n\n!!! ''References''\n\n* [[HTML5 `\u003Clink rel=\"shortcut icon\" />`|https://stackoverflow.com/questions/13211206/html5-link-rel-shortcut-icon]]\n* [[HTML Character Entity References|https://symbl.cc/en/html-entities/]] --- //The following table is completed with special characters and their HTML Entities from W3C.//\n\n* //''\u003C\u003CMDNLink Web/API/Web_Components \"Web Components\">>'' is a suite of different technologies allowing you to create reusable custom elements//\n** [[Can I use Web Components|https://caniuse.com/?search=web%20components]], there are some partially implemented half-obscure features\n*** [[HTML Imports|https://caniuse.com/imports]] --- //Deprecated method of including and reusing HTML documents in other HTML documents// --- The idea was nice: `\u003Clink rel=\"import\" href=\"/path/to/file.html\">`\n\n* \u003C\u003CMDNLink Web/HTML/Element/dialog \"\u003Cdialog>: The Dialog element\">> --- //modal or non-modal dialog box or other interactive component, such as a dismissible alert, inspector, or subwindow//\n** [[dialog-polyfill|https://github.com/GoogleChrome/dialog-polyfill]] --- //Polyfill for the HTML dialog element// --- \u003C\u003C[# Demo\"https://googlechrome.github.io/dialog-polyfill/\">>\n\n!! XHTML\n\n* [[Practical guide to XHTML|https://www.nayuki.io/page/practical-guide-to-xhtml]]\n"}, {"title":"HTTP","created":"20230205142456532","creator":"Octt","modified":"20230417203556283","modifier":"Octt","tags":"Protocol Web","text":"\u003C\u003C^WikipediaFrame HTTP en>>\n\n!! ''Resources''\n\n* HTTP on... [[MDN|https://developer.mozilla.org/en-US/docs/Web/HTTP]]\n* HTTP response status codes: [[Wikipedia|https://en.wikipedia.org/wiki/List_of_HTTP_status_codes]]\n** [[HTTP Cats|https://http.cat/]]\n\n!!! ''Features''\n\n* ''\u003C\u003CWikipediaLink \"Basic access authentication\">>''\n** `Authorization: Basic \u003CCredentials>`\n*** Credentials: [[Base64]]-encoded string: `\u003CUser>:\u003CPassword>`\n"}, {"title":"Huawei P9 Lite Mini","created":"20230205143543756","creator":"Octt","modified":"20230219105015345","modifier":"Octt","tags":"Android Huawei","text":"\u003C\u003CiFrameBypass \"https://www.gsmarena.com/huawei_p9_lite_mini-8833.php\">>\n\n* No custom ROMs have ever been made for this device\n* We ported TWRP but without working storage decryption\n* The headphone jack port is detective\n* The integrated GPU is fake/emulated (Snapdragon 425)\n** Still don't understand if this is Qualcomm's fault, or Huawei's for not installing proper drivers\n\n; Product names:\n: Europe: Huawei Y6 Pro 2017\n: Other: Huawei P9 Lite Mini\n\n; Codename: selina\n\n; Model numbers:\n: Europe: SLA-L02\n: Other: SLA-L22\n"}, @@ -1320,7 +1327,7 @@ {"title":"Minecraft","created":"20230130075428259","creator":"Octt","icon":"⛏️","modified":"20231123232805006","modifier":"Octt","page-cover":"https://source.unsplash.com/random?Minecraft","tags":"$:/i18n:en Game Proprietary Sandbox 3D","text":"\u003C\u003C^WikipediaFrame Minecraft en>>\n\n; What I like\n: The open-ended nature of the game, and the freedom to be able to have infinitely many unique experiences.\n: The graphics are simple (literal blocks with 16x16 textures lol), but colorful and inviting; they can however even be brought to photorealistic levels with (heavy) shaders. \n: Easy to \"pick-up and play\" for short sessions, but can also make you pass some hours.\n: The basis of the game are simple and can be grasped by anyone, but you never stop learning as you go deeper and deeper.\n\n; What I don't like\n: The Java Edition is heavy and unoptimized, but the Bedrock and Legacy Console Edition are very proprietary and hard to extend.\n: With every new version the game gets more and more bloated, confusing, harder to grok, distracting.\n\n!!! Clones\n\n* [[Minetest|https://www.minetest.net/]] --- //open source voxel game engine with easy modding and game creation// --- \u003C\u003C#[ Git \"https://github.com/minetest\">>\n* [[CavEx|https://github.com/xtreme8000/CavEX]] --- //Project to recreate your favourite block game for the Wii (Beta 1.7.3)//\n* [[Blocks TI-84|https://github.com/TheScienceElf/Blocks-TI-84]] --- //Minecraft-esque game for the TI 84 CE calculator//\n\n!!! Misc\n\n* [[Legacy-Docs|https://modifiedcommand.github.io/Legacy-Docs/]] --- //Documentation about Minecraft: Legacy Console Edition with Vue Press// --- \u003C\u003C[# Git\"https://github.com/ModifiedCommand/Legacy-Docs\">>\n"}, {"title":"Minesweeper","created":"20230111223018169","creator":"Octt","icon":"💣","modified":"20230919064930208","modifier":"Octt","page-cover":"https://plus.unsplash.com/premium_photo-1668046490523-6f4e603d446c","tags":"Puzzle $:/i18n:en Game Generic $:/Games","text":"\u003C\u003C^wikipediaframe \"Minesweeper (video game)\" en>>\n\n* [[Antimine|https://github.com/lucasnlm/antimine-android]] --- //open source minesweeper-like puzzle game for Android//\n\n!!! ''Gamin' Time''\n\n\u003C\u003CiFrameFixed \"https://vuesweeper.netlify.app\">>\n\n!! ''Paper Minesweeper''\n\n* https://www.gmpuzzles.com/blog/minesweeper-rules-and-info/\n* https://www.puzzle-book.co.uk/minesweepers-puzzle-book.php\n** http://www.clarity-media.co.uk/online-puzzles/sample-minesweeper-puzzle.php\n"}, {"title":"Minigame","created":"20231119163134278","creator":"Octt","modified":"20231119163812997","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Minigame>>\n\n* See [[Microgame|https://www.mariowiki.com/Microgame]] for the WarioWare kind\n** [[Dumb Ways to Die|https://www.dumbwaystodie.com/]], mobile microgames collection with minimalist graphics\n*** HTML5 builds playable: [[Original (1)|https://www.crazygames.com/game/dumb-ways-to-die-original]], [[2|https://www.crazygames.com/game/dumb-ways-to-die-2-the-games]]\n** [[NitorInc.: Touhou Microgames collaborative project|https://nitorincmicro.games/]] --- //Fast-paced, crazy fun microgames with your favorite Touhou characters! And YOU can help make them!// --- \u003C\u003C[# Git\"https://github.com/NitorInc\">>\n"}, -{"title":"MIPS","created":"20231123184226189","creator":"Octt","modified":"20231224154946990","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"MIPS architecture\">>\n\n* [[MIPS Assembly (Wikibooks)|https://en.wikibooks.org/wiki/MIPS_Assembly]]\n* [[MIPS Reference Sheet|https://uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf]]\n* [[Jarrett Billingsley's Computer Organization & Assembly Materials|https://jarrettbillingsley.github.io/teaching/classes/cs0447/materials]] including MIPS pages\n* [[Abdelrahman Nasr's MIPS cheatsheet|https://t1m3m.github.io/posts/MIPS-cheatsheet/]]\n\n* [[Mipsdis: MIPS disassembler in the browser|https://blog.loadzero.com/blog/announcing-mipsdis/]] --- \u003C\u003C[# Demo\"https://blog.loadzero.com/demo/mipsdis/demo.html\">> \u003C\u003C[# Git\"https://github.com/loadzero/mipsdis\">>\n\n* [[represent a struct in mips32|https://stackoverflow.com/questions/60112137/represent-a-struct-in-mips32]] --- after analyzing the C struct declaration to understand how many bytes it requires, //a good idea here would be to allocate some `.space`//, e.g. `theStruct:\n .align 2 # MIPS needs word alignment\n .space 16 # Size of struct`, then use with `la $register,theStruct`\n* [[MIPS - Call C function in Assembly code|https://stackoverflow.com/questions/36980971/mips-call-c-function-in-assembly-code]] --- write values to stack if necessary, declare `.extern CFunctionName` in the ASM, use `jal CFunctionName` to call\n* [[MIPS function call with more than four arguments|https://stackoverflow.com/questions/2298838/mips-function-call-with-more-than-four-arguments]] --- first allocate stack memory (subtract 4*numberOfArguments to `sp`), then load the first 4 arguments normally in `$a#` registers, and store the others in `4*argumentNumber($sp)`\n"}, +{"title":"MIPS","created":"20231123184226189","creator":"Octt","modified":"20240130004109754","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe \"MIPS architecture\">>\n\n* [[MIPS Assembly (Wikibooks)|https://en.wikibooks.org/wiki/MIPS_Assembly]]\n* [[MIPS Reference Sheet|https://uweb.engr.arizona.edu/~ece369/Resources/spim/MIPSReference.pdf]]\n* [[Jarrett Billingsley's Computer Organization & Assembly Materials|https://jarrettbillingsley.github.io/teaching/classes/cs0447/materials]] including MIPS pages\n* [[Abdelrahman Nasr's MIPS cheatsheet|https://t1m3m.github.io/posts/MIPS-cheatsheet/]]\n\n* [[Mipsdis: MIPS disassembler in the browser|https://blog.loadzero.com/blog/announcing-mipsdis/]] --- \u003C\u003C[# Demo\"https://blog.loadzero.com/demo/mipsdis/demo.html\">> \u003C\u003C[# Git\"https://github.com/loadzero/mipsdis\">>\n\n* [[represent a struct in mips32|https://stackoverflow.com/questions/60112137/represent-a-struct-in-mips32]] --- after analyzing the C struct declaration to understand how many bytes it requires, //a good idea here would be to allocate some `.space`//, e.g. `theStruct:\n .align 2 # MIPS needs word alignment\n .space 16 # Size of struct`, then use with `la $register,theStruct`\n* [[MIPS - Call C function in Assembly code|https://stackoverflow.com/questions/36980971/mips-call-c-function-in-assembly-code]] --- write values to stack if necessary, declare `.extern CFunctionName` in the ASM, use `jal CFunctionName` to call\n* [[MIPS function call with more than four arguments|https://stackoverflow.com/questions/2298838/mips-function-call-with-more-than-four-arguments]] --- first allocate stack memory (subtract 4*numberOfArguments to `sp`), then load the first 4 arguments normally in `$a#` registers, and store the others in `4*argumentNumber($sp)`\n* [[Why shift a bit using sll and such in MIPs Assembly?|https://stackoverflow.com/questions/32487502/why-shift-a-bit-using-sll-and-such-in-mips-assembly]] (and what actually shifting does)\n"}, {"title":"Mirror's Edge","created":"20230129163138871","creator":"Octt","modified":"20230301121014329","modifier":"Octt","tags":"$:/i18n:en Game Proprietary","text":"\u003C\u003C^wikipediaframe \"Mirror's Edge\" en>>\n\n; What I like\n: Fast pacing mixed with parkour platforming and close-combat mechanics, gives you adrenaline.\n: The first game is more saturated, the second has more realistic graphics, however they are both very colorful.\n: Haven't played the first enough, but I can say the second is extremely immersive, even on a ~20\" 1360x768 monitor at mid details.\n"}, {"title":"Misskey","created":"20221202225134930","creator":"Octt","modified":"20231112001653635","modifier":"Octt","tags":"Fediverse","text":"\u003C\u003C^wikipediaframe Misskey>>\n\n[[Misskey|https://misskey-hub.net/en]] is an open, semi-decentralized social media platform. Decentralization is founded on the [[ActivityPub|ActivityPub]] protocol.\n\n* [[https://github.com/misskey-dev]]\n\n[img[https://raw.githubusercontent.com/misskey-dev/misskey/develop/assets/title_float.svg]]\n"}, {"title":"Miyoo","created":"20230130081721859","creator":"Octt","modified":"20230130081735692","modifier":"Octt","tags":"TODO"}, @@ -1498,9 +1505,9 @@ {"title":"The World Factbook","created":"20230208214932674","creator":"Octt","modified":"20230208215147789","modifier":"Octt","tags":"USA Gov. Book Site Web","text":"\u003C\u003CMediaWiki The_World_Factbook en 5>>"}, {"title":"Thioacetone","created":"20230302113309813","creator":"Octt","modified":"20230302114235452","modifier":"Octt","tags":"","text":"\u003C\u003C^wikipediaframe Thioacetone en>>\n\n* [[Things I Won't Work With: Thioacetone|https://www.science.org/content/blog-post/things-i-won-t-work-thioacetone]]\n* \u003C\u003CYoutubeL LmAG8-V_WQY \"Making the stinkiest chemical known to man [NileRed]\">>\n"}, {"title":"TIC-80","created":"20230215213023824","creator":"Octt","modified":"20231122002929792","modifier":"Octt","tags":"Libre Fantasy Console Gaming","text":"* https://tic80.com/\n* https://github.com/nesbox/TIC-80\n\n\u003C\u003CWikipediaFrame TIC-80 en>>\n\n* [[Making fifty TIC-80 carts in a weekend|https://blinry.org/50-tic80-carts/]] \n* [[TIC80 - A Better Pico8?|https://8bitnews.io/article/tic80-a-better-pico8]]\n\n* [[TIC-80 Manual & Cheat Sheet|https://skyelynwaddell.github.io/tic80-manual-cheatsheet/]]\n"}, -{"title":"TiddlyWiki","created":"20220924193842295","creator":"Octt","icon":"🐈","modified":"20240129135830800","modifier":"Octt","page-cover":"https://source.unsplash.com/random/?computer-cat","tags":"TiddlyWiki Wiki Zettelkasten Libre","text":"\\define TwLL(Tid) [[$Tid$|https://tiddlywiki.com/#$Tid$]]\n\n\\define TwL(List)\n|\n\u003C$list filter=\"$List$\">\n \u003C$macrocall $name=\"TwLL\" Tid=\u003C\u003CcurrentTiddler>> />\n |\n\u003C/$list>\n\\end\n\n[[TiddlyWiki|https://tiddlywiki.com]] is the software upon which this website is built.\n\nIt is a libre, JavaScript-rich, non-linear notebook, that can well adapt to anyone's way of building a logically interconnected information database.\n\n\u003C\u003C^wikipediaframe TiddlyWiki en>>\n\n; What I like\n: All your content and app runtime can stay inside a single HTML file; it will probably work fine in browsers in the decades to come.\n: The base software runs both in the web browser (ES5 or higher?) and [[Node.js]]; the latter makes it possibile to export tiddlers to a file system programmatically, generate static sites, etc...\n: Feature-rich and powerful out of the box, with (up to a certain point) high extensibility.\n: Big community, meaning you can often get help with problems, and many third-party plugins are available.\n: The default configuration works fine on mobile devices, unlike what happens with some plugins.\n\n; What I don't like\n: The Widgets/Filters/Macros systems is based on proprietary paradigms; they are made to allow people without programming experience to do great things, but are cumbersome and hard to learn if you already have common programming experience.\n: [[JavaScript]] extensions are cumbersome, requiring a page reload to work after an edit\n: It's not easy, or sometimes it's not possibile, to extend TiddlyWiki with just pure JavaScript, and trying to do so always requires ugly hacks.\n: Widgets and Filters are essentially an interpreted language working on top of an interpreted language (JS); Since even the app core makes heavy use of them, it suffers from microlags even on modern devices, and can be's almost unusable on very old ones.\n: No built-in tiddler compression and decompression means the HTML file is big by default (~2.3 MB as of v5.2.3) and can get worse with many plugins, causing slow loading and saving.\n\n!! ''Useful Resources''\n\n* Official Git Repos: [[TiddlyWiki5 Source|https://github.com/Jermolene/TiddlyWiki5]], [[Others|https://github.com/TiddlyWiki]]\n* Official Docs: [[Standard|https://tiddlywiki.com]], [[Dev|https://tiddlywiki.com/dev]]\n* [[Links Aggregator|https://links.tiddlywiki.org]]\n* [[Grok TiddlyWiki|https://groktiddlywiki.com]] - //Build a deep, lasting understanding of TiddlyWiki//\n* [[TiddlyWiki Toolmap|https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM]]\n\n!!! Notes about ''official plugins''\n\n* There exists the useful [[BrowserStorage plugin|https://tiddlywiki.com/static/BrowserStorage%2520Plugin.html]], good when working on browsers that crash or when tabs reload themselves.\n** For optimal extra features like status indicators on tiddlers, or list of in-storage tiddlers, there exists the [[tw-browser-storage|https://btheado.github.io/tw-browser-storage]] plugin to extend the official one \u003C\u003C[# Git \"https://github.com/btheado/tw-browser-storage\">>. It has some technical issues so I made some edits: [[$:/plugins/btheado/BrowserStorage (drag to install)|$:/plugins/btheado/BrowserStorage]].\n\n!!! Misc\n\n* [[Fun with Feeds (a proof of concept RSS reader)|https://talk.tiddlywiki.org/t/fun-with-feeds-a-proof-of-concept-rss-reader/6490]] --- \u003C\u003C[# TiddlyWiki\"https://saqimtiaz.github.io/sq-tw/temp/feedreader.html\">> (use CTRL+Shift+L to switch to normal UI)\n\n* [[Has anyone generated an RSS feed from TiddlyWiki?|https://talk.tiddlywiki.org/t/has-anyone-generated-an-rss-feed-from-tiddlywiki/966/25]]\n** [[RSS and Atom Feeds for your TiddlyWiki|https://techlifeweb.com/tiddlywiki/tw5tribalknowledge/static/RSS%2520and%2520Atom%2520Feeds%2520for%2520your%2520TiddlyWiki.html]]\n\n* [[Sttot Stack|https://gk0wk.github.io/]] --- gk0wk wiki displayed with a particular tiddler reader web-app, not based on the real TW app\n\n\u003C\u003C{\u003C TiddlyWiki/ThirdParty>>\n\n!!! ''Useful Documentation or Articles''\n* \u003C\u003CTwL \" DateFormat \">>\n* \u003C\u003CTwL \" [[Filter Operators]] \">>\n** \u003C\u003CTwLL \"search Operator\">>: uses the inbuilt search engine to retrieve data\n* \u003C\u003CTwL \" MacroCallWidget SetWidget VarsWidget\">>\n* \u003C\u003CTwL \" EditTextWidget RangeWidget CheckboxWidget\">>\n* \u003C\u003CTwL \" [[Table-of-Contents Macros (Examples)]] \">>\n* \u003C\u003CTwL \" [[How to create dynamic editor toolbar buttons]] [[How to create keyboard shortcuts]] \">>\n* [[How to Use Unicode Character (emoji) as Icon of Tags|https://dmitryrck.com/unicode-character-icon-of-tags-tiddlywiki/]] \u003C\u003CTwL \" [[How to create a custom tiddler icon rule]] \">>\n* [[How To Use Tiddlywiki as a Static Site Generator|https://rpdillon.net/how-to-use-tiddlywiki-as-a-static-site-generator.html]]\n\n\u003C\u003C{\u003C TiddlyWiki/Notes 3>>\n\n!! ''Notes/Personal''\n* [[OcttKB/WIP]]"}, +{"title":"TiddlyWiki","created":"20220924193842295","creator":"Octt","icon":"🐈","modified":"20240130003932997","modifier":"Octt","page-cover":"https://source.unsplash.com/random/?computer-cat","tags":"TiddlyWiki Wiki Zettelkasten Libre","text":"\\define TwLL(Tid) [[$Tid$|https://tiddlywiki.com/#$Tid$]]\n\n\\define TwL(List)\n|\n\u003C$list filter=\"$List$\">\n \u003C$macrocall $name=\"TwLL\" Tid=\u003C\u003CcurrentTiddler>> />\n |\n\u003C/$list>\n\\end\n\n[[TiddlyWiki|https://tiddlywiki.com]] is the software upon which this website is built.\n\nIt is a libre, JavaScript-rich, non-linear notebook, that can well adapt to anyone's way of building a logically interconnected information database.\n\n\u003C\u003C^wikipediaframe TiddlyWiki en>>\n\n; What I like\n: All your content and app runtime can stay inside a single HTML file; it will probably work fine in browsers in the decades to come.\n: The base software runs both in the web browser (ES5 or higher?) and [[Node.js]]; the latter makes it possibile to export tiddlers to a file system programmatically, generate static sites, etc...\n: Feature-rich and powerful out of the box, with (up to a certain point) high extensibility.\n: Big community, meaning you can often get help with problems, and many third-party plugins are available.\n: The default configuration works fine on mobile devices, unlike what happens with some plugins.\n\n; What I don't like\n: The Widgets/Filters/Macros systems is based on proprietary paradigms; they are made to allow people without programming experience to do great things, but are cumbersome and hard to learn if you already have common programming experience.\n: [[JavaScript]] extensions are cumbersome, requiring a page reload to work after an edit\n: It's not easy, or sometimes it's not possibile, to extend TiddlyWiki with just pure JavaScript, and trying to do so always requires ugly hacks.\n: Widgets and Filters are essentially an interpreted language working on top of an interpreted language (JS); Since even the app core makes heavy use of them, it suffers from microlags even on modern devices, and can be's almost unusable on very old ones.\n: No built-in tiddler compression and decompression means the HTML file is big by default (~2.3 MB as of v5.2.3) and can get worse with many plugins, causing slow loading and saving.\n\n!! ''Useful Resources''\n\n* Official Git Repos: [[TiddlyWiki5 Source|https://github.com/Jermolene/TiddlyWiki5]], [[Others|https://github.com/TiddlyWiki]]\n* Official Docs: [[Standard|https://tiddlywiki.com]], [[Dev|https://tiddlywiki.com/dev]]\n* [[Links Aggregator|https://links.tiddlywiki.org]]\n* [[Grok TiddlyWiki|https://groktiddlywiki.com]] - //Build a deep, lasting understanding of TiddlyWiki//\n* [[TiddlyWiki Toolmap|https://dynalist.io/d/zUP-nIWu2FFoXH-oM7L7d9DM]]\n\n!!! Notes about ''official plugins''\n\n* There exists the useful [[BrowserStorage plugin|https://tiddlywiki.com/static/BrowserStorage%2520Plugin.html]], good when working on browsers that crash or when tabs reload themselves.\n** For optimal extra features like status indicators on tiddlers, or list of in-storage tiddlers, there exists the [[tw-browser-storage|https://btheado.github.io/tw-browser-storage]] plugin to extend the official one \u003C\u003C[# Git \"https://github.com/btheado/tw-browser-storage\">>. It has some technical issues so I made some edits: [[$:/plugins/btheado/BrowserStorage (drag to install)|$:/plugins/btheado/BrowserStorage]].\n\n!!! Misc\n\n* [[Fun with Feeds (a proof of concept RSS reader)|https://talk.tiddlywiki.org/t/fun-with-feeds-a-proof-of-concept-rss-reader/6490]] --- \u003C\u003C[# TiddlyWiki\"https://saqimtiaz.github.io/sq-tw/temp/feedreader.html\">> (use CTRL+Shift+L to switch to normal UI)\n\n* [[Has anyone generated an RSS feed from TiddlyWiki?|https://talk.tiddlywiki.org/t/has-anyone-generated-an-rss-feed-from-tiddlywiki/966/25]]\n** [[RSS and Atom Feeds for your TiddlyWiki|https://techlifeweb.com/tiddlywiki/tw5tribalknowledge/static/RSS%2520and%2520Atom%2520Feeds%2520for%2520your%2520TiddlyWiki.html]]\n\n* [[Sttot Stack|https://gk0wk.github.io/]] --- gk0wk wiki displayed with a particular tiddler reader web-app, not based on the real TW app\n\n\u003C\u003C{\u003C TiddlyWiki/ThirdParty>>\n\n!!! ''Useful Documentation or Articles''\n* \u003C\u003CTwL \" DateFormat \">>\n* \u003C\u003CTwL \" [[Filter Operators]] \">>\n** \u003C\u003CTwLL \"search Operator\">>: uses the inbuilt search engine to retrieve data\n** \u003C\u003CTwLL \"contains Operator\">>: checks if some name is contained in a list-formatted field (`list` by default)\n* \u003C\u003CTwLL \"DraggableWidget\">> --- to create custom draggables, for copying specific data to other wikis by drag-n-drop\n* \u003C\u003CTwL \" MacroCallWidget SetWidget VarsWidget\">>\n* \u003C\u003CTwL \" EditTextWidget RangeWidget CheckboxWidget\">>\n* \u003C\u003CTwL \" [[Table-of-Contents Macros (Examples)]] \">>\n* \u003C\u003CTwL \" [[How to create dynamic editor toolbar buttons]] [[How to create keyboard shortcuts]] \">>\n* [[How to Use Unicode Character (emoji) as Icon of Tags|https://dmitryrck.com/unicode-character-icon-of-tags-tiddlywiki/]] \u003C\u003CTwL \" [[How to create a custom tiddler icon rule]] \">>\n* [[How To Use Tiddlywiki as a Static Site Generator|https://rpdillon.net/how-to-use-tiddlywiki-as-a-static-site-generator.html]]\n\n\u003C\u003C{\u003C TiddlyWiki/Notes 3>>\n\n!! ''Notes/Personal''\n* [[OcttKB/WIP]]"}, {"title":"TiddlyWiki/Notes","created":"20230127155833205","creator":"Octt","modified":"20240129135702958","modifier":"Octt","tags":"TiddlyWiki $:/i18n:en Discussion","text":"!!! ''Discussions and Solutions''\n\nDiscussions that helped or might help me solve problems, some started by me. And also some that are just plain interesing.\n\n* [[How do you edit your wiki with both the web app and external editors?|https://talk.tiddlywiki.org/t/how-do-you-edit-your-wiki-with-both-the-web-app-and-external-editors/6320]]\n* [[Multilanguage Wiki - Found a solution, but need help for improving it|https://talk.tiddlywiki.org/t/multilanguage-wiki-found-a-solution-but-need-help-for-improving-it/4672]]\n\n\u003Cdiv/>\n\n* [[Date time wiki last updated or saved?|https://groups.google.com/g/TiddlyWiki/c/RxJdciY7yZY]]\n* [[Disable CodeMirror when on Mobile|https://github.com/Jermolene/TiddlyWiki5/issues/2730]]\n* [[Footnotes|https://groups.google.com/g/tiddlywiki/c/u5A6qK7CmrY]]\n* [[I want to edit something, oh no that's a transclusion|https://groups.google.com/g/TiddlyWiki/c/tYgM6kh9lNA]] | [[How do I transclude an edit window of a tiddler?|https://groups.google.com/g/tiddlywiki/c/GsMkfxSPkmA/m/cxGdAieIBgAJ]] | [[How to quickly navigate to a transcluded tiddler?|https://talk.tiddlywiki.org/t/how-to-quickly-navigate-to-a-transcluded-tiddler/4535/5]]\n* [[Is there way to make TiddlyWiki system-wide case insensitive?|https://groups.google.com/g/tiddlywiki/c/BcEF4fTzCj8]]\n* [[Macro to Create TOC Like Table with Dot Leader|https://talk.tiddlywiki.org/t/a-macro-to-create-toc-like-table-with-dot-leader/1232]]\n* [[Simple Javascript insertion in tiddlers (text/vnd.tiddlywiki)|https://groups.google.com/g/tiddlywiki/c/NwOI-QER2ig/m/lSLS3XolwDoJ]]\n* [[[TW5] Tag (Text) Cloud for TW5?|https://groups.google.com/g/tiddlywiki/c/_YE1pjZMFkg]] | [[TagCloud plugin|https://groups.google.com/g/tiddlywiki/c/VQPaJC6yyWM]]\n* [[Setting HTML attributes with a macro?|https://groups.google.com/g/tiddlywiki/c/Qp8Fzi0BR5I/m/N65Q6thTEwAJ]]\n* [[[Plugin] Presenting TW5-Uglify! Plugin compression the TiddlyWIki way!|https://groups.google.com/g/tiddlywiki/c/-kIVw00crRQ]]\n* [[TiddlyWiki Tiddler Editor: How to Improve the Usability?|https://talk.tiddlywiki.org/t/tiddlywiki-tiddler-editor-how-to-improve-the-usability/4657]]\n* [[Using conditional assignment mode of SetWidget to check empty strings|https://groups.google.com/g/tiddlywiki/c/Pzv5FDb9oHE/m/mh5Pzm7xAgAJ]]\n* [[Notes on handling variables in TiddlyWiki|https://www.chrisnicoll.net/2020/02/notes-on-handling-variables-in-tiddlywiki/]]\n* [[Macros are not functions (Grok TW)|https://groktiddlywiki.com/static/Macros%2520are%2520not%2520functions.html]]\n* [[Wikification (Grok TW)|https://groktiddlywiki.com/static/Wikification.html]]\n\n!!! Filters\n\n* [[Filter based on integer field values less than or equal to|https://groups.google.com/g/Tiddlywiki/c/EfRToFFXCh0]] --- `[...]compare:integer:lteq[num]then[...]`\n"}, -{"title":"TiddlyWiki/ThirdParty","created":"20230206113426599","creator":"Octt","modified":"20240129140045004","modifier":"Octt","tags":"","text":"!!! ''Other Wikis, Plugin Collections''\n\n* [[BrainTest|https://braintest.tiddlyspot.com]] --- //tools for a digital brain//\n* [[Calendar|https://tabbed-calendar.tiddlyspot.com]] --- //a tabbed picture calendar//\n* [[Formulas for TiddlyWiki|https://chronicles.wiki/TiddlyWikiFormula/]] --- //spreadsheet-inspired number crunching//\n* [[Joe's Blog|https://joearms.github.io]] --- Contains the [[Chandler|https://joearms.github.io/#2018-12-26%20Fun%20with%20the%20TiddlyWiki]] prototype time-management tool\n* [[kookma's codes, macros, and solutions in TW|https://kookma.github.io/TW-Scripts]]\n** Kookma Plugin Library --- \u003C\u003C[ \"[[Drag To Install|$:/config/KookmaPluginLibrary]]\">>\n** [[Shiraz|https://kookma.github.io/TW-Shiraz/]] --- //small framework of stylesheets, templates and macros to create stylish contents in Tiddlywiki//\n* [[NoteSelf|https://noteself.org]] --- TiddlyWiki fork/flavor with interesting features built-in - [[[Git|https://github.com/NoteSelf]]]\n* [[Projectify|https://thaddeusjiang.github.io/Projectify]] --- //Project management for TiddlyWiki// - [[[Git|https://github.com/ThaddeusJiang/Projectify]]]\n* [[RR-TW5|https://rr-tw5.github.io/]] --- //A Roam Research Styled TiddlyWiki//\n* [[Saq's TW5 Sandbox|https://saqimtiaz.github.io/tw5-plugins-sandbox]] --- //Experimental doodads//\n* [[Stroll|https://giffmex.org/stroll/stroll.html]] --- //A Roam-like experience in a free, downloadable file//\n* [[The public musings of Soren Bjornstad (Zettelkasten)|https://zettelkasten.sorenbjornstad.com]]\n* [[TiddlyMap|http://tiddlymap.org]] --- //Map drawing and topic visualization for your wiki!// --- [[[Git|https://github.com/felixhayashi/TW5-TiddlyMap]]]\n* [[TiddlySeq|https://gk0wk.github.io/TiddlySeq/]] --- //Logseq-like TiddlyWiki Template// --- \u003C\u003C[ \"[[Git|https://github.com/Gk0Wk/TiddlySeq]]\">>\n* [[TiddlyTools for TW5|https://tiddlytools.com/]] --- //Small Tools for Big Ideas!™//\n* [[Tobias Beer's Plugins and Resources|https://tobibeer.github.io]] --- [[[Profile|https://tobibeer.github.io/tb5/#Tobias%20Beer]]] [[[Git|https://github.com/tobibeer]]]\n* [[TW5 CPL Wiki|https://tw-cpl.netlify.app]] --- //TiddlyWiki5 Plugin Library for TiddlyWiki Chinese Communities// --- \u003C\u003C[ \"[[Drag to install|$:/config/TiddlyWiki-CPL/GitHub]]\">>\n* [[TW5 Magick|https://tw5magick.tiddlyspot.com]] --- //Some tricks and snippets for TiddlyWiki 5//\n* [[TW5 Plugins, Themes, Hacks by Thomas Elmiger|https://tid.li/tw5/]] --- //Build or optimise your own application for notetaking, writing or a ToDo-list system with these tools//\n** [[Presenting the Details Widget|https://groups.google.com/g/tiddlywiki/c/sRUVnlIaT3E]]\n* [[ZemoxWiki|https://zemox.tiddlyspot.com]] --- //a haphazard meandering of notes, thoughts, experiments, links...//\n\n!!!! Starter Kits, themed wikis for use\n\n* [[TiddlyWiki Starter Kit 📦|https://tiddlywiki-starter-kit.oeyoews.top/]]\n\n!!!! ''More personal TiddlyWikis''\n* [[Dave and Blanca Gifford's homepage|https://giffmex.org/Welcome.html]]\n* [[Eberron Tiddlywiki|https://eberron.tiddlyhost.com/]] --- //campaign setting for D&D designed for telling fantastical pulp and noir stories// --- \u003C\u003C[ \"[[Git|https://github.com/wccbuck/eberron_tw/]]\">>\n* [[ℍ𝕪𝕡𝕖𝕣𝔱𝔢𝔵𝔱: h0p3|https://h0p3.neocities.org/]] (old domain: [[philosopher.life|https://web.archive.org/web/20221227170107/https://philosopher.life/]])\n* [[makiaea|https://makiaea.org/00045/20230414makiaea.html]] --- contains a cool/strange choose-your-own-adventure thing\n\n!!!! ''Individual Plugins''\n\n* [[Archipel|https://archipel.tiddlyspot.com/]] --- //Data visualization Knowledge map of tiddler's ToC, as zoomable circle packs// --- [[[Discussion|https://groups.google.com/g/tiddlywiki/c/wZZ-84FV0-k]]]\n* [[CodeMirrorPlus|https://adithya-badidey.github.io/TW5-codemirror-plus/]] --- //A better editor for TW5, based on ~CodeMirror// --- [[Demo|https://adithya-badidey.github.io/TW5-codemirror-plus/wiki.html]] | [[Git|https://github.com/adithya-badidey/TW5-codemirror-plus]]\n* [[[Release] Codemirror6 Plugin|https://talk.tiddlywiki.org/t/release-codemirror6-plugin/8843]] \u003C\u003C[# Git \"https://github.com/oeyoews/tiddlywiki-codemirror6\">> \u003C\u003C[# Demo \"https://oeyoews.github.io/tiddlywiki-codemirror6/#%24%3A%2Fplugins%2Foeyoews%2Ftiddlywiki-codemirror-6\">>\n* [[Command Palette|https://souk21.github.io/TW-commandpalette/]] --- \u003C\u003C[# Git \"https://github.com/Souk21/TW-commandpalette\">>\n* [[Context Plugin|https://contextplugin.tiddlyspot.com]] --- //search with context//\n* [[Daily Notes|https://github.com/akhater/Daily-Notes-for-TW5]] - //Interstitial Journaling plugin//\n* [[ECharts|https://tiddly-gittly.github.io/tw-echarts]] [[[Git|https://github.com/tiddly-gittly/tw-echarts]], [[Thread|https://talk.tiddlywiki.org/t/echarts-bringing-amazing-visualization-tools-to-tiddlywiki/1944]]] --- //An All-in-one Visualization Framework for TiddlyWiki5 based on ECharts//\n* [[enable-js|http://tobibeer.github.io/tw/enable-js]] --- //using inline script tags//\n* [[find-in-page-plugin|https://tiddlywiki-find-in-page-plugin.tiddlyhost.com/]] --- //finds text in tiddlers currently view//, basically replicates the browser CTRL+F feature but integrates it with the wiki search box\n* [[ibox|https://tobibeer.github.io/tw/ibox]] - //pretty-show images in tw5//\n* [[TW5 Locator|https://bimlas.gitlab.io/tw5-locator/]] --- //discover and search by context//, with polished field filtering features --- \u003C\u003C[ \"[[Git|https://gitlab.com/bimlas/tw5-locator]]\">>\n* [[Notion-like Icon And PageCover|https://gk0wk.github.io/TiddlySeq/#Notion-like%20Icon%20And%20PageCover]] --- \u003C\u003C[ \"[[Thread|https://talk.tiddlywiki.org/t/notion-like-icon-and-pagecover/1741]]\">>\n* [Kookma] [[Refnotes|https://kookma.github.io/TW-Refnotes/]] --- //references, citations, footnotes and abbreviations// --- [[[Git|https://github.com/kookma/TW-Refnotes]]]\n* \u003C\u003Clinkdescgit Relink \"https://flibbles.github.io/tw5-relink\" \"flexibility when relinking renamed tiddlers\" \"https://github.com/flibbles/tw5-relink\">>\n* [[Section Editor|https://kookma.github.io/TW-Section]] --- //create, edit, fold, manage sections// --- [[Git|https://github.com/kookma/TW-Section]] | [[Prototype discussion|https://talk.tiddlywiki.org/t/section-editor-prototype/951]]\n* \u003C\u003Clink+desc+git Streams \"https://saqimtiaz.github.io/streams/\" \"Streams is a keyboard friendly way to write and easily divide your text into separate tiddlers while writing.\" \"https://github.com/saqimtiaz/streams\">> --- Adds a structural-visual hierarchy system to TiddlyWiki like Notion/Logseq.\n* [[Syntax-Highlighting Tiny Editor|https://talk.tiddlywiki.org/t/tw5-ready-to-play-prototype-syntax-highlighting-tiny-editor/4569]] (Ready-to-play prototype) --- [[Download|https://talk.tiddlywiki.org/uploads/short-url/853ile3OvoeJ9uowpv0YYXnKhSe.json]]\n\n* [[Keyboard Navigation|https://keynav.tiddlyhost.com/]] --- //A plugin to add keyboard navigation of TiddlyWiki's Story River.//\n* [[tw5-keyboard-navigation|https://maximilian-schillinger.de/tw5-keyboard-navigation-plugin.html]] --- //Navigate through your TiddlyWiki5 with your keyboard: jump to next/previous tiddler, edit or close tiddler// --- \u003C\u003C[# Git\"https://github.com/MaxGyver83/tw5-keyboard-navigation\">>\n\n* [[TWCrossLinks|https://github.com/akhater/TWCrossLinks]] --- //Discover all your intra-tiddlers links//\n\n!!!! ''Individual Themes''\n\n* [[Notebook theme|https://nicolas.petton.fr/tw/notebook.html]] --- //clean, uncluttered theme for TiddlyWiki// --- \u003C\u003C[# Git\"https://github.com/NicolasPetton/notebook\">>\n* [[👻✨ whitespace theme|http://j.d.whitespace.tiddlyspot.com/]] --- //negative-spacious, webapp-nostalgic theme for TiddlyWiki//\n"}, +{"title":"TiddlyWiki/ThirdParty","created":"20230206113426599","creator":"Octt","modified":"20240129233143233","modifier":"Octt","tags":"","text":"!!! ''Other Wikis, Plugin Collections''\n\n* [[BrainTest|https://braintest.tiddlyspot.com]] --- //tools for a digital brain//\n* [[Calendar|https://tabbed-calendar.tiddlyspot.com]] --- //a tabbed picture calendar//\n* [[Formulas for TiddlyWiki|https://chronicles.wiki/TiddlyWikiFormula/]] --- //spreadsheet-inspired number crunching//\n* [[Joe's Blog|https://joearms.github.io]] --- Contains the [[Chandler|https://joearms.github.io/#2018-12-26%20Fun%20with%20the%20TiddlyWiki]] prototype time-management tool\n* [[kookma's codes, macros, and solutions in TW|https://kookma.github.io/TW-Scripts]]\n** Kookma Plugin Library --- \u003C\u003C[ \"[[Drag To Install|$:/config/KookmaPluginLibrary]]\">>\n** [[Shiraz|https://kookma.github.io/TW-Shiraz/]] --- //small framework of stylesheets, templates and macros to create stylish contents in Tiddlywiki//\n* [[NoteSelf|https://noteself.org]] --- TiddlyWiki fork/flavor with interesting features built-in - [[[Git|https://github.com/NoteSelf]]]\n* [[Projectify|https://thaddeusjiang.github.io/Projectify]] --- //Project management for TiddlyWiki// - [[[Git|https://github.com/ThaddeusJiang/Projectify]]]\n* [[RR-TW5|https://rr-tw5.github.io/]] --- //A Roam Research Styled TiddlyWiki//\n* [[Saq's TW5 Sandbox|https://saqimtiaz.github.io/tw5-plugins-sandbox]] --- //Experimental doodads//\n* [[Stroll|https://giffmex.org/stroll/stroll.html]] --- //A Roam-like experience in a free, downloadable file//\n* [[The public musings of Soren Bjornstad (Zettelkasten)|https://zettelkasten.sorenbjornstad.com]]\n* [[TiddlyMap|http://tiddlymap.org]] --- //Map drawing and topic visualization for your wiki!// --- [[[Git|https://github.com/felixhayashi/TW5-TiddlyMap]]]\n* [[TiddlySeq|https://gk0wk.github.io/TiddlySeq/]] --- //Logseq-like TiddlyWiki Template// --- \u003C\u003C[ \"[[Git|https://github.com/Gk0Wk/TiddlySeq]]\">>\n* [[TiddlyTools for TW5|https://tiddlytools.com/]] --- //Small Tools for Big Ideas!™//\n* [[Tobias Beer's Plugins and Resources|https://tobibeer.github.io]] --- [[[Profile|https://tobibeer.github.io/tb5/#Tobias%20Beer]]] [[[Git|https://github.com/tobibeer]]]\n* [[TW5 CPL Wiki|https://tw-cpl.netlify.app]] --- //TiddlyWiki5 Plugin Library for TiddlyWiki Chinese Communities// --- \u003C\u003C[ \"[[Drag to install|$:/config/TiddlyWiki-CPL/GitHub]]\">>\n* [[TW5 Magick|https://tw5magick.tiddlyspot.com]] --- //Some tricks and snippets for TiddlyWiki 5//\n* [[TW5 Plugins, Themes, Hacks by Thomas Elmiger|https://tid.li/tw5/]] --- //Build or optimise your own application for notetaking, writing or a ToDo-list system with these tools//\n** [[Presenting the Details Widget|https://groups.google.com/g/tiddlywiki/c/sRUVnlIaT3E]]\n* [[ZemoxWiki|https://zemox.tiddlyspot.com]] --- //a haphazard meandering of notes, thoughts, experiments, links...//\n\n!!!! Starter Kits, themed wikis for use\n\n* [[TiddlyWiki Starter Kit 📦|https://tiddlywiki-starter-kit.oeyoews.top/]]\n\n!!!! ''More personal TiddlyWikis''\n* [[Dave and Blanca Gifford's homepage|https://giffmex.org/Welcome.html]]\n* [[Eberron Tiddlywiki|https://eberron.tiddlyhost.com/]] --- //campaign setting for D&D designed for telling fantastical pulp and noir stories// --- \u003C\u003C[ \"[[Git|https://github.com/wccbuck/eberron_tw/]]\">>\n* [[ℍ𝕪𝕡𝕖𝕣𝔱𝔢𝔵𝔱: h0p3|https://h0p3.neocities.org/]] (old domain: [[philosopher.life|https://web.archive.org/web/20221227170107/https://philosopher.life/]])\n* [[makiaea|https://makiaea.org/00045/20230414makiaea.html]] --- contains a cool/strange choose-your-own-adventure thing\n\n!!!! ''Individual Plugins''\n\n* [[Archipel|https://archipel.tiddlyspot.com/]] --- //Data visualization Knowledge map of tiddler's ToC, as zoomable circle packs// --- [[[Discussion|https://groups.google.com/g/tiddlywiki/c/wZZ-84FV0-k]]]\n* [[CodeMirrorPlus|https://adithya-badidey.github.io/TW5-codemirror-plus/]] --- //A better editor for TW5, based on ~CodeMirror// --- [[Demo|https://adithya-badidey.github.io/TW5-codemirror-plus/wiki.html]] | [[Git|https://github.com/adithya-badidey/TW5-codemirror-plus]]\n* [[[Release] Codemirror6 Plugin|https://talk.tiddlywiki.org/t/release-codemirror6-plugin/8843]] \u003C\u003C[# Git \"https://github.com/oeyoews/tiddlywiki-codemirror6\">> \u003C\u003C[# Demo \"https://oeyoews.github.io/tiddlywiki-codemirror6/#%24%3A%2Fplugins%2Foeyoews%2Ftiddlywiki-codemirror-6\">>\n* [[Command Palette|https://souk21.github.io/TW-commandpalette/]] --- \u003C\u003C[# Git \"https://github.com/Souk21/TW-commandpalette\">>\n* [[Context Plugin|https://contextplugin.tiddlyspot.com]] --- //search with context//\n* [[Daily Notes|https://github.com/akhater/Daily-Notes-for-TW5]] - //Interstitial Journaling plugin//\n* [[ECharts|https://tiddly-gittly.github.io/tw-echarts]] [[[Git|https://github.com/tiddly-gittly/tw-echarts]], [[Thread|https://talk.tiddlywiki.org/t/echarts-bringing-amazing-visualization-tools-to-tiddlywiki/1944]]] --- //An All-in-one Visualization Framework for TiddlyWiki5 based on ECharts//\n* [[enable-js|http://tobibeer.github.io/tw/enable-js]] --- //using inline script tags//\n* [[find-in-page-plugin|https://tiddlywiki-find-in-page-plugin.tiddlyhost.com/]] --- //finds text in tiddlers currently view//, basically replicates the browser CTRL+F feature but integrates it with the wiki search box\n* [[ibox|https://tobibeer.github.io/tw/ibox]] - //pretty-show images in tw5//\n* [[TW5 Locator|https://bimlas.gitlab.io/tw5-locator/]] --- //discover and search by context//, with polished field filtering features --- \u003C\u003C[ \"[[Git|https://gitlab.com/bimlas/tw5-locator]]\">>\n* [[Notion-like Icon And PageCover|https://gk0wk.github.io/TiddlySeq/#Notion-like%20Icon%20And%20PageCover]] --- \u003C\u003C[ \"[[Thread|https://talk.tiddlywiki.org/t/notion-like-icon-and-pagecover/1741]]\">>\n* [Kookma] [[Refnotes|https://kookma.github.io/TW-Refnotes/]] --- //references, citations, footnotes and abbreviations// --- [[[Git|https://github.com/kookma/TW-Refnotes]]]\n* \u003C\u003Clinkdescgit Relink \"https://flibbles.github.io/tw5-relink\" \"flexibility when relinking renamed tiddlers\" \"https://github.com/flibbles/tw5-relink\">>\n* [[Section Editor|https://kookma.github.io/TW-Section]] --- //create, edit, fold, manage sections// --- [[Git|https://github.com/kookma/TW-Section]] | [[Prototype discussion|https://talk.tiddlywiki.org/t/section-editor-prototype/951]]\n* \u003C\u003Clink+desc+git Streams \"https://saqimtiaz.github.io/streams/\" \"Streams is a keyboard friendly way to write and easily divide your text into separate tiddlers while writing.\" \"https://github.com/saqimtiaz/streams\">> --- Adds a structural-visual hierarchy system to TiddlyWiki like Notion/Logseq.\n* [[NotoWritey|https://marxsal.github.io/various/notowritey.html]] --- //text editor and outliner for ~TiddlyWiki that allows you to concentrate on writing documents one section (tiddler) at a time//\n* [[Syntax-Highlighting Tiny Editor|https://talk.tiddlywiki.org/t/tw5-ready-to-play-prototype-syntax-highlighting-tiny-editor/4569]] (Ready-to-play prototype) --- [[Download|https://talk.tiddlywiki.org/uploads/short-url/853ile3OvoeJ9uowpv0YYXnKhSe.json]]\n\n* [[Keyboard Navigation|https://keynav.tiddlyhost.com/]] --- //A plugin to add keyboard navigation of TiddlyWiki's Story River.//\n* [[tw5-keyboard-navigation|https://maximilian-schillinger.de/tw5-keyboard-navigation-plugin.html]] --- //Navigate through your TiddlyWiki5 with your keyboard: jump to next/previous tiddler, edit or close tiddler// --- \u003C\u003C[# Git\"https://github.com/MaxGyver83/tw5-keyboard-navigation\">>\n\n* [[TWCrossLinks|https://github.com/akhater/TWCrossLinks]] --- //Discover all your intra-tiddlers links//\n\n!!!! ''Individual Themes''\n\n* [[Notebook theme|https://nicolas.petton.fr/tw/notebook.html]] --- //clean, uncluttered theme for TiddlyWiki// --- \u003C\u003C[# Git\"https://github.com/NicolasPetton/notebook\">>\n* [[👻✨ whitespace theme|http://j.d.whitespace.tiddlyspot.com/]] --- //negative-spacious, webapp-nostalgic theme for TiddlyWiki//\n"}, {"title":"TiddlyWiki/TipsAndTricks","created":"20240128224928644","creator":"Octt","modified":"20240129005505907","modifier":"Octt","tags":"","text":"* [[A Beautiful Searchbox in Tiddlywiki|https://talk.tiddlywiki.org/t/a-beautiful-searchbox-in-tiddlywiki-5-2-0/1476]]\n* [[A Notebox Example ii: A Little More WikText and CSS|https://talk.tiddlywiki.org/t/a-notebox-example-ii-a-little-more-wiktext-and-css/6640]]\n* [[Create a Searchable FAQ Page|https://talk.tiddlywiki.org/t/create-a-searchable-faq-page/6406]]\n* [[Ribbon Title Using Modern CSS|https://talk.tiddlywiki.org/t/ribbon-title-using-modern-css/6957]]\n* [[Search your nodejs wiki in Google (and other engines)|https://talk.tiddlywiki.org/t/search-your-nodejs-wiki-in-google/8195]] --- \u003C\u003C[# Userscript \"https://openuserjs.org/scripts/linonetwo/TiddlyWiki5_Combine_TW5_and_search_engine_results\">>\n** it's broken on many engines other than Google, I will probably upload a patch for some when I have time\n* [[Tiddler Ribbon Using Pure CSS and Simple Macro|https://talk.tiddlywiki.org/t/tiddler-ribbon-using-pure-css-and-simple-macro/6999]]\n"}, {"title":"TikTok","created":"20230302115207149","creator":"Octt","modified":"20230302120409257","modifier":"Octt","tags":"Proprietary China","text":"\u003C\u003C^wikipediaframe TikTok>>\n\n!!! ''News''\n\n; February 2023\n: \u003C\u003CTwitterLink memotv/status/1629905103724396546 \"Launched scarily impeccable make-up filter that resists to the most estreme face coverings/deformations.\">>\n: \u003C\u003CTwitterLink memotv/status/1628758590033993728 \"Launched AI filter making you look like a teenager.\">>\n"}, {"title":"Tor","created":"20230205143040968","creator":"Octt","modified":"20230206222648217","modifier":"Octt","tags":"Internet Privacy","text":"* https://www.torproject.org/\n* https://gitlab.torproject.org/tpo/\n\n\u003C\u003CMediaWiki Tor_(network) en 1>>\n\n* [[mkp224o|https://github.com/cathugger/mkp224o]] --- //vanity address generator for ed25519 onion services//\n"}, diff --git a/Static.html b/Static.html index 4fdbac3f..f110c8c5 100644 --- a/Static.html +++ b/Static.html @@ -7071,11 +7071,14 @@
Dash is an experimental digital currency that enables instant, private payments to anyone, anywhere in the world.
It's a fork of Bitcoin. There are some advantages, some technical and some situational, but a strange disadvantage I have seen appears to be that wallet syncs take a lot of time.
Simple, eco-friendly, centralized coin that can be mined with microcontrollers.
Dash is an experimental digital currency that enables instant, private payments to anyone, anywhere in the world.
It's a fork of Bitcoin. There are some advantages, some technical and some situational, but a strange disadvantage I have seen appears to be that wallet syncs take a lot of time.
Simple, eco-friendly, centralized coin that can be mined with microcontrollers.
pointer-events: none;
for the functional side, + other rules for styling@import "style.css";
or @import url("style.css");
pointer-events: none;
for the functional side, + other rules for stylingWikipedia
+
+
+
+
+
Note: some are still in Web/Development
jsdom
: JavaScript implementation of various web standards, for use with Node.js — [Git]try { ... } catch(err) { console.log(err.response.data.message) }
These are for adding newer APIs to older browsers when making a webapp that uses them.
Note: some are still in Web/Development
jsdom
: JavaScript implementation of various web standards, for use with Node.js — [Git]try { ... } catch(err) { console.log(err.response.data.message) }
These are for adding newer APIs to older browsers when making a webapp that uses them.
return ...;
or rewrite ... last;
)apt install nginx-extras
, keeping in mind that it will rewrite the nginx core package, so any active nginx daemon will crash and need to be restarted./etc/nginx/modules-enabled
.return ...;
or rewrite ... last;
)location ... { add_header Access-Control-Allow-Origin *; }
apt install nginx-extras
, keeping in mind that it will rewrite the nginx core package, so any active nginx daemon will crash and need to be restarted./etc/nginx/modules-enabled
.Discussions that + -
Discussions that - -
Discussions that -
Interesting fonts, for specific uses or fun:
Good fonts, for multiple uses:
Interesting fonts, for specific uses or fun:
Good fonts, for multiple uses:
Discussions that -
Discussions that -
scoped
attribute for <style>
blocks, but it's nowadays deprecated and styles apply to all document elements despite their own position in the treescoped
attribute for <style>
blocks, but it's nowadays deprecated and styles apply to all document elements despite their own position in the treepointer-events: none;
for the functional side, + other rules for styling@import "style.css";
or @import url("style.css");
pointer-events: none;
for the functional side, + other rules for stylingDash is an experimental digital currency that enables instant, private payments to anyone, anywhere in the world.
It's a fork of Bitcoin. There are some advantages, some technical and some situational, but a strange disadvantage I have seen appears to be that wallet syncs take a lot of time.
Simple, eco-friendly, centralized coin that can be mined with microcontrollers.
Dash is an experimental digital currency that enables instant, private payments to anyone, anywhere in the world.
It's a fork of Bitcoin. There are some advantages, some technical and some situational, but a strange disadvantage I have seen appears to be that wallet syncs take a lot of time.
Simple, eco-friendly, centralized coin that can be mined with microcontrollers.
+Note: You're viewing the no-JS version of this site, some features will be missing. For the best experience, load the full version. +
+Wikipedia
+
+
+
+
+
Note: some are still in Web/Development
jsdom
: JavaScript implementation of various web standards, for use with Node.js — [Git]try { ... } catch(err) { console.log(err.response.data.message) }
These are for adding newer APIs to older browsers when making a webapp that uses them.
Note: some are still in Web/Development
jsdom
: JavaScript implementation of various web standards, for use with Node.js — [Git]try { ... } catch(err) { console.log(err.response.data.message) }
These are for adding newer APIs to older browsers when making a webapp that uses them.
return ...;
or rewrite ... last;
)apt install nginx-extras
, keeping in mind that it will rewrite the nginx core package, so any active nginx daemon will crash and need to be restarted./etc/nginx/modules-enabled
.return ...;
or rewrite ... last;
)location ... { add_header Access-Control-Allow-Origin *; }
apt install nginx-extras
, keeping in mind that it will rewrite the nginx core package, so any active nginx daemon will crash and need to be restarted./etc/nginx/modules-enabled
.Interesting fonts, for specific uses or fun:
Good fonts, for multiple uses:
Interesting fonts, for specific uses or fun:
Good fonts, for multiple uses:
scoped
attribute for <style>
blocks, but it's nowadays deprecated and styles apply to all document elements despite their own position in the treescoped
attribute for <style>
blocks, but it's nowadays deprecated and styles apply to all document elements despite their own position in the tree