diff --git a/1--conocer/wiki/backup/index-A2.html b/1--conocer/wiki/backup/index-A2.html index 87c0a6c..2c72c77 100644 --- a/1--conocer/wiki/backup/index-A2.html +++ b/1--conocer/wiki/backup/index-A2.html @@ -197,8 +197,6 @@ Error message and password prompt
  • $:/plugins/felixhayashi/topstoryview
  • -
  • $:/plugins/sq/streams-as-editor
  • -
  • $:/plugins/tiddlywiki/menubar
  • $:/plugins/tiddlywiki/menubar/items/about
  • @@ -452,7 +450,6 @@ Error message and password prompt {"created":"20230927220926364","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #ffffff\nbackground: #ffffff\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: \u003C\u003Ccolour background>>\ndragger-background: \u003C\u003Ccolour foreground>>\ndragger-foreground: \u003C\u003Ccolour background>>\ndropdown-background: #000000\ndropdown-border: #000000\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #4e4e4e\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: #000000\nmodal-background: #000000\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #000000\nnetwork-activity-foreground: #448844\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f5f2e9\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background: \nselection-foreground: \nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: \u003C\u003Ccolour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: #f5f2e9\ntiddler-border: #f5f2e9\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #4e4e4e\ntiddler-editor-background: #f5f2e9\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #888888\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: \u003C\u003Ccolour background>>\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #2b2b2b\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: \u003C\u003Ccolour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000","title":"$:/palettes/copincha","name":"Copincha","description":"Paleta de Copincha","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","color-scheme":"light","modified":"20230928055527395"}, {"text":"{\n \"tiddlers\": {\n \"$:/plugins/felixhayashi/respawn/respawn.js\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/respawn.js\",\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/respawn/respawn.js\\ntype: application/javascript\\nmodule-type: startup\\n\\n@preserve\\n\\n\\\\*/\\n\\n(function(){\\n \\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n \\\"use strict\\\";\\n \\n var configTRef = \\\"$:/plugins/felixhayashi/respawn/config\\\";\\n \\n var changeListener = function(changedTiddlers) {\\n \\n if(!changedTiddlers[\\\"$:/StoryList\\\"]) return;\\n \\n var tObj = $tw.wiki.getTiddler(\\\"$:/StoryList\\\");\\n if(tObj && !tObj.fields[\\\"list\\\"].length) {\\n \\n var confTObj = $tw.wiki.getTiddler(configTRef);\\n var config = confTObj ? confTObj.fields : {};\\n \\n window.setTimeout(function() {\\n $tw.rootWidget.dispatchEvent({\\n type: \\\"tm-home\\\"\\n });\\n }, parseInt(config.delay) || 500);\\n }\\n \\n };\\n \\n exports.name = \\\"respawn\\\";\\n exports.platforms = [\\\"browser\\\"];\\n exports.after = [\\\"story\\\"];\\n exports.synchronous = true;\\n \\n exports.startup = function() {\\n \\n $tw.wiki.addEventListener(\\\"change\\\", changeListener);\\n \\n };\\n\\n})();\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"startup\"\n },\n \"$:/plugins/felixhayashi/respawn/Configuration\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/Configuration\",\n \"text\": \"\u003C!-- The config output is not written to this tiddler! -->\\n\\nPlease see the [[GitHub page|https://github.com/felixhayashi/TW5-Respawn]] for more information on the options.\\n\\nYou may have to save and reload the wiki to activate changes.\\n\\n\u003Ctable>\\n \u003Ctr>\\n \u003Cth align=\\\"left\\\">Delay (seconds):\u003C/th>\\n \u003Ctd>\\n \u003C$edit-text\\n tiddler=\\\"$:/plugins/felixhayashi/respawn/config\\\"\\n field=\\\"delay\\\"\\n tag=\\\"input\\\"\\n default=\\\"500\\\" />\\n \u003C/td>\\n \u003C/tr>\\n\u003C/table>\"\n },\n \"$:/plugins/felixhayashi/respawn/License\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/License\",\n \"text\": \"This code is released under the BSD license. For the exact terms visit:\\n\\nhttps://github.com/felixhayashi/TW5-Respawn/blob/master/LICENSE\"\n },\n \"$:/plugins/felixhayashi/respawn/Readme\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/Readme\",\n \"text\": \"Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-Respawn]] for more information.\"\n }\n }\n}","version":"0.0.3","type":"application/json","title":"$:/plugins/felixhayashi/respawn","source":"https://github.com/felixhayashi/TW5-respawn","released":"","plugin-type":"plugin","list":"Configuration License Readme","description":"Respawn – Open default tiddlers when river is empty","dependents":"","core-version":">=5.1.5","author":"Felix Küppers"}, {"text":"{\n \"tiddlers\": {\n \"$:/plugins/felixhayashi/topstoryview/config.js\": {\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/topstoryview/config.js\\ntype: application/javascript\\nmodule-type: library\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";exports.config={classNames:{storyRiver:\\\"tc-story-river\\\",backDrop:\\\"story-backdrop\\\",tiddlerFrame:\\\"tc-tiddler-frame\\\",tiddlerTitle:\\\"tc-title\\\"},references:{userConfig:\\\"$:/config/topStoryView\\\",focussedTiddlerStore:\\\"$:/temp/focussedTiddler\\\",refreshTrigger:\\\"$:/temp/focussedTiddler/refresh\\\"},checkbackTime:$tw.utils.getAnimationDuration()}})();\",\n \"title\": \"$:/plugins/felixhayashi/topstoryview/config.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/felixhayashi/topstoryview/layout\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/layout\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"tags\": [\n \"$:/tags/Stylesheet\"\n ],\n \"text\": \"html .tc-story-river:after {\\n content: \\\"\\\";\\n display: block; }\\n\"\n },\n \"$:/plugins/felixhayashi/topstoryview/Configuration\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/Configuration\",\n \"text\": \"Please see the [[GitHub page|https://github.com/felixhayashi/TW5-TopStoryView]] for more information on the options.\\n\\nSave and reload the wiki to activate changes.\\n\\n\u003Ctable>\\n \u003Ctr>\\n \u003Cth align=\\\"left\\\">Scroll offset:\u003C/th>\\n \u003Ctd>\u003C$edit-text tiddler=\\\"$:/config/topStoryView\\\" field=\\\"scroll-offset\\\" tag=\\\"input\\\" default=\\\"150px\\\" />\u003C/td>\\n \u003C/tr>\\n\u003C/table>\"\n },\n \"$:/plugins/felixhayashi/topstoryview/License\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/License\",\n \"text\": \"This code is released under the BSD license. For the exact terms visit:\\n\\nhttps://github.com/felixhayashi/TW5-TopStoryView/blob/master/LICENSE\"\n },\n \"$:/plugins/felixhayashi/topstoryview/Readme\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/Readme\",\n \"text\": \"Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-TopStoryView]] for more information.\"\n },\n \"$:/plugins/felixhayashi/topstoryview/top.js\": {\n \"text\": \"/*\\\\\\ntitle: $:/plugins/felixhayashi/topstoryview/top.js\\ntype: application/javascript\\nmodule-type: storyview\\n\\nViews the story as a linear sequence\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";var t=require(\\\"$:/plugins/felixhayashi/topstoryview/config.js\\\").config;var e=\\\"cubic-bezier(0.645, 0.045, 0.355, 1)\\\";var i=function(e){this.listWidget=e;this.pageScroller=new $tw.utils.PageScroller;this.pageScroller.scrollIntoView=this.scrollIntoView;this.pageScroller.storyRiverDomNode=document.getElementsByClassName(t.classNames.storyRiver)[0];var i=$tw.wiki.getTiddler(t.references.userConfig);var o=i?i.fields:{};$tw.hooks.addHook(\\\"th-opening-default-tiddlers-list\\\",this.hookOpenDefaultTiddlers);var r=parseInt(o[\\\"scroll-offset\\\"]);this.pageScroller.scrollOffset=isNaN(r)?71:r;this.recalculateBottomSpace()};i.prototype.refreshStart=function(t,e){};i.prototype.refreshEnd=function(t,e){};i.prototype.hookOpenDefaultTiddlers=function(t){return t};i.prototype.navigateTo=function(t){var e=this.listWidget.findListItem(0,t.title);if(e===undefined)return;var i=this.listWidget.children[e];var o=i.findFirstDomNode();if(!(o instanceof Element))return;this.pageScroller.scrollIntoView(o)};i.prototype.insert=function(t){if(!t)return;var e=t.findFirstDomNode();if(!(e instanceof Element))return;this.startInsertAnimation(e,function(){this.recalculateBottomSpace()}.bind(this))};i.prototype.remove=function(t){if(!t)return;var e=t.findFirstDomNode();if(!(e instanceof Element)){t.removeChildDomNodes();return}var i=this.getLastFrame()===e;this.startRemoveAnimation(t,e,function(){t.removeChildDomNodes();this.recalculateBottomSpace();if(i){this.pageScroller.scrollIntoView(this.getLastFrame())}}.bind(this))};i.prototype.getLastFrame=function(){var t=this.listWidget.children[this.listWidget.children.length-1];return t?t.findFirstDomNode():null};i.prototype.recalculateBottomSpace=function(){var t=this.pageScroller.storyRiverDomNode;if(this.getLastFrame()){var e=this.getLastFrame().getBoundingClientRect();var i=window.innerHeight;if(e.height\u003Ci){t.style[\\\"paddingBottom\\\"]=i-e.height+\\\"px\\\";return}}t.style[\\\"paddingBottom\\\"]=\\\"\\\"};i.prototype.scrollIntoView=function(t){if(this.preventNextScrollAttempt){this.preventNextScrollAttempt=false}if(!t)return;var e=$tw.utils.getAnimationDuration();this.cancelScroll();this.startTime=Date.now();var i=$tw.utils.getScrollPosition();var o=t.getBoundingClientRect(),r={left:o.left+i.x,top:o.top+i.y,width:o.width,height:o.height};var n=function(t,e,i,o){if(t\u003C=i){return t}else if(e\u003Co&&i\u003Ct+e-o){return t+e-o}else if(i\u003Ct){return t}else{return i}},s=n(r.left,r.width,i.x,window.innerWidth),a=r.top-this.scrollOffset;if(s!==i.x||a!==i.y){var l=this,c;c=function(){var t;if(e\u003C=0){t=1}else{t=(Date.now()-l.startTime)/e}if(t>=1){l.cancelScroll();t=1}t=$tw.utils.slowInSlowOut(t);window.scrollTo(i.x+(s-i.x)*t,i.y+(a-i.y)*t);if(t\u003C1){l.idRequestFrame=l.requestAnimationFrame.call(window,c)}};c()}};i.prototype.startInsertAnimation=function(t,i){var o=$tw.utils.getAnimationDuration();var r=window.getComputedStyle(t),n=parseInt(r.marginBottom,10),s=parseInt(r.marginTop,10),a=t.offsetHeight+s;setTimeout(function(){$tw.utils.setStyle(t,[{transition:\\\"none\\\"},{marginBottom:\\\"\\\"}]);i()},o);$tw.utils.setStyle(t,[{transition:\\\"none\\\"},{marginBottom:-a+\\\"px\\\"},{opacity:\\\"0.0\\\"}]);$tw.utils.forceLayout(t);$tw.utils.setStyle(t,[{transition:\\\"opacity \\\"+o+\\\"ms \\\"+e+\\\", \\\"+\\\"margin-bottom \\\"+o+\\\"ms \\\"+e},{marginBottom:n+\\\"px\\\"},{opacity:\\\"1.0\\\"}])};i.prototype.startRemoveAnimation=function(t,i,o){var r=$tw.utils.getAnimationDuration();var n=i.offsetWidth,s=window.getComputedStyle(i),a=parseInt(s.marginBottom,10),l=parseInt(s.marginTop,10),c=i.offsetHeight+l;setTimeout(o,r);$tw.utils.setStyle(i,[{transition:\\\"none\\\"},{transform:\\\"translateX(0px)\\\"},{marginBottom:a+\\\"px\\\"},{opacity:\\\"1.0\\\"}]);$tw.utils.forceLayout(i);$tw.utils.setStyle(i,[{transition:$tw.utils.roundTripPropertyName(\\\"transform\\\")+\\\" \\\"+r+\\\"ms \\\"+e+\\\", \\\"+\\\"opacity \\\"+r+\\\"ms \\\"+e+\\\", \\\"+\\\"margin-bottom \\\"+r+\\\"ms \\\"+e},{transform:\\\"translateX(-\\\"+n+\\\"px)\\\"},{marginBottom:-c+\\\"px\\\"},{opacity:\\\"0.0\\\"}])};exports.top=i})();\",\n \"title\": \"$:/plugins/felixhayashi/topstoryview/top.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"storyview\"\n }\n }\n}","version":"0.2.0","type":"application/json","title":"$:/plugins/felixhayashi/topstoryview","source":"https://github.com/felixhayashi/TW5-TopStoryView","released":"","plugin-type":"plugin","list":"Configuration License Readme","description":"TopStoryView – Always scroll navigated tiddlers to the top","dependents":"","core-version":">=5.1.5","author":"Felix Küppers"}, -{"text":"{\n \"tiddlers\": {\n \"$:/plugins/sq/streams-as-editor/single-tiddler-streams.js\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/single-tiddler-streams.js\",\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/sq/streams-as-editor/single-tiddler-streams.js\\ntype: application/javascript\\nmodule-type: widget\\n\\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 UUID = (function() {\\n var self = {};\\n var lut = []; for (var i=0; i\u003C256; i++) { lut[i] = (i\u003C16?'0':'')+(i).toString(16); }\\n self.generate = function() {\\n\\tvar d0 = Math.random()*0xffffffff|0;\\n\\tvar d1 = Math.random()*0xffffffff|0;\\n\\tvar d2 = Math.random()*0xffffffff|0;\\n\\tvar d3 = Math.random()*0xffffffff|0;\\n\\treturn lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+\\n\\t lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+\\n\\t lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+\\n\\t lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];\\n }\\n return self;\\n})();\\n\\nvar SingleTiddlerStreamsWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSingleTiddlerStreamsWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSingleTiddlerStreamsWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.parentDomNode = parent;\\n\\t//this.renderChildren(parent,nextSibling);\\n\\n\\t\\n};\\n\\nSingleTiddlerStreamsWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar sourceTiddler = this.wiki.getTiddler(this.tiddlerTitle);\\n\\tif(!sourceTiddler) {\\n\\t\\treturn;\\n\\t}\\n\\tvar sourceText = \\\"\\\\n\\\\\\\\rules only list \\\\n\\\\n\\\" + this.wiki.getTiddlerText(this.tiddlerTitle);\\n\\tvar wikifyParser = this.wiki.parseText(\\\"text/vnd.tiddlywiki\\\",sourceText, {\\n\\t\\tparseAsInline : false\\n\\t});\\n\\tconsole.log(wikifyParser);\\n\\t\\n\\tvar tree = wikifyParser.tree;\\n\\tif(tree.length == 0 || tree[0].tag !== \\\"ul\\\" || tree.length !== 1) {\\n\\t\\treturn;\\n\\t}\\n\\tvar list = tree[0];\\n\\t\\n\\tthis.nodes = [];\\n\\tvar parentTiddlerFields = {\\n\\t\\ttitle: this.tiddlerTitle\\n\\t}\\n\\tthis.nodes.push(parentTiddlerFields);\\n\\tthis.processList(list,parentTiddlerFields);\\n\\tconsole.log(1);\\n\\t\\n\\tthis.createNodeTiddlers();\\n\\treturn true;\\n};\\n\\nSingleTiddlerStreamsWidget.prototype.createNodeTiddlers = function() {\\n\\tfor(var i=0; i\u003Cthis.nodes.length; i++) {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.nodes[i].title);\\n\\t\\tvar newTiddler = new $tw.Tiddler(tiddler,this.nodes[i]);\\n\\t\\tthis.wiki.addTiddler(newTiddler);\\n\\t}\\n};\\n\\n// process UL tag\\nSingleTiddlerStreamsWidget.prototype.processList = function(list,parentTiddler) {\\t\\t\\n\\tvar childNodes = [];\\n\\t\\t\\n\\tfor(var i=0; i\u003Clist.children.length; i++) {\\n\\n\\t\\tvar tiddler = {\\n\\t\\t\\t\\\"title\\\": \\\"$:/streams/temp/\\\" + this.tiddlerTitle + \\\"/\\\" + UUID.generate(),\\n\\t\\t\\t\\\"parent\\\": parentTiddler.title,\\n\\t\\t\\t\\\"text\\\": list.children[i].children[0].text,\\n\\t\\t\\t\\\"stream-type\\\" : \\\"default\\\"\\n\\t\\t};\\t\\t\\n\\t\\t\\n\\t\\tvar subList = list.children[i].children[1];\\n\\t\\tif(subList && subList.tag === \\\"ul\\\") {\\n\\t\\t\\tthis.processList(subList,tiddler);\\n\\t\\t}\\n\\t\\t\\n\\t\\tchildNodes.push(tiddler.title);\\n\\t\\tthis.nodes.push(tiddler);\\n\\t\\t// add tiddler to wiki\\n\\t}\\n\\tparentTiddler[\\\"stream-list\\\"] = $tw.utils.stringifyList(childNodes);\\n\\t//save child nodes to stream-list in parent\\n}\\n\\n\\nSingleTiddlerStreamsWidget.prototype.execute = function() {\\n\\tthis.tiddlerTitle = this.getAttribute(\\\"$tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n//\\tthis.makeChildWidgets();\\n};\\n\\n\\nSingleTiddlerStreamsWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"tiddler\\\"] || changedTiddlers[this.tiddlerTitle]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports[\\\"action-editwithstreams\\\"] = SingleTiddlerStreamsWidget;\\n\\n})();\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"$:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\\ntype: application/javascript\\nmodule-type: filteroperator\\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[\\\"stream-to-wikilist\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler && tiddler.fields[\\\"stream-list\\\"]) {\\t\\t\\t\\n\\t\\t\\tvar wikilist = \\\"\\\";\\n\\t\\t\\t\\n\\t\\t\\tfunction processNode(node,prefix) {\\t\\t\\t\\t\\n\\t\\t\\t\\tvar streamList = $tw.utils.parseStringArray(node.getFieldString(\\\"stream-list\\\"));\\n\\t\\t\\t\\tfor(var i=0; i\u003CstreamList.length; i++) {\\n\\t\\t\\t\\t\\tvar n = $tw.wiki.getTiddler(streamList[i]);\\n\\t\\t\\t\\t\\tvar line = prefix + \\\" \\\" + $tw.wiki.getTiddlerText(streamList[i],\\\"\\\") + \\\"\\\\n\\\";\\n\\t\\t\\t\\t\\twikilist += line;\\n\\t\\t\\t\\t\\tif(n && n.fields[\\\"stream-list\\\"] != undefined) {\\n\\t\\t\\t\\t\\t\\tprocessNode(n,prefix + \\\"*\\\");\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t\\n\\t\\t\\tprocessNode(tiddler,\\\"*\\\");\\n\\t\\t\\tresults.push(wikilist);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\",\n \"type\": \"application/javascript\",\n \"module-type\": \"filteroperator\"\n },\n \"$:/plugins/sq/streams-as-editor/viewtemplate\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/viewtemplate\",\n \"created\": \"20200816211512617\",\n \"modified\": \"20200817155923474\",\n \"tags\": \"$:/tags/ViewTemplate\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\\\\define delete-children()\\n\\t\u003C$list filter=\\\"[enlist{!!stream-list}]\\\">\\n\\t\\t\u003C\u003Cdelete-children>>\\n\\t\u003C/$list>\\n\\t\u003C$action-deletetiddler $filter=\\\"[enlist{!!stream-list}]\\\"/>\\n\\\\end\\n\\n\u003C$list filter=\\\"\\\"\\\"[\u003Cfolded-state>get[text]!is[blank]else[show]!match[hide]]\\\"\\\"\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-type]!is[blank]else[default]match[singletiddler]]\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-status]!is[blank]else[default]!match[active]]\\\" variable=\\\"_NULL\\\">\\n\u003C$button> edit with Streams\\n\u003C$action-editwithstreams $tiddler=\u003C\u003CcurrentTiddler>>/>\\n\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> hide-body=\\\"yes\\\" stream-status=\\\"active\\\"/>\\n\u003C/$button>\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-status]match[active]]\\\" variable=\\\"_NULL\\\">\\n{{||$:/plugins/sq/streams/nodes-list-template}}\\n\u003C$button> save\\n\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> text={{{[\u003CcurrentTiddler>stream-to-wikilist[]]}}} />\\n\u003C\u003Cdelete-children>>\\n\u003C$action-deletefield $tiddler=\u003C\u003CcurrentTiddler>> hide-body=\\\"no\\\" stream-list=\\\"\\\" stream-status=\\\"\\\"/>\\n\u003C/$button>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$list>\"\n }\n }\n}","version":"0.0.01","type":"application/json","title":"$:/plugins/sq/streams-as-editor","source":"","revision":"0","plugin-type":"plugin","list":"","description":"Streams Editor for Lists","dependents":"","core-version":">=5.1.22","bag":"default","author":"Saq Imtiaz"}, {"title":"$:/plugins/tiddlywiki/menubar","name":"Menu Bar","description":"Menu Bar","list":"readme config","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/config/DefaultColourMappings/menubar-foreground\":{\"title\":\"$:/config/DefaultColourMappings/menubar-foreground\",\"text\":\"#fff\"},\"$:/config/DefaultColourMappings/menubar-background\":{\"title\":\"$:/config/DefaultColourMappings/menubar-background\",\"text\":\"#5778d8\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols\",\"text\":\"hide\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server\",\"text\":\"hide\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar\",\"text\":\"hide\"},\"$:/config/plugins/menubar/TableOfContents/Tag\":{\"title\":\"$:/config/plugins/menubar/TableOfContents/Tag\",\"text\":\"TableOfContents\"},\"$:/config/plugins/menubar/breakpoint\":{\"title\":\"$:/config/plugins/menubar/breakpoint\",\"text\":\"620px\"},\"$:/plugins/tiddlywiki/menubar/config\":{\"title\":\"$:/plugins/tiddlywiki/menubar/config\",\"tags\":\"$:/tags/ControlPanel/Toolbars\",\"caption\":\"Menu Bar\",\"text\":\"\\\\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/\\n\\n! Menu Bar Configuration\\n\\n!! Menu Items\\n\\nSelect which menu items will be shown. You can also drag items to reorder them.\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/MenuBar\\\" itemTemplate=\\\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n!! Breakpoint Position\\n\\nThe breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`).\\n\\n\u003C$edit-text tiddler=\\\"$:/config/plugins/menubar/breakpoint\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\n!! Contents Tag\\n\\nThe tag for the ~TableOfContents used in the Contents dropdown\\n\\n\u003C$edit-text tiddler=\\\"$:/config/plugins/menubar/TableOfContents/Tag\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\n!! Menu Bar Colours\\n\\nTo change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette\\n\"},\"$:/plugins/tiddlywiki/menubar/items/contents\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/contents\",\"caption\":\"Contents\",\"description\":\"Table of Contents\",\"is-dropdown\":\"yes\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\u003Cdiv class=\\\"tc-table-of-contents\\\">\\n\\n\u003C$macrocall $name=\\\"toc-selective-expandable\\\" tag={{$:/config/plugins/menubar/TableOfContents/Tag}}/>\\n\\n\u003C/div>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/hamburger\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/hamburger\",\"tags\":\"$:/tags/MenuBar\",\"caption\":\"Hamburger\",\"description\":\"Show the full menu bar on a narrow screen\",\"custom-menu-content\":\"{{$:/plugins/tiddlywiki/menubar/items/hamburger}}\",\"show-when\":\"narrow\",\"text\":\"\u003C$list filter=\\\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]\\\">\\n\u003C$button set=\\\"$:/state/popup/menubar/hamburger\\\" setTo=\\\"yes\\\">\\n{{$:/core/images/menu-button}}\\n\u003C/$button>\\n\u003C/$list>\\n\u003C$list filter=\\\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]\\\">\\n\u003C$button set=\\\"$:/state/popup/menubar/hamburger\\\" setTo=\\\"no\\\">\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Page controls from the sidebar\",\"caption\":\"Page controls\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\\\" mode=\\\"inline\\\"/>\",\"text\":\"\\\\whitespace trim\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\u003C$set name=\\\"hidden\\\" value=\u003C\u003Cconfig-title>>>\\n\u003C$list filter=\\\"[\u003Chidden>!text[hide]]\\\" storyview=\\\"pop\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/search\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/search\",\"custom-menu-content\":\"{{$:/plugins/tiddlywiki/menubar/items/search}}\",\"description\":\"Search\",\"caption\":\"Search\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\\\\define cancel-search-actions()\\n\u003C$set name=\\\"userInput\\\" value={{{ [\u003C__storeTitle__>get[text]] }}}>\\n\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!match\u003CuserInput>]\\\" emptyMessage=\\\"\\\"\\\"\u003C$action-deletetiddler $filter=\\\"[\u003C__storeTitle__>] [\u003C__tiddler__>] [\u003C__selectionStateTitle__>]\\\"/>\\\"\\\"\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003C__tiddler__>> text=\u003C\u003CuserInput>>/>\u003C$action-setfield $tiddler=\u003C\u003C__refreshTitle__>> text=\\\"yes\\\"/>\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define input-accept-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\"\\\"\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\n\\n\\\\define input-accept-variant-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\"\\\"\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\n\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\") \u003C$macrocall $name=\\\"change-input-tab\\\" stateTitle=\\\"$:/state/tab/search-results/sidebar\\\" tag=\\\"$:/tags/SearchResults\\\" beforeafter=\\\"$beforeafter$\\\" defaultState={{$:/config/SearchResults/Default}} actions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\\\"$:/state/search/currentTab\\\" text=\u003C\u003CnextTab>>/>\\\"\\\"\\\"/>\\n\\n\\\\whitespace trim\\n\u003C$vars searchTiddler=\\\"$:/temp/menubarsearch/input\\\" searchListState=\u003C\u003Cqualify \\\"$:/state/search-list/selected-item\\\">>>\\n\u003Cspan style=\\\"margin: 0 0.5em;\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003Cform class=\\\"tc-form-inline\\\">\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\" tiddler=\\\"$:/temp/menubarsearch\\\" storeTitle=\u003C\u003CsearchTiddler>> selectionStateTitle=\u003C\u003CsearchListState>> \\n\\t\\trefreshTitle=\\\"$:/temp/menubarsearch/refresh\\\" tag=\\\"input\\\" type=\\\"search\\\" focusPopup=\\\"$:/state/popup/menubar-search-dropdown\\\" \\n\\t\\tclass=\\\"tc-popup-handle tc-menu-show-when-wide\\\" placeholder=\\\"Search...\\\" default=\\\"\\\" cancelPopups=\\\"yes\\\" \\n\\t\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>> inputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>> inputCancelActions=\u003C\u003Ccancel-search-actions>> \\n\\t\\tfilterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter=\\\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\\\" />\\n\u003C/form>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/span>\\n\u003C$reveal tag=\\\"div\\\" class=\\\"tc-block-dropdown-wrapper\\\" state=\\\"$:/state/popup/menubar-search-dropdown\\\" type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\\n\u003Cdiv class=\\\"tc-block-dropdown tc-search-drop-down\\\">\\n\\n\u003C$list filter=\\\"[\u003CsearchTiddler>get[text]minlength[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003Cdiv class=\\\"tc-search-results\\\">Type your search terms\u003C/div>\\\"\\\"\\\" variable=\\\"ignore\\\">\\n\\n\u003C$list filter=\\\"[\u003CsearchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003Cdiv class=\\\"tc-search-results\\\">{{$:/language/Search/Search/TooShort}}\u003C/div>\\\"\\\"\\\" variable=\\\"listItem\\\">\\n\\n\u003C$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} userInput={{{ [\u003CsearchTiddler>get[text]] }}}>\\n\\n{{$:/core/ui/SearchResults}}\\n\\n\u003C/$vars>\\n\\n\u003C/$list>\\n\\n\u003C/$list>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\\n\\n\u003C/$vars>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/server\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/server\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Server options\",\"caption\":\"Server\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/server\\\" mode=\\\"inline\\\"/>\",\"text\":\"\u003C$list filter=\\\"[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003C$transclude tiddler=\\\"$:/core/ui/Buttons/save-wiki\\\" mode=\\\"inline\\\"/>\\n\u003C/$list>\\n\u003C$list filter=\\\"[[$:/status/IsLoggedIn]get[text]else[no]match[no]]\\\" variable=\\\"ignore\\\">\\n\u003C$button message=\\\"tm-login\\\">\\nLogin\\n\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/sidebar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/sidebar\",\"caption\":\"Sidebar\",\"description\":\"Sidebar\",\"is-dropdown\":\"yes\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\u003C$scrollable fallthrough=\\\"none\\\" class=\\\"tc-popup-keep tc-menubar-dropdown-sidebar\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/SideBarSegments/tabs\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/$scrollable>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/topleftbar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/topleftbar\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Items from $:/tags/TopLeftBar\",\"caption\":\"Legacy Top Left Bar\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/topleftbar\\\" mode=\\\"inline\\\"/>\",\"text\":\"\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\"},\"$:/plugins/tiddlywiki/menubar/items/toprightbar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/toprightbar\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Items from $:/tags/TopRightBar\",\"caption\":\"Legacy Top Right Bar\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/toprightbar\\\" mode=\\\"inline\\\"/>\",\"custom-menu-styles-wide\":\"float: right;\",\"text\":\"\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\"},\"$:/plugins/tiddlywiki/menubar/menu\":{\"title\":\"$:/plugins/tiddlywiki/menubar/menu\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\\\\define menubar-inner(size)\\n\u003Cul class=\\\"tc-menubar-list\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]]\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter=\\\"[[$size$]match[wide]] ~[\u003CcurrentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003Cli style={{!!custom-menu-styles-$size$}} class={{{ [\u003CcurrentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>!is-dropdown[yes]]\\\" variable=\\\"listItem\\\" emptyMessage=\\\"\\\"\\\"\\n\\t\u003C!-- Dropdown -->\\n\\t\u003C$set name=\\\"dropdown-state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/topmenu/dropdown/\\\">>>\\n\\t\u003C$set name=\\\"dropdown-state\\\" value={{{ [\u003Cdropdown-state>addsuffix\u003CcurrentTiddler>] }}}>\\n\\t\u003C$button popup=\u003C\u003Cdropdown-state>> selectedClass=\\\"tc-selected\\\">\\n\\t\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\\t\u003C$transclude field=\\\"caption\\\" mode=\\\"inline\\\"/>\\n\\t\u003C$text text=\\\" \\\"/>\\n\\t\u003Cspan class=\\\"tc-menubar-dropdown-arrow\\\">\\n\\t\u003C$transclude tiddler=\\\"$:/core/images/down-arrow\\\" mode=\\\"inline\\\"/>\\n\\t\u003C/span>\\n\\t\u003C/$set>\\n\\t\u003C/$button>\\n\\t\u003C/$set>\\n\\t\u003C/$set>\\n\\\"\\\"\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>has[custom-menu-content]]\\\" variable=\\\"listItem\\\" emptyMessage=\\\"\\\"\\\"\\n\\t\u003C!-- Link -->\\n\\t\u003C$link to={{!!target}}>\\n\\t\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\\t\u003C$transclude field=\\\"caption\\\" mode=\\\"inline\\\"/>\\n\\t\u003C/$set>\\n\\t\u003C/$link>\\n\\\"\\\"\\\">\\n\u003C!-- Custom content -->\\n\u003C$transclude field=\\\"custom-menu-content\\\" mode=\\\"inline\\\"/>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/ul>\\n\\\\end\\n\\n\u003C$list filter=\\\"[\u003Ctv-config-static>!match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\\\" variable=\\\"listItem\\\">\\n\u003Cnav class=\\\"tc-menubar tc-adjust-top-of-scroll\\\">\\n\u003Cdiv class=\\\"tc-menubar-narrow\\\">\\n\u003C\u003Cmenubar-inner narrow>>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-menubar-wide\\\">\\n\u003C\u003Cmenubar-inner wide>>\\n\u003C/div>\\n\u003Cdiv style=\\\"clear:both;\\\"/>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"dropdown-state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/topmenu/dropdown/\\\">>>\\n\u003C$set name=\\\"dropdown-state\\\" value={{{ [\u003Cdropdown-state>addsuffix\u003CcurrentTiddler>] }}}>\\n\u003C$reveal type=\\\"popup\\\" state=\u003C\u003Cdropdown-state>> position={{{ [\u003CcurrentTiddler>get[dropdown-position]else[below]] }}} class={{{ [\u003CcurrentTiddler>get[class]] }}} tag=\\\"div\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\u003C$transclude/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/nav>\\n\u003C/$list>\\n\u003C/$list>\\n\"},\"$:/core/ui/PageTemplate/topleftbar\":{\"title\":\"$:/core/ui/PageTemplate/topleftbar\",\"text\":\"\u003C!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar -->\"},\"$:/core/ui/PageTemplate/toprightbar\":{\"title\":\"$:/core/ui/PageTemplate/toprightbar\",\"text\":\"\u003C!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar -->\"},\"$:/plugins/tiddlywiki/menubar/readme\":{\"title\":\"$:/plugins/tiddlywiki/menubar/readme\",\"text\":\"!! Introduction\\n\\nThis plugin provides a menu bar with the following features:\\n\\n* Menu items take the form of simple text links, dropdowns, or entirely custom content\\n* Menu items can be individually enabled via the control panel\\n* Responds to reduced screen width by abbreviating the menu items to a \\\"hamburger\\\" dropdown\\n\\n!! Menu Item Tiddlers\\n\\nMenu items are tagged \u003C\u003Ctag $:/tags/MenuBar>>. The following fields are used by this plugin:\\n\\n|!Field Name |!Purpose |\\n|title |Each menu item must have a unique title (not shown to the user) |\\n|description |Description for use in listings |\\n|tags |Must contain `$:/tags/MenuBar` |\\n|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required |\\n|target |For simple link menu items specifies a tiddler title as the target of the link |\\n|is-dropdown |Set to `yes` to indicate a dropdown menu item |\\n|dropdown-position |Optional position for the dropdown (can be ''left'', ''above'', ''aboveleft'', ''aboveright'', ''right'', ''belowleft'', ''belowright'' or ''below'') |\\n|text |For dropdown menu items, specifies the body of the dropdown |\\n|custom-menu-content |Optional wikitext to be displayed in place of the caption |\\n|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide |\\n|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow |\\n\\nCustom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element.\\n\\nNote that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`.\\n\"},\"$:/plugins/tiddlywiki/menubar/styles\":{\"title\":\"$:/plugins/tiddlywiki/menubar/styles\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define breakpoint-plus-one()\\n\u003C$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] ~[{$:/config/plugins/menubar/breakpoint}] }}} />\\n\\\\end\\n\\n\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}} />\\n\\\\end\\n\\n\\\\define set-sidebar-scrollable-top-if-hamburger()\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] -$:/plugins/tiddlywiki/menubar/items/hamburger +[limit[1]]\\\">\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tmargin-top: 2em;\\n\\t}\\n\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define set-sidebar-scrollable-top()\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\\\">\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tmargin-top: 2em;\\n\\t}\\n\\n\u003C/$list>\\n\u003C$reveal state=\\\"$:/state/popup/menubar/hamburger\\\" type=\\\"match\\\" text=\\\"yes\\\">\\n\\n\\t\u003C$set name=\\\"itemCount\\\" value={{{ [all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[count[]] }}}>\\n\\n\\t\\t.tc-sidebar-scrollable {\\n\\t\\t\\tmargin-top: calc(\u003C\u003CitemCount>> * 2em);\\n\\t\\t}\\n\\n\\t\u003C/$set>\\n\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\nnav.tc-menubar {\\n\\tposition: fixed;\\n\\tz-index: 850;\\n\\tdisplay: inline-block;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tleft: 0;\\n}\\n\\nnav.tc-menubar ul.tc-menubar-list {\\n\\tposition: relative;\\n\\tlist-style-type: none;\\n\\tmargin: 0;\\n\\tpadding: 0 0 0 42px;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tbackground: \u003C\u003Ccolour menubar-background>>;\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\thtml nav.tc-menubar ul.tc-menubar-list {\\n\\t\\tpadding: 0 0 0 8px;\\n\\t}\\n\\n}\\n\\nnav.tc-menubar li.tc-menubar-item {\\n\\tdisplay: inline-block;\\n\\tmargin: 0;\\n\\tpadding: 0;\\n}\\n\\nnav.tc-menubar .tc-menubar-narrow li.tc-menubar-item {\\n\\tdisplay: block;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a,\\nnav.tc-menubar li.tc-menubar-item > button {\\n\\tdisplay: inline-block;\\n/*\\ttext-transform: uppercase; */\\n\\tline-height: 1;\\n\\tfont-weight: 700;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tcolor: \u003C\u003Ccolour menubar-foreground>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour menubar-foreground>>;\\n\\ttext-decoration: none;\\n\\tpadding: 0.5em;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\tcursor: pointer;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a.tc-selected,\\nnav.tc-menubar li.tc-menubar-item > button.tc-selected {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item svg {\\n\\ttransition: none;\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour menubar-foreground>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg {\\n\\twidth: 0.5em;\\n\\theight: 0.5em;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a.tc-selected svg,\\nnav.tc-menubar li.tc-menubar-item > button.tc-selected svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a:hover,\\nnav.tc-menubar li.tc-menubar-item > button:hover svg,\\nnav.tc-menubar li.tc-menubar-item > button:hover {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a:active,\\nnav.tc-menubar li.tc-menubar-item > button:active svg,\\nnav.tc-menubar li.tc-menubar-item > button:active {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar .tc-drop-down,\\nnav.tc-menubar .tc-block-dropdown {\\n\\tmax-width: 70vw;\\n\\tmax-height: 70vh;\\n\\toverflow: auto;\\n}\\n\\nnav.tc-menubar .tc-drop-down a {\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar .tc-drop-down .tc-table-of-contents button {\\n\\tdisplay: inline-block;\\n\\twidth: auto;\\n}\\n\\nnav.tc-menubar .tc-drop-down ol {\\n\\tmargin: 0;\\n}\\n\\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a,\\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button {\\n\\tdisplay: inline;\\n\\twidth: auto;\\n}\\n\\nnav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n}\\n\\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\\n\\n\\t.tc-menubar-wide {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\\n@media (min-width: \u003C\u003Cbreakpoint-plus-one>>) {\\n\\n\\tnav.tc-menubar li.tc-menubar-item.tc-menubar-narrow,\\n\\t.tc-menubar-narrow {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t\u003C\u003Cset-sidebar-scrollable-top-if-hamburger>>\\n\\n}\\n\\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\\n\\n\\t\u003C\u003Cset-sidebar-scrollable-top>>\\n\\n}\\n@media print {\\n\\n\\tnav.tc-menubar {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\"},\"$:/tags/MenuBar\":{\"title\":\"$:/tags/MenuBar\",\"list\":\"$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar\"}}}"}, {"created":"20230928091243648","text":"\n","title":"$:/plugins/tiddlywiki/menubar/items/about","caption":"About","description":"Table of Proyectos","is-dropdown":"yes","tags":"$:/tags/MenuBar","modified":"20230928091329047"}, {"created":"20230928091359995","text":"\u003Cdiv class=\"tc-table-of-contents\">\n\n\u003C\u003Ctoc-selective-expandable 'Actividades'>>\n\n\u003C/div>\n","title":"$:/plugins/tiddlywiki/menubar/items/actividades","caption":"Actividades","description":"Table of Proyectos","is-dropdown":"yes","tags":"$:/tags/MenuBar","modified":"20230928091829374"}, @@ -507,8 +504,8 @@ Error message and password prompt {"created":"20230928081806500","title":"$:/state/toc/TableOfContents-Proyectos-1684905998","text":"open","modified":"20230928081806500"}, {"created":"20230928082306069","title":"$:/state/toc/TableOfContents-Servicios--944721818","text":"open","modified":"20230928082306069"}, {"created":"20230928082231303","title":"$:/state/toc/TableOfContents-Talleres--944721818","text":"open","modified":"20230928083015283"}, -{"title":"$:/status/RequireReloadDueToPluginChange","text":"no"}, -{"title":"$:/StoryList","text":"","list":"[[New Tiddler 1]] copinchapedia"}, +{"title":"$:/status/RequireReloadDueToPluginChange","text":"yes"}, +{"title":"$:/StoryList","created":"20230929180941714","text":"","list":"$:/ControlPanel copinchapedia","modified":"20230929180952134"}, {"created":"20230928034438840","title":"$:/theme","text":"$:/themes/tiddlywiki/centralised","modified":"20230928062438120"}, {"title":"$:/themes/tiddlywiki/centralised","name":"Centralised","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Centralises the story river","dependents":"$:/themes/tiddlywiki/snowwhite","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/centralised/styles.tid\":{\"title\":\"$:/themes/tiddlywiki/centralised/styles.tid\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\\n\\n\\thtml .tc-page-container {\\n\\t\\ttext-align: center;\\n\\t}\\n\\n\\thtml .tc-story-river {\\n\\t\\tposition: relative;\\n\\t\\twidth: 770px;\\n\\t\\tpadding: 42px;\\n\\t\\tmargin: 0 auto;\\n\\t\\ttext-align: left;\\n\\t}\\n\\n\\thtml .tc-sidebar-scrollable {\\n\\t\\ttext-align: left;\\n\\t\\tleft: 50%;\\n\\t\\tright: 0;\\n\\t\\tmargin-left: 343px;\\n\\t}\\n}\\n\"}}}"}, {"title":"$:/themes/tiddlywiki/snowwhite","name":"Snow White","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Emphasises individual tiddlers","dependents":"$:/themes/tiddlywiki/vanilla","plugin-priority":"0","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/snowwhite/base\":{\"title\":\"$:/themes/tiddlywiki/snowwhite/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n.tc-sidebar-header {\\n\\ttext-shadow: 0 1px 0 \u003C\u003Ccolour sidebar-foreground-shadow>>;\\n}\\n\\n.tc-tiddler-info {\\n\\t\u003C\u003Cbox-shadow \\\"inset 1px 2px 3px rgba(0,0,0,0.1)\\\">>\\n}\\n\\n@media screen {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n\\t}\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow none>>\\n\\t}\\n}\\n\\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\\n\\t\u003C\u003Ctransition \\\"fill 150ms ease-in-out\\\">>\\n}\\n\\n.tc-tiddler-controls button.tc-selected,\\n.tc-page-controls button.tc-selected {\\n\\t\u003C\u003Cfilter \\\"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\\\">>\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-edit-tags {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"none\\\">>\\n\\tborder: none;\\n\\toutline: none;\\n}\\n\\ntextarea.tc-edit-texteditor {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 5px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-drop-down {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-block-dropdown {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-modal {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n}\\n\\n.tc-modal-footer {\\n\\tborder-radius: 0 0 6px 6px;\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 0 #fff\\\">>;\\n}\\n\\n\\n.tc-alert {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.6)\\\">>\\n}\\n\\n.tc-notification {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n\\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\\n}\\n\\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\\n\\tborder-top: none;\\n\\theight: 1px;\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\\\">>\\n}\\n\\n.tc-message-box img {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\\n.tc-plugin-info {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\"}}}"}, diff --git a/1--conocer/wiki/backup/index-A3.html b/1--conocer/wiki/backup/index-A3.html index 19f4db6..cd9381c 100644 --- a/1--conocer/wiki/backup/index-A3.html +++ b/1--conocer/wiki/backup/index-A3.html @@ -193,24 +193,10 @@ Error message and password prompt
  • $:/palettes/copincha
  • -
  • $:/plugins/danielo515/2click2edit
  • -
  • $:/plugins/felixhayashi/respawn
  • $:/plugins/felixhayashi/topstoryview
  • -
  • $:/plugins/flibbles/relink
  • - -
  • $:/plugins/flibbles/relink-fieldnames
  • - -
  • $:/plugins/sq/streams
  • - -
  • $:/plugins/sq/streams-as-editor
  • - -
  • $:/plugins/sq/streams-search
  • - -
  • $:/plugins/tiddlywiki/filesystem
  • -
  • $:/plugins/tiddlywiki/menubar
  • $:/plugins/tiddlywiki/menubar/items/about
  • @@ -405,6 +391,8 @@ Error message and password prompt
  • New Tiddler
  • +
  • New Tiddler 1
  • +
  • Notas
  • Precious-plastic-la-habana
  • @@ -460,15 +448,8 @@ Error message and password prompt {"title":"$:/isEncrypted","text":"no"}, {"created":"20230927221145042","title":"$:/palette","text":"$:/palettes/copincha","modified":"20230927221145042"}, {"created":"20230927220926364","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #ffffff\nbackground: #ffffff\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: \u003C\u003Ccolour background>>\ndragger-background: \u003C\u003Ccolour foreground>>\ndragger-foreground: \u003C\u003Ccolour background>>\ndropdown-background: #000000\ndropdown-border: #000000\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #4e4e4e\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: #000000\nmodal-background: #000000\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #000000\nnetwork-activity-foreground: #448844\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f5f2e9\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background: \nselection-foreground: \nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: \u003C\u003Ccolour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: #f5f2e9\ntiddler-border: #f5f2e9\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #4e4e4e\ntiddler-editor-background: #f5f2e9\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #888888\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: \u003C\u003Ccolour background>>\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #2b2b2b\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: \u003C\u003Ccolour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000","title":"$:/palettes/copincha","name":"Copincha","description":"Paleta de Copincha","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","color-scheme":"light","modified":"20230928055527395"}, -{"text":"{\n \"tiddlers\": {\n \"$:/plugins/danielo515/2click2edit/ClickListener.js\": {\n \"text\": \"/*\\\\\\ntitle: $:/plugins/danielo515/2click2edit/ClickListener.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nThis widgets adds an double click event listener to its parent\\n\\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 ClickListener = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nClickListener.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nClickListener.prototype.render = function(parent,nextSibling) {\\n\\tthis.parentDomNode = parent;\\n\\tthis.execute();\\n\\tvar self = this;\\n /*Since the event listener have been added to the parent, the \\\"this\\\" property is pointing to the\\n wrong object, we should call our edit function with our widget object set as the this property.*/\\n parent.addEventListener(\\\"dblclick\\\",function(event){self.editTiddler.call(self,event)});\\n};\\n\\nClickListener.prototype.editTiddler = function(event) {\\n this.dispatchEvent({type: \\\"tm-edit-tiddler\\\", param: this.getVariable(\\\"currentTiddler\\\")}); \\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nClickListener.prototype.execute = function() {\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nClickListener.prototype.refresh = function(changedTiddlers) {\\n\\treturn false;\\n};\\n\\nexports.click = ClickListener;\\n\\n})();\",\n \"title\": \"$:/plugins/danielo515/2click2edit/ClickListener.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"$:/plugins/danielo515/2click2edit/readme\": {\n \"title\": \"$:/plugins/danielo515/2click2edit/readme\",\n \"text\": \"This 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\"\n },\n \"$:/plugins/danielo515/2click2edit/ui/ViewTemplate\": {\n \"tags\": \"$:/tags/ViewTemplate\",\n \"title\": \"$:/plugins/danielo515/2click2edit/ui/ViewTemplate\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\u003C$click>\"\n }\n }\n}","bag":"default","revision":"0","version":"0.1","type":"application/json","title":"$:/plugins/danielo515/2click2edit","source":"https://github.com/danielo515/TW5-2click2edit","plugin-type":"plugin","list":"readme","description":"double click to edit tiddlers","dependents":"","core-version":">=5.1.0","author":"Danielo Rodriguez"}, {"text":"{\n \"tiddlers\": {\n \"$:/plugins/felixhayashi/respawn/respawn.js\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/respawn.js\",\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/respawn/respawn.js\\ntype: application/javascript\\nmodule-type: startup\\n\\n@preserve\\n\\n\\\\*/\\n\\n(function(){\\n \\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n \\\"use strict\\\";\\n \\n var configTRef = \\\"$:/plugins/felixhayashi/respawn/config\\\";\\n \\n var changeListener = function(changedTiddlers) {\\n \\n if(!changedTiddlers[\\\"$:/StoryList\\\"]) return;\\n \\n var tObj = $tw.wiki.getTiddler(\\\"$:/StoryList\\\");\\n if(tObj && !tObj.fields[\\\"list\\\"].length) {\\n \\n var confTObj = $tw.wiki.getTiddler(configTRef);\\n var config = confTObj ? confTObj.fields : {};\\n \\n window.setTimeout(function() {\\n $tw.rootWidget.dispatchEvent({\\n type: \\\"tm-home\\\"\\n });\\n }, parseInt(config.delay) || 500);\\n }\\n \\n };\\n \\n exports.name = \\\"respawn\\\";\\n exports.platforms = [\\\"browser\\\"];\\n exports.after = [\\\"story\\\"];\\n exports.synchronous = true;\\n \\n exports.startup = function() {\\n \\n $tw.wiki.addEventListener(\\\"change\\\", changeListener);\\n \\n };\\n\\n})();\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"startup\"\n },\n \"$:/plugins/felixhayashi/respawn/Configuration\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/Configuration\",\n \"text\": \"\u003C!-- The config output is not written to this tiddler! -->\\n\\nPlease see the [[GitHub page|https://github.com/felixhayashi/TW5-Respawn]] for more information on the options.\\n\\nYou may have to save and reload the wiki to activate changes.\\n\\n\u003Ctable>\\n \u003Ctr>\\n \u003Cth align=\\\"left\\\">Delay (seconds):\u003C/th>\\n \u003Ctd>\\n \u003C$edit-text\\n tiddler=\\\"$:/plugins/felixhayashi/respawn/config\\\"\\n field=\\\"delay\\\"\\n tag=\\\"input\\\"\\n default=\\\"500\\\" />\\n \u003C/td>\\n \u003C/tr>\\n\u003C/table>\"\n },\n \"$:/plugins/felixhayashi/respawn/License\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/License\",\n \"text\": \"This code is released under the BSD license. For the exact terms visit:\\n\\nhttps://github.com/felixhayashi/TW5-Respawn/blob/master/LICENSE\"\n },\n \"$:/plugins/felixhayashi/respawn/Readme\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/Readme\",\n \"text\": \"Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-Respawn]] for more information.\"\n }\n }\n}","version":"0.0.3","type":"application/json","title":"$:/plugins/felixhayashi/respawn","source":"https://github.com/felixhayashi/TW5-respawn","released":"","plugin-type":"plugin","list":"Configuration License Readme","description":"Respawn – Open default tiddlers when river is empty","dependents":"","core-version":">=5.1.5","author":"Felix Küppers"}, {"text":"{\n \"tiddlers\": {\n \"$:/plugins/felixhayashi/topstoryview/config.js\": {\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/topstoryview/config.js\\ntype: application/javascript\\nmodule-type: library\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";exports.config={classNames:{storyRiver:\\\"tc-story-river\\\",backDrop:\\\"story-backdrop\\\",tiddlerFrame:\\\"tc-tiddler-frame\\\",tiddlerTitle:\\\"tc-title\\\"},references:{userConfig:\\\"$:/config/topStoryView\\\",focussedTiddlerStore:\\\"$:/temp/focussedTiddler\\\",refreshTrigger:\\\"$:/temp/focussedTiddler/refresh\\\"},checkbackTime:$tw.utils.getAnimationDuration()}})();\",\n \"title\": \"$:/plugins/felixhayashi/topstoryview/config.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/felixhayashi/topstoryview/layout\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/layout\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"tags\": [\n \"$:/tags/Stylesheet\"\n ],\n \"text\": \"html .tc-story-river:after {\\n content: \\\"\\\";\\n display: block; }\\n\"\n },\n \"$:/plugins/felixhayashi/topstoryview/Configuration\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/Configuration\",\n \"text\": \"Please see the [[GitHub page|https://github.com/felixhayashi/TW5-TopStoryView]] for more information on the options.\\n\\nSave and reload the wiki to activate changes.\\n\\n\u003Ctable>\\n \u003Ctr>\\n \u003Cth align=\\\"left\\\">Scroll offset:\u003C/th>\\n \u003Ctd>\u003C$edit-text tiddler=\\\"$:/config/topStoryView\\\" field=\\\"scroll-offset\\\" tag=\\\"input\\\" default=\\\"150px\\\" />\u003C/td>\\n \u003C/tr>\\n\u003C/table>\"\n },\n \"$:/plugins/felixhayashi/topstoryview/License\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/License\",\n \"text\": \"This code is released under the BSD license. For the exact terms visit:\\n\\nhttps://github.com/felixhayashi/TW5-TopStoryView/blob/master/LICENSE\"\n },\n \"$:/plugins/felixhayashi/topstoryview/Readme\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/Readme\",\n \"text\": \"Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-TopStoryView]] for more information.\"\n },\n \"$:/plugins/felixhayashi/topstoryview/top.js\": {\n \"text\": \"/*\\\\\\ntitle: $:/plugins/felixhayashi/topstoryview/top.js\\ntype: application/javascript\\nmodule-type: storyview\\n\\nViews the story as a linear sequence\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";var t=require(\\\"$:/plugins/felixhayashi/topstoryview/config.js\\\").config;var e=\\\"cubic-bezier(0.645, 0.045, 0.355, 1)\\\";var i=function(e){this.listWidget=e;this.pageScroller=new $tw.utils.PageScroller;this.pageScroller.scrollIntoView=this.scrollIntoView;this.pageScroller.storyRiverDomNode=document.getElementsByClassName(t.classNames.storyRiver)[0];var i=$tw.wiki.getTiddler(t.references.userConfig);var o=i?i.fields:{};$tw.hooks.addHook(\\\"th-opening-default-tiddlers-list\\\",this.hookOpenDefaultTiddlers);var r=parseInt(o[\\\"scroll-offset\\\"]);this.pageScroller.scrollOffset=isNaN(r)?71:r;this.recalculateBottomSpace()};i.prototype.refreshStart=function(t,e){};i.prototype.refreshEnd=function(t,e){};i.prototype.hookOpenDefaultTiddlers=function(t){return t};i.prototype.navigateTo=function(t){var e=this.listWidget.findListItem(0,t.title);if(e===undefined)return;var i=this.listWidget.children[e];var o=i.findFirstDomNode();if(!(o instanceof Element))return;this.pageScroller.scrollIntoView(o)};i.prototype.insert=function(t){if(!t)return;var e=t.findFirstDomNode();if(!(e instanceof Element))return;this.startInsertAnimation(e,function(){this.recalculateBottomSpace()}.bind(this))};i.prototype.remove=function(t){if(!t)return;var e=t.findFirstDomNode();if(!(e instanceof Element)){t.removeChildDomNodes();return}var i=this.getLastFrame()===e;this.startRemoveAnimation(t,e,function(){t.removeChildDomNodes();this.recalculateBottomSpace();if(i){this.pageScroller.scrollIntoView(this.getLastFrame())}}.bind(this))};i.prototype.getLastFrame=function(){var t=this.listWidget.children[this.listWidget.children.length-1];return t?t.findFirstDomNode():null};i.prototype.recalculateBottomSpace=function(){var t=this.pageScroller.storyRiverDomNode;if(this.getLastFrame()){var e=this.getLastFrame().getBoundingClientRect();var i=window.innerHeight;if(e.height\u003Ci){t.style[\\\"paddingBottom\\\"]=i-e.height+\\\"px\\\";return}}t.style[\\\"paddingBottom\\\"]=\\\"\\\"};i.prototype.scrollIntoView=function(t){if(this.preventNextScrollAttempt){this.preventNextScrollAttempt=false}if(!t)return;var e=$tw.utils.getAnimationDuration();this.cancelScroll();this.startTime=Date.now();var i=$tw.utils.getScrollPosition();var o=t.getBoundingClientRect(),r={left:o.left+i.x,top:o.top+i.y,width:o.width,height:o.height};var n=function(t,e,i,o){if(t\u003C=i){return t}else if(e\u003Co&&i\u003Ct+e-o){return t+e-o}else if(i\u003Ct){return t}else{return i}},s=n(r.left,r.width,i.x,window.innerWidth),a=r.top-this.scrollOffset;if(s!==i.x||a!==i.y){var l=this,c;c=function(){var t;if(e\u003C=0){t=1}else{t=(Date.now()-l.startTime)/e}if(t>=1){l.cancelScroll();t=1}t=$tw.utils.slowInSlowOut(t);window.scrollTo(i.x+(s-i.x)*t,i.y+(a-i.y)*t);if(t\u003C1){l.idRequestFrame=l.requestAnimationFrame.call(window,c)}};c()}};i.prototype.startInsertAnimation=function(t,i){var o=$tw.utils.getAnimationDuration();var r=window.getComputedStyle(t),n=parseInt(r.marginBottom,10),s=parseInt(r.marginTop,10),a=t.offsetHeight+s;setTimeout(function(){$tw.utils.setStyle(t,[{transition:\\\"none\\\"},{marginBottom:\\\"\\\"}]);i()},o);$tw.utils.setStyle(t,[{transition:\\\"none\\\"},{marginBottom:-a+\\\"px\\\"},{opacity:\\\"0.0\\\"}]);$tw.utils.forceLayout(t);$tw.utils.setStyle(t,[{transition:\\\"opacity \\\"+o+\\\"ms \\\"+e+\\\", \\\"+\\\"margin-bottom \\\"+o+\\\"ms \\\"+e},{marginBottom:n+\\\"px\\\"},{opacity:\\\"1.0\\\"}])};i.prototype.startRemoveAnimation=function(t,i,o){var r=$tw.utils.getAnimationDuration();var n=i.offsetWidth,s=window.getComputedStyle(i),a=parseInt(s.marginBottom,10),l=parseInt(s.marginTop,10),c=i.offsetHeight+l;setTimeout(o,r);$tw.utils.setStyle(i,[{transition:\\\"none\\\"},{transform:\\\"translateX(0px)\\\"},{marginBottom:a+\\\"px\\\"},{opacity:\\\"1.0\\\"}]);$tw.utils.forceLayout(i);$tw.utils.setStyle(i,[{transition:$tw.utils.roundTripPropertyName(\\\"transform\\\")+\\\" \\\"+r+\\\"ms \\\"+e+\\\", \\\"+\\\"opacity \\\"+r+\\\"ms \\\"+e+\\\", \\\"+\\\"margin-bottom \\\"+r+\\\"ms \\\"+e},{transform:\\\"translateX(-\\\"+n+\\\"px)\\\"},{marginBottom:-c+\\\"px\\\"},{opacity:\\\"0.0\\\"}])};exports.top=i})();\",\n \"title\": \"$:/plugins/felixhayashi/topstoryview/top.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"storyview\"\n }\n }\n}","version":"0.2.0","type":"application/json","title":"$:/plugins/felixhayashi/topstoryview","source":"https://github.com/felixhayashi/TW5-TopStoryView","released":"","plugin-type":"plugin","list":"Configuration License Readme","description":"TopStoryView – Always scroll navigated tiddlers to the top","dependents":"","core-version":">=5.1.5","author":"Felix Küppers"}, -{"name":"Relink","title":"$:/plugins/flibbles/relink","description":"Flexibility when relinking renamed tiddlers","author":"Flibbles","version":"2.3.5","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\":{\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/bulkops.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/indexer.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/language.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/mangler.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/settings.js\",\"type\":\"application/javascript\"},\"$:/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\\t// We've got to sort these so that behavior is consistent across different\\n\\t// versions of TiddlyMap, whose module return order depends on version...\\n\\treturn sortModules(results);\\n};\\n\\nfunction sortModules(moduleMap) {\\n\\tvar keys = Object.keys(moduleMap);\\n\\tvar sortedResults = Object.create(null);\\n\\tkeys.sort();\\n\\tfor (var i = 0; i \u003C keys.length; i++) {\\n\\t\\tvar key = keys[i];\\n\\t\\tif (moduleMap[key].after\\n\\t\\t&& moduleMap[key].after.some(function(requirement) { return !sortedResults[requirement]})) {\\n\\t\\t\\t// Not all requirements have been met yet.\\n\\t\\t\\t$tw.utils.pushTop(keys, key);\\n\\t\\t\\ti--;\\n\\t\\t} else {\\n\\t\\t\\tsortedResults[key] = moduleMap[key];\\n\\t\\t}\\n\\t}\\n\\treturn sortedResults;\\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\",\"title\":\"$:/plugins/flibbles/relink/js/utils.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/wikimethods.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/all_relinkable.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/orphans.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/references.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/relink.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/report.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/signatures.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/splitafter.js\",\"type\":\"application/javascript\",\"module-type\":\"relinkfilteroperator\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/filteroperators/wouldchange.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/settings/attributes.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/settings/fields.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/settings/fieldwidgets.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/settings/macros.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/settings/operators.js\",\"type\":\"application/javascript\"},\"$:/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\\tvar builder = 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\",\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/filter.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/list.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/reference.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/title.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/wikitext.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/filter/operators.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/fieldtypes/reference/title.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/fields.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/filtertext.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/listtext.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/referencetext.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/titletext.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/code.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/comment.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/filteredtransclude.js\",\"type\":\"application/javascript\"},\"$:/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\\tcase 'substituted':\\n\\t\\t\\t\\tvar ticIndex = attr.rawValue.lastIndexOf(\\\"`\\\");\\n\\t\\t\\t\\tif (ticIndex \u003C 0) {\\n\\t\\t\\t\\t\\tquotedValue = \\\"`\\\" + attr.rawValue + \\\"`\\\";\\n\\t\\t\\t\\t} else if (ticIndex \u003C attr.rawValue.length-1\\n\\t\\t\\t\\t\\t\\t&& attr.rawValue.indexOf(\\\"```\\\") \u003C 0) {\\n\\t\\t\\t\\t\\tquotedValue = \\\"```\\\" + attr.rawValue + \\\"```\\\";\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t// We can't have a tic at the end; can't have triple tic.\\n\\t\\t\\t\\t\\twidgetEntry.impossible = true;\\n\\t\\t\\t\\t}\\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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html.js\",\"type\":\"application/javascript\"},\"$:/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\\tvar oldValue = 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\\tvar oldValue = 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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/image.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/import.js\",\"type\":\"application/javascript\"},\"$:/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\\t// post v5.3.0 changed it so name and param aren't used, but we still use\\n\\t// them. Maybe I should migrate so that I don't either, and that it's\\n\\t// orderedAttributes and $variable that I use.\\n\\tif (macroInfo.name === undefined) {\\n\\t\\tmacroInfo.name = macroInfo.attributes[\\\"$variable\\\"].value;\\n\\t\\tmacroInfo.params = macroInfo.orderedAttributes.slice(1);\\n\\t\\tvar index = 0;\\n\\t\\tfor (var i = 0; i \u003C macroInfo.params.length; i++) {\\n\\t\\t\\tvar param = macroInfo.params[i];\\n\\t\\t\\tif (param.name === index.toString()) {\\n\\t\\t\\t\\t// Swap out the param with one that doesn't have a name.\\n\\t\\t\\t\\tmacroInfo.params[i] = {\\n\\t\\t\\t\\t\\tstart: param.start,\\n\\t\\t\\t\\t\\tend: param.end,\\n\\t\\t\\t\\t\\ttype: param.type,\\n\\t\\t\\t\\t\\tvalue: param.value\\n\\t\\t\\t\\t};\\n\\t\\t\\t\\tindex++;\\n\\t\\t\\t}\\n\\t\\t}\\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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrocall.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/macrodef.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/prettylink.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/quoteblock.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/relink.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/rules.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/syslink.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/table.js\",\"type\":\"application/javascript\"},\"$:/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\\t\\tparams = m[3];\\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\\tif (params) {\\n\\t\\t\\t\\tblurb += '|' + params;\\n\\t\\t\\t}\\n\\t\\t\\tcallback(title, \\\"{{\\\" + blurb + \\\"}}\\\");\\n\\t\\t}, options);\\n\\t}\\n\\tif (template) {\\n\\t\\tvar templateBlurb = refString + '||';\\n\\t\\tif (params) {\\n\\t\\t\\ttemplateBlurb += '|' + params;\\n\\t\\t}\\n\\t\\tcallback(template, '{{' + templateBlurb + '}}');\\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\\tparams = m[3],\\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, params);\\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, params) {\\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, params);\\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, params);\\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, params) {\\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\\ttextReference += \\\"||\\\" + template;\\n\\t}\\n\\tif (params) {\\n\\t\\ttextReference += \\\"|\\\" + params;\\n\\t}\\n\\treturn \\\"{{\\\"+textReference+\\\"}}\\\";\\n};\\n\",\"module-type\":\"relinkwikitextrule\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/transclude.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/typedblock.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/utils.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/wikilink.js\",\"type\":\"application/javascript\"},\"$:/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\\n'use strict';\\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\\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\\tif (blurb) {\\n\\t\\t\\t\\t\\t\\t\\t\\tblurb = '\\\"' + blurb + '\\\"';\\n\\t\\t\\t\\t\\t\\t\\t}\\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\\trefHandler.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\\tfilterHandler.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\\tmacrocall.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\\tcase \\\"substituted\\\":\\n\\t\\t\\tvar filterRegex = /\\\\$\\\\{([\\\\S\\\\s]+?)\\\\}\\\\$/g, filter;\\n\\t\\t\\twhile (filter = filterRegex.exec(attr.rawValue)) {\\n\\t\\t\\t\\tfilterHandler.report(filter[1], function(title, blurb) {\\n\\t\\t\\t\\t\\tcallback(title, element.tag + ' ' + attributeName + '=`${' + blurb + '}$`');\\n\\t\\t\\t\\t}, options);\\n\\t\\t\\t}\\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.rawValue, function(title, blurb) {\\n\\t\\t\\t\\t\\t\\t// Only consider titles without substitutions.\\n\\t\\t\\t\\t\\t\\tif (!hasSubstitutions(title)) {\\n\\t\\t\\t\\t\\t\\t\\tif (operator.formBlurb) {\\n\\t\\t\\t\\t\\t\\t\\t\\tblurb = '`' + (blurb || '') + '`';\\n\\t\\t\\t\\t\\t\\t\\t\\tcallback(title, operator.formBlurb(element, attr, blurb, options));\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tcallback(title, element.tag + ' ' + attributeName + '=`' + (blurb || '') + '`');\\n\\t\\t\\t\\t\\t\\t\\t}\\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\\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\\t// TODO: This = undefined wasn't here before. Does it have to be?\\n\\t\\tvar entry = undefined;\\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}\\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\\tbreak;\\n\\t\\tcase 'substituted':\\n\\t\\t\\tvar newValue = attr.rawValue.replace(/\\\\$\\\\{([\\\\S\\\\s]+?)\\\\}\\\\$/g, function(match, filter) {\\n\\t\\t\\t\\tvar filterEntry = filterHandler.relink(filter, fromTitle, toTitle, options);\\n\\t\\t\\t\\tif (filterEntry) {\\n\\t\\t\\t\\t\\tif (filterEntry.output) {\\n\\t\\t\\t\\t\\t\\t// The only }$ should be the one at the very end\\n\\t\\t\\t\\t\\t\\tif (filterEntry.output.indexOf(\\\"}$\\\") \u003C 0) {\\n\\t\\t\\t\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t\\t\\t\\t\\treturn '${' + filterEntry.output + '}$';\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\timpossible = true;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tif (filterEntry.impossible) {\\n\\t\\t\\t\\t\\t\\timpossible = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn match;\\n\\t\\t\\t});\\n\\t\\t\\tattr.rawValue = newValue;\\n\\t\\t\\tif (!hasSubstitutions(fromTitle)) {\\n\\t\\t\\t\\tfor (var operatorName in attributeOperators) {\\n\\t\\t\\t\\t\\tvar operator = attributeOperators[operatorName];\\n\\t\\t\\t\\t\\tvar handler = operator.getHandler(element, attr, options);\\n\\t\\t\\t\\t\\tif (handler) {\\n\\t\\t\\t\\t\\t\\tentry = handler.relink(attr.rawValue, fromTitle, toTitle, options);\\n\\t\\t\\t\\t\\t\\tif (entry && entry.output) {\\n\\t\\t\\t\\t\\t\\t\\tif (hasSubstitutions(toTitle)) {\\n\\t\\t\\t\\t\\t\\t\\t\\t// If we relinked, but the toTitle can't be in\\n\\t\\t\\t\\t\\t\\t\\t\\t// a substition, then we must fail instead.\\n\\t\\t\\t\\t\\t\\t\\t\\tentry.impossible = true;\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tattr.rawValue = entry.output;\\n\\t\\t\\t\\t\\t\\t\\t\\tattr.handler = handler.name;\\n\\t\\t\\t\\t\\t\\t\\t\\tchanged = true;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tbreak;\\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\\nfunction hasSubstitutions(title) {\\n\\tif (/\\\\$\\\\(\\\\w+\\\\)\\\\$/.test(title)) {\\n\\t\\treturn true;\\n\\t} else return (/\\\\$\\\\{[\\\\S\\\\s]+?\\\\}\\\\$/.test(title));\\n};\\n\",\"module-type\":\"relinkhtml\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/importvariables.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/fields.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/macrocall.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/relinkoperations/text/wikitext/html/attributes/whitelist.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/contexts/context.js\",\"type\":\"application/javascript\"},\"$:/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 (var 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\",\"title\":\"$:/plugins/flibbles/relink/js/contexts/import.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/contexts/tiddler.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/contexts/variable.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/contexts/whitelist.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/contexts/widget.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/contexts/wikitext.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/utils/backupIndexer.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/utils/entry.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/utils/macrocall.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/utils/placeholder.js\",\"type\":\"application/javascript\"},\"$:/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\",\"title\":\"$:/plugins/flibbles/relink/js/utils/rebuilder.js\",\"type\":\"application/javascript\"},\"$:/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\"},\"$:/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/$tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-setmultiplefields/$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/$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/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$checkbox/tag\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/tag\",\"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/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$draggable/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$draggable/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$draggable/filter\",\"text\":\"filter\"},\"$:/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/$linkcatcher/to\":{\"title\":\"$:/config/flibbles/relink/attributes/$linkcatcher/to\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$linkcatcher/set\":{\"title\":\"$:/config/flibbles/relink/attributes/$linkcatcher/set\",\"text\":\"title\"},\"$:/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/$list/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$list/template\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/template\",\"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/history\":{\"title\":\"$:/config/flibbles/relink/attributes/$list/history\",\"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/story\":{\"title\":\"$:/config/flibbles/relink/attributes/$navigator/story\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$navigator/history\":{\"title\":\"$:/config/flibbles/relink/attributes/$navigator/history\",\"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/$setvariable/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$setvariable/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$setvariable/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$setvariable/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$setvariable/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$setvariable/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/attributes/$set/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$set/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$set/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$set/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$set/filter\":{\"title\":\"$:/config/flibbles/relink/attributes/$set/filter\",\"text\":\"filter\"},\"$:/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/$tiddler/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$tiddler/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$transclude/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$transclude/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$transclude/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$transclude/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$view/tiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$view/tiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$view/subtiddler\":{\"title\":\"$:/config/flibbles/relink/attributes/$view/subtiddler\",\"text\":\"title\"},\"$:/config/flibbles/relink/attributes/$wikify/text\":{\"title\":\"$:/config/flibbles/relink/attributes/$wikify/text\",\"text\":\"wikitext\"},\"$:/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\"},\"$:/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\":{\"title\":\"$:/config/flibbles/relink/fields/list\",\"text\":\"list\"},\"$:/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/tags\":{\"title\":\"$:/config/flibbles/relink/fields/tags\",\"text\":\"list\"},\"$:/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/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/NewAttribute/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewAttribute/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/NewField/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewField/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/NewOperator/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewOperator/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/Buttons/NewParameter/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/Buttons/NewParameter/Caption\",\"text\":\"add\"},\"$:/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/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/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/Caption\":{\"title\":\"$:/plugins/flibbles/relink/language/TiddlerInfo/References/Caption\",\"text\":\"//Relink// References\"},\"$:/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/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/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\"},\"$:/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/filter\":{\"title\":\"$:/config/flibbles/relink/macros/list-links/filter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/list-links/emptyMessage\":{\"title\":\"$:/config/flibbles/relink/macros/list-links/emptyMessage\",\"text\":\"wikitext\"},\"$:/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-draggable/itemTemplate\":{\"title\":\"$:/config/flibbles/relink/macros/list-links-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-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-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/tag\":{\"title\":\"$:/config/flibbles/relink/macros/tag/tag\",\"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/toc/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc/tag\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/toc/itemClassFilter\":{\"title\":\"$:/config/flibbles/relink/macros/toc/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-expandable/itemClassFilter\":{\"title\":\"$:/config/flibbles/relink/macros/toc-expandable/itemClassFilter\",\"text\":\"filter\"},\"$:/config/flibbles/relink/macros/toc-expandable/exclude\":{\"title\":\"$:/config/flibbles/relink/macros/toc-expandable/exclude\",\"text\":\"list\"},\"$:/config/flibbles/relink/macros/toc-selective-expandable/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc-selective-expandable/tag\",\"text\":\"title\"},\"$:/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/exclude\":{\"title\":\"$:/config/flibbles/relink/macros/toc-selective-expandable/exclude\",\"text\":\"list\"},\"$:/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/selectedTiddler\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/selectedTiddler\",\"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-external-nav/missingText\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-external-nav/missingText\",\"text\":\"wikitext\"},\"$:/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-internal-nav/tag\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/tag\",\"text\":\"title\"},\"$:/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/unselectedText\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-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/template\":{\"title\":\"$:/config/flibbles/relink/macros/toc-tabbed-internal-nav/template\",\"text\":\"title\"},\"$:/config/flibbles/relink/macros/translink/title\":{\"title\":\"$:/config/flibbles/relink/macros/translink/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/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/operators/field:title\":{\"title\":\"$:/config/flibbles/relink/operators/field:title\",\"text\":\"title\"},\"$:/config/flibbles/relink/operators/relink:report\":{\"title\":\"$:/config/flibbles/relink/operators/relink:report\",\"text\":\"title\"},\"$:/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\"},\"$:/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={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\\\"yes\\\" dir={{$:/config/DefaultTextDirection}}/>\\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\\\" dir={{$:/config/DefaultTextDirection}}>\\n\\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C/$vars>\\n\\n\u003C$reveal state=\\\"!!draft.title\\\" type=\\\"nomatch\\\" text={{!!draft.of}} tag=\\\"div\\\" dir={{$:/config/DefaultTextDirection}}>\\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}}: \u003C$link to={{!!draft.title}} />\\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\"},\"$:/config/flibbles/relink/PluginLibrary\":{\"title\":\"$:/config/flibbles/relink/PluginLibrary\",\"caption\":\"//Relink// Library\",\"url\":\"https://flibbles.github.io/tw5-relink/library/index.html\",\"tags\":\"$:/tags/PluginLibrary\",\"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\"},\"$:/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\"},\"$:/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\"},\"$:/config/DefaultColourMappings/relink-impossible\":{\"title\":\"$:/config/DefaultColourMappings/relink-impossible\",\"text\":\"\u003C\u003Ccolour dirty-indicator>>\"},\"$:/language/Docs/PaletteColours/relink-impossible\":{\"title\":\"$:/language/Docs/PaletteColours/relink-impossible\",\"text\":\"Relink link impossible\"},\"$:/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\"}}}","created":"20230722132104177"}, -{"name":"Relink Field Names","title":"$:/plugins/flibbles/relink-fieldnames","description":"Renames field names with titles matching Relinked tiddlers","author":"Flibbles","version":"2.3.5","core-version":">=5.1.22","parent-plugin":"$:/plugins/flibbles/relink","source":"https://github.com/flibbles/tw5-relink","demo":"http://flibbles.github.io/tw5-relink/","list":"readme reference","dependents":"","plugin-type":"plugin","type":"application/json","text":"{\"tiddlers\":{\"$:/config/flibbles/relink/attributes/$action-deletefield/$field\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-deletefield/$field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$action-listops/$field\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-listops/$field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$action-setfield/$field\":{\"title\":\"$:/config/flibbles/relink/attributes/$action-setfield/$field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$button/setField\":{\"title\":\"$:/config/flibbles/relink/attributes/$button/setField\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$checkbox/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$checkbox/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$edit-text/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$edit-text/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$edit/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$edit/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$fields/exclude\":{\"title\":\"$:/config/flibbles/relink/attributes/$fields/exclude\",\"text\":\"fieldnamelist\"},\"$:/config/flibbles/relink/attributes/$fields/include\":{\"title\":\"$:/config/flibbles/relink/attributes/$fields/include\",\"text\":\"fieldnamelist\"},\"$:/config/flibbles/relink/attributes/$jsontiddler/exclude\":{\"title\":\"$:/config/flibbles/relink/attributes/$jsontiddler/exclude\",\"text\":\"fieldnamelist\"},\"$:/config/flibbles/relink/attributes/$radio/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$radio/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$range/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$range/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$reveal/stateField\":{\"title\":\"$:/config/flibbles/relink/attributes/$reveal/stateField\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$select/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$select/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$setvariable/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$setvariable/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$set/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$set/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$transclude/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$transclude/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/attributes/$view/field\":{\"title\":\"$:/config/flibbles/relink/attributes/$view/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/fieldnames/blacklist\":{\"title\":\"$:/config/flibbles/relink/fieldnames/blacklist\",\"filter\":\"[all[shadows+tiddlers]removeprefix[$:/language/Docs/Fields/]]\",\"text\":\"This tiddler specifies what fields //Relink-fieldname// should refuse to change. Edit its `filter` field if you'd like to change that list.\\n\"},\"$:/plugins/flibbles/relink-fieldnames/fieldtypes/fieldname.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/fieldtypes/fieldname.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/fieldtypes/fieldname.js\\nmodule-type: relinkfieldtype\\ntype: application/javascript\\n\\nThis field type behaves exactly like the \\\"title\\\" field type, except that\\nit ignores any titles that appear on the field name blacklist.\\n\\n\\\\*/\\n\\nexports.name = 'fieldname';\\n\\nvar utils = require(\\\"../utils.js\\\");\\n\\nexports.report = function(value, callback, options) {\\n\\tif (!utils.isReserved(value, options)) {\\n\\t\\tcallback(value);\\n\\t}\\n};\\n\\nexports.relink = function(value, fromTitle, toTitle, options) {\\n\\tif (value === fromTitle\\n\\t&& !utils.isReserved(fromTitle, options)) {\\n\\t\\tif (utils.isReserved(toTitle, options)\\n\\t\\t|| !utils.isValidFieldName(toTitle)) {\\n\\t\\t\\treturn {impossible: true};\\n\\t\\t} else {\\n\\t\\t\\treturn {output: toTitle};\\n\\t\\t}\\n\\t}\\n\\treturn undefined;\\n};\\n\",\"module-type\":\"relinkfieldtype\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/fieldtypes/fieldnamelist.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/fieldtypes/fieldnamelist.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/fieldtypes/fieldnamelist.js\\nmodule-type: relinkfieldtype\\ntype: application/javascript\\n\\nThis field type behaves exactly like the \\\"title\\\" field type, except that\\nit ignores any titles that appear on the field name blacklist.\\n\\n\\\\*/\\n\\nexports.name = 'fieldnamelist';\\n\\nvar utils = require(\\\"../utils.js\\\");\\nvar listModule = require(\\\"$:/plugins/flibbles/relink/js/fieldtypes/list.js\\\");\\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\\tif (!utils.isReserved(list[i], options)) {\\n\\t\\t\\tcallback(list[i]);\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(value, fromTitle, toTitle, options) {\\n\\tvar entry;\\n\\tif (!utils.isReserved(fromTitle, options)) {\\n\\t\\tentry = listModule.relink(value, fromTitle, toTitle, options);\\n\\t\\tif (entry && entry.output && utils.isReserved(toTitle, options)) {\\n\\t\\t\\t// The list updated, but we can't actaully update to this new title\\n\\t\\t\\treturn {impossible: true};\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\",\"module-type\":\"relinkfieldtype\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/filters/field.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/filters/field.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/filters/field.js\\nmodule-type: relinkfilter\\ntype: application/javascript\\n\\nHandles reporting/relinking of shorthand [[field:{field}[]] operators.\\n\\n\\\\*/\\n\\nvar utils = require(\\\"../utils.js\\\");\\n\\nexports.name = \\\"field\\\";\\n\\nexports.after = ['operators'];\\n\\nexports.report = function(filterParseTree, callback, options) {\\n\\tvar operators = options.wiki.getFilterOperators();\\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\\tif (!operators[operator.operator]\\n\\t\\t\\t&& !utils.isReserved(operator.operator, options)) {\\n\\t\\t\\t\\tcallback(operator.operator, \\\"[field:\\\" + utils.blurbOperands(operator) + \\\"]\\\");\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(filterParseTree, fromTitle, toTitle, options) {\\n\\tvar output = {};\\n\\tif (!utils.isReserved(fromTitle, options)) {\\n\\t\\tfor (var i = 0; i \u003C filterParseTree.length; i++) {\\n\\t\\t\\tvar run = filterParseTree[i];\\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\\tif (operator.operator === fromTitle\\n\\t\\t\\t\\t&& !options.wiki.getFilterOperators()[fromTitle]) {\\n\\t\\t\\t\\t\\tif (toTitle.search(/[\\\\[\\\\{\u003C\\\\/]/) >= 0\\n\\t\\t\\t\\t\\t|| utils.isReserved(toTitle, options)) {\\n\\t\\t\\t\\t\\t\\t// can't be an operator or a suffix. we must fail.\\n\\t\\t\\t\\t\\t\\toutput.impossible = true;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tif (options.wiki.getFilterOperators()[toTitle]\\n\\t\\t\\t\\t\\t\\t|| toTitle.indexOf(':') >= 0) {\\n\\t\\t\\t\\t\\t\\t\\t// It can't use the shorthand without causing problems\\n\\t\\t\\t\\t\\t\\t\\t// we use longhand field operator\\n\\t\\t\\t\\t\\t\\t\\toperator.operator = \\\"field\\\";\\n\\t\\t\\t\\t\\t\\t\\toperator.suffix = toTitle;\\n\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\toperator.operator = toTitle;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\toutput.changed = 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\",\"module-type\":\"relinkfilter\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/filters/search.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/filters/search.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/filters/search.js\\nmodule-type: relinkfilter\\ntype: application/javascript\\n\\nHandles reporting/relinking of filter operator suffixes using a hidden whitelist.\\n\\n\\\\*/\\n\\nvar utils = require(\\\"../utils.js\\\");\\n\\nexports.name = \\\"search\\\";\\n\\nexports.report = function(filterParseTree, callback, options) {\\n\\tvar inverted = false;\\n\\teachSuffix(filterParseTree, function(title, rawEntry, operator, index) {\\n\\t\\tif (index === 0 && rawEntry[0] === '-') {\\n\\t\\t\\tinverted = true;\\n\\t\\t}\\n\\t\\tif (!utils.isReserved(title, options)) {\\n\\t\\t\\tvar blurb = inverted? \\\"[search:-\\\": \\\"[search:\\\";\\n\\t\\t\\tif (operator.suffixes[1]) {\\n\\t\\t\\t\\tblurb += ':' + operator.suffixes[1].join(',');\\n\\t\\t\\t}\\n\\t\\t\\tcallback(title, blurb + utils.blurbOperands(operator) + \\\"]\\\");\\n\\t\\t}\\n\\t});\\n};\\n\\nexports.relink = function(filterParseTree, fromTitle, toTitle, options) {\\n\\tvar output = {};\\n\\tif (!utils.isReserved(fromTitle, options)) {\\n\\t\\teachSuffix(filterParseTree, function(title, rawEntry, operator, index) {\\n\\t\\t\\tif (title === fromTitle) {\\n\\t\\t\\t\\tif (utils.isReserved(toTitle, options)\\n\\t\\t\\t\\t|| toTitle.search(/[\\\\[\\\\{\u003C\\\\/,:]/) >= 0\\n\\t\\t\\t\\t|| (index == 0\\n\\t\\t\\t\\t\\t&& rawEntry[0] !== '-'\\n\\t\\t\\t\\t\\t&& (toTitle[0] === '-' || toTitle === '*'))) {\\n\\t\\t\\t\\t\\toutput.impossible = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\toutput.changed = true;\\n\\t\\t\\t\\t\\treturn toTitle;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t});\\n\\t}\\n\\treturn output;\\n};\\n\\nfunction eachSuffix(filterParseTree, callback) {\\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\\tvar opChanged = false;\\n\\t\\t\\tif (operator.operator === 'search' && operator.suffix) {\\n\\t\\t\\t\\tvar list = operator.suffixes[0];\\n\\t\\t\\t\\tfor (var index = 0; index \u003C list.length; index++) {\\n\\t\\t\\t\\t\\tvar title = list[index];\\n\\t\\t\\t\\t\\tvar raw = title;\\n\\t\\t\\t\\t\\tif (index === 0) {\\n\\t\\t\\t\\t\\t\\tif (title[0] === '-') {\\n\\t\\t\\t\\t\\t\\t\\ttitle = title.substr(1);\\n\\t\\t\\t\\t\\t\\t} else if (title === '*') {\\n\\t\\t\\t\\t\\t\\t\\tcontinue;\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tvar newValue = callback(title, raw, operator, index);\\n\\t\\t\\t\\t\\tif (newValue) {\\n\\t\\t\\t\\t\\t\\tlist[index] = (index === 0 && raw[0] === '-') ?\\n\\t\\t\\t\\t\\t\\t\\t'-' + newValue:\\n\\t\\t\\t\\t\\t\\t\\tnewValue;\\n\\t\\t\\t\\t\\t\\topChanged = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\tif (opChanged) {\\n\\t\\t\\t\\t// There was a change. reassemble the suffix\\n\\t\\t\\t\\toperator.suffix = operator.suffixes.map(function(part) {\\n\\t\\t\\t\\t\\treturn part.join(',');\\n\\t\\t\\t\\t}).join(':');\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\",\"module-type\":\"relinkfilter\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/filters/suffixes.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/filters/suffixes.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/filters/suffixes.js\\nmodule-type: relinkfilter\\ntype: application/javascript\\n\\nHandles reporting/relinking of filter operator suffixes using a hidden whitelist.\\n\\n\\\\*/\\n\\nvar utils = require(\\\"../utils.js\\\");\\n\\nexports.name = \\\"suffixes\\\";\\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\\tvar settings = options.settings.getConfig('suffixes')[operator.operator];\\n\\t\\t\\tif (settings) {\\n\\t\\t\\t\\tsettings[1].report(operator.suffix, function(title, blurb) {\\n\\t\\t\\t\\t\\tcallback(title, '[' + operator.operator + ':' + (blurb || '') + utils.blurbOperands(operator) + ']');\\n\\t\\t\\t\\t}, options);\\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\\tvar settings = options.settings.getConfig('suffixes')[operator.operator];\\n\\t\\t\\tvar operatorChanged = false;\\n\\t\\t\\tif (settings) {\\n\\t\\t\\t\\tvar handler = settings[1];\\n\\t\\t\\t\\tif (handler) {\\n\\t\\t\\t\\t\\tvar entry = handler.relink(operator.suffix, fromTitle, toTitle, options);\\n\\t\\t\\t\\t\\tif (entry) {\\n\\t\\t\\t\\t\\t\\tif (entry.output) {\\n\\t\\t\\t\\t\\t\\t\\tif (entry.output.search(/[\\\\[\\\\{\u003C\\\\/]/) \u003C 0) {\\n\\t\\t\\t\\t\\t\\t\\t\\toutput.changed = true;\\n\\t\\t\\t\\t\\t\\t\\t\\toperatorChanged = true;\\n\\t\\t\\t\\t\\t\\t\\t\\toperator.suffix = entry.output;\\n\\t\\t\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\t\\t\\tentry.impossible = true;\\n\\t\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\t\\tif (entry.impossible) {\\n\\t\\t\\t\\t\\t\\t\\toutput.impossible = true;\\n\\t\\t\\t\\t\\t\\t}\\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\",\"module-type\":\"relinkfilter\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/htmlFields.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/htmlFields.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/htmlFields.js\\nmodule-type: relinkhtml\\ntype: application/javascript\\n\\nThis updates html attribute names which correspond to fields.\\n\\ne.g.\\n\\n\u003C$action-createtiddler myfield=\\\"...\\\" />\\n\\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\n\\nexports.name = \\\"fieldnames\\\";\\n\\nexports.report = function(element, parser, callback, options) {\\n\\tvar regexp = parser.context.getConfig(\\\"fieldattributes\\\")[element.tag];\\n\\tif (regexp) {\\n\\t\\tfor (var attributeName in element.attributes) {\\n\\t\\t\\tvar results = regexp.exec(attributeName);\\n\\t\\t\\tif (results\\n\\t\\t\\t&& results[0] === attributeName\\n\\t\\t\\t&& !utils.isReserved(results[1], options)) {\\n\\t\\t\\t\\tvar attr = element.attributes[attributeName];\\n\\t\\t\\t\\tvar blurb;\\n\\t\\t\\t\\tswitch (attr.type) { \\n\\t\\t\\t\\tcase \\\"string\\\":\\n\\t\\t\\t\\t\\tblurb = '\\\"' + utils.abridge(attr.value) + '\\\"';\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\tcase \\\"indirect\\\":\\n\\t\\t\\t\\t\\tblurb = \\\"{{\\\" + attr.textReference + \\\"}}\\\";\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\tcase \\\"filtered\\\":\\n\\t\\t\\t\\t\\tblurb = \\\"{{{\\\" + utils.abridge(attr.filter) + \\\"}}}\\\";\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\tcase \\\"macro\\\":\\n\\t\\t\\t\\t\\t// Find the equals\\n\\t\\t\\t\\t\\tvar equals = parser.source.indexOf(\\\"=\\\", attr.start);\\n\\t\\t\\t\\t\\t// Now that the macrostart after that equals\\n\\t\\t\\t\\t\\tvar macroStart = parser.source.indexOf(\\\"\u003C\\\", equals);\\n\\t\\t\\t\\t\\tblurb = \\\"\u003C\u003C\\\" + utils.abridge(parser.source.substring(macroStart+2, attr.end-2)) + \\\">>\\\";\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcallback(results[1], element.tag + ' =' + blurb);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(element, parser, fromTitle, toTitle, options) {\\n\\tvar entry = {};\\n\\tif (!utils.isReserved(fromTitle, options)) {\\n\\t\\tvar regexp = parser.context.getConfig(\\\"fieldattributes\\\")[element.tag];\\n\\t\\tif (regexp) {\\n\\t\\t\\tfor (var attributeName in element.attributes) {\\n\\t\\t\\t\\tvar results = regexp.exec(attributeName);\\n\\t\\t\\t\\tif (results\\n\\t\\t\\t\\t&& results[0] === attributeName\\n\\t\\t\\t\\t&& results[1] === fromTitle) {\\n\\t\\t\\t\\t\\tvar newName = alterAttributeName(attributeName, fromTitle, toTitle, regexp, options);\\n\\t\\t\\t\\t\\tif (newName === undefined) {\\n\\t\\t\\t\\t\\t\\tentry.impossible = true;\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\telement.attributes[attributeName].name = newName;\\n\\t\\t\\t\\t\\t\\tentry.output = true;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn entry;\\n};\\n\\n// Returns undefined if it doesn't work out.\\nfunction alterAttributeName(attributeName, fromTitle, toTitle, regexp, options) {\\n\\tif (!utils.isReserved(toTitle, options)) {\\n\\t\\tvar newName = attributeName.replace(fromTitle, toTitle);\\n\\t\\tvar match = regexp.exec(newName);\\n\\t\\tif (match && match[0] === newName && match[1] === toTitle) {\\n\\t\\t\\t// Taken from parseutils.js\\n\\t\\t\\tvar reAttributeName = /([^\\\\/\\\\s>\\\"'=]+)/;\\n\\t\\t\\tmatch = reAttributeName.exec(newName);\\n\\t\\t\\tif (match && match[0] === newName) {\\n\\t\\t\\t\\treturn newName;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t}\\n\\treturn undefined;\\n};\\n\",\"module-type\":\"relinkhtml\",\"type\":\"application/javascript\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/firstSearchFilterField\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/firstSearchFilterField\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/macros/keyboard-driven-input/secondSearchFilterField\":{\"title\":\"$:/config/flibbles/relink/macros/keyboard-driven-input/secondSearchFilterField\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/macros/list-links-draggable/field\":{\"title\":\"$:/config/flibbles/relink/macros/list-links-draggable/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/macros/tag-picker/tagField\":{\"title\":\"$:/config/flibbles/relink/macros/tag-picker/tagField\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/macros/timeline/dateField\":{\"title\":\"$:/config/flibbles/relink/macros/timeline/dateField\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/each\":{\"title\":\"$:/config/flibbles/relink/operators/each\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/eachday\":{\"title\":\"$:/config/flibbles/relink/operators/eachday\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/fields\":{\"title\":\"$:/config/flibbles/relink/operators/fields\",\"text\":\"fieldnamelist\"},\"$:/config/flibbles/relink/operators/get\":{\"title\":\"$:/config/flibbles/relink/operators/get\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/has\":{\"title\":\"$:/config/flibbles/relink/operators/has\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/listed\":{\"title\":\"$:/config/flibbles/relink/operators/listed\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/nsort\":{\"title\":\"$:/config/flibbles/relink/operators/nsort\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/nsortcs\":{\"title\":\"$:/config/flibbles/relink/operators/nsortcs\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/sort\":{\"title\":\"$:/config/flibbles/relink/operators/sort\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/sortan\":{\"title\":\"$:/config/flibbles/relink/operators/sortan\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/sortcs\":{\"title\":\"$:/config/flibbles/relink/operators/sortcs\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/operators/has:field\":{\"title\":\"$:/config/flibbles/relink/operators/has:field\",\"text\":\"fieldname\"},\"$:/plugins/flibbles/relink-fieldnames/readme\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/readme\",\"text\":\"\\\\whitespace trim\\n\\nEnables Relink to relink field names associated with renamed tiddlers. The following fields cannot be interacted with in this way:\\n\\n\u003C\u003C\u003C\\n\u003C$set name=blacklisted filter={{$:/config/flibbles/relink-fieldnames/blacklist!!filter}}>\\n''\u003C$list counter=counter filter=\\\"[enlist\u003Cblacklisted>sort[]]\\\">\\n\u003C\u003CcurrentTiddler>>\u003Cbr>\\n\u003C/$list>''\\n\u003C/$set>\\n\u003C\u003C\u003C\\n\\nSee \u003Ca href={{$:/plugins/flibbles/relink-fieldnames!!source}} class=\\\"tc-tiddlylink-external\\\">the tw5-relink website\u003C/a> for more details and examples.\\n\"},\"$:/plugins/flibbles/relink-fieldnames/reference.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/reference.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/reference.js\\nmodule-type: relinkreference\\ntype: application/javascript\\n\\nTakes care of renaming \\n\\\\*/\\n\\nvar utils = require(\\\"./utils.js\\\");\\n\\nexports.name = 'fieldname';\\n\\nexports.report = function(reference, callback, options) {\\n\\tif (reference.field\\n\\t&& !utils.isReserved(reference.field, options)) {\\n\\t\\tcallback(reference.field, (reference.title || '') + \\\"!!\\\");\\n\\t}\\n};\\n\\nexports.relink = function(reference, fromTitle, toTitle, options) {\\n\\tif (reference.field === fromTitle\\n\\t&& !utils.isReserved(fromTitle, options)) {\\n\\t\\tif (utils.isReserved(toTitle, options)) {\\n\\t\\t\\treturn {impossible: true};\\n\\t\\t} else {\\n\\t\\t\\treference.field = toTitle;\\n\\t\\t\\treturn {output: reference};\\n\\t\\t}\\n\\t}\\n};\\n\",\"module-type\":\"relinkreference\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/reference\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/reference\",\"caption\":\"Field Names\",\"tags\":\"$:/tags/flibbles/relink/Configuration\",\"text\":\"\\\\define label(arrow, setTo) \u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Ctable-state>> text=\\\"$setTo$\\\" default=\\\"no\\\">\u003C$button class=\\\"tc-btn-invisible tc-btn-dropdown\\\" set=\u003C\u003Ctable-state>> setTo=\\\"$setTo$\\\">{{$arrow$}} ''\u003C$link to=\u003C\u003Cfield>>/>''\u003C/$button> \u003Cspan class=\\\"tc-relink-fieldnames-count\\\">(\u003C$text text={{{ [has\u003Cfield>count[]] }}} />)\u003C/span>\u003C/$reveal>\\n\\n\\\\define entry(field)\\n\u003C$set name=\\\"table-state\\\" value=\u003C\u003Cqualify \\\"\\\"\\\"$:/state/flibbles/relink-fieldnames/table/$field$\\\"\\\"\\\">>>\\n\u003Ctr class=\\\"tc-relink-fieldnames-field\\\">\\n\u003Ctd colspan=\\\"3\\\">\\n\u003C\u003Clabel $:/core/images/right-arrow yes>>\\n\u003C\u003Clabel $:/core/images/down-arrow no>>\\n\u003C/td>\\n\u003C/tr>\\n\u003C$list filter=\\\"[has\u003Cfield>]\\\" >\\n\u003C$reveal tag=\\\"tr\\\" type=\\\"match\\\" state=\u003C\u003Ctable-state>> text=\\\"yes\\\" default=\\\"no\\\" class=\\\"tc-relink-fieldnames-entry\\\">\\n\u003Ctd class=\\\"tc-relink-fieldnames-margin\\\">\u003C/td>\\n\u003Ctd class=\\\"tc-relink-fieldnames-title\\\">\u003C$link to=\u003C\u003CcurrentTiddler>> />\u003C/td>\u003Ctd>\u003C$text text={{{ [all[current]get\u003Cfield>] }}} />\u003C/td>\\n\u003C/$reveal>\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\\\whitespace trim\\n\\nThe following is a table of all tiddlers currently being used as field names.\\n\\n\u003C$set name=blacklisted filter={{$:/config/flibbles/relink-fieldnames/blacklist!!filter}} >\\n\u003Ctable class=\\\"tc-relink-fieldnames-table\\\">\\n\u003Ctbody>\\n\u003C$list variable=\\\"field\\\" filter=\\\"[fields[]is[tiddler]] -[enlist\u003Cblacklisted>]\\\">\\n\u003C$macrocall $name=\\\"entry\\\" field=\u003C\u003Cfield>> />\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\u003C/$set>\\n\"},\"$:/plugins/flibbles/relink-fieldnames/relinkoperator.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/relinkoperator.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/relinkoperator.js\\nmodule-type: relinkoperator\\ntype: application/javascript\\n\\nUpdates the field names if they correspond to the renamed tiddler.\\n\\n\\\\*/\\n\\n/*jslint node: false, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.name = 'field-names';\\n\\nexports.after = ['fields'];\\n\\nvar utils = require(\\\"./utils.js\\\");\\n\\nvar configPrefix = \\\"$:/config/flibbles/relink/fields/\\\";\\n\\nexports.report = function(tiddler, callback, options) {\\n\\tvar fields = tiddler.fields;\\n\\tfor (var field in fields) {\\n\\t\\tif (!utils.isReserved(field, options)) {\\n\\t\\t\\tcallback(field, ': ' + utils.abridge(fields[field]), {soft: true});\\n\\t\\t}\\n\\t}\\n};\\n\\nexports.relink = function(tiddler, fromTitle, toTitle, changes, options) {\\n\\tif ($tw.utils.hop(tiddler.fields, fromTitle)\\n\\t&& !utils.isReserved(fromTitle, options)) {\\n\\t\\tif ($tw.utils.hop(tiddler.fields, toTitle)\\n\\t\\t|| utils.isReserved(toTitle, options)\\n\\t\\t|| !utils.isValidFieldName(toTitle)) {\\n\\t\\t\\t// There is already a [toTitle] field, and we won't clobber it.\\n\\t\\t\\t// Or this is an illegal field name\\n\\t\\t\\tchanges[fromTitle] = {impossible: true};\\n\\t\\t} else if ($tw.utils.hop(changes, fromTitle)) {\\n\\t\\t\\t// If the value changed, we need the changed value, assuming there\\n\\t\\t\\t// is one.\\n\\t\\t\\tchanges[toTitle] = {\\n\\t\\t\\t\\toutput: changes[fromTitle].output || tiddler.fields[fromTitle]\\n\\t\\t\\t};\\n\\t\\t\\t// But we leave the original change in place in case it described\\n\\t\\t\\t// an impossible relink or something.\\n\\t\\t\\tchanges[fromTitle].output = null;\\n\\t\\t} else {\\n\\t\\t\\tchanges[toTitle] = {output: tiddler.fields[fromTitle]};\\n\\t\\t\\tchanges[fromTitle] = {output: null};\\n\\t\\t}\\n\\t}\\n\\t// If this is a whitelist entry for the fromTitle field, update it.\\n\\tif (tiddler.fields.title === configPrefix + fromTitle) {\\n\\t\\tvar newTitle = configPrefix + toTitle;\\n\\t\\t// Make sure we wouldn't be deleting an existing whitelist entry.\\n\\t\\tchanges.title = (!options.wiki.tiddlerExists(newTitle)) ?\\n\\t\\t\\t{ output: newTitle }:\\n\\t\\t\\t{ impossible: true };\\n\\t}\\n};\\n\\nfunction abridge(string, length) {\\n\\treturn (string.length > length)? string.substr(0, length) + \\\"...\\\" : string;\\n};\\n\\n\",\"module-type\":\"relinkoperator\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/setting/fieldnames.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/setting/fieldnames.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/flibbles/relink-fieldnames/setting/fieldnames.js\\nmodule-type: relinksetting\\ntype: application/javascript\\n\\nThe setting module interfaces with the relink settings to store\\na configuration for the blacklist.\\n\\\\*/\\n\\nexports.name = \\\"fieldnames\\\";\\n\\nexports.generate = function(settings, tiddler, key, wiki) {\\n\\tif (key === \\\"blacklist\\\") {\\n\\t\\tvar tiddlers = wiki.filterTiddlers(tiddler.fields.filter);\\n\\t\\tvar fieldMap = Object.create(null);\\n\\t\\tfor (var i = 0; i \u003C tiddlers.length; i++) {\\n\\t\\t\\tfieldMap[tiddlers[i]] = true;\\n\\t\\t}\\n\\t\\tsettings.blacklist = function(field) {\\n\\t\\t\\treturn fieldMap[field] || false;\\n\\t\\t};\\n\\t}\\n\\t// else { I don't know what else there could be... }\\n};\\n\",\"module-type\":\"relinksetting\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/setting/suffixes.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/setting/suffixes.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/flibbles/relink-fieldnames/setting/suffixes.js\\nmodule-type: relinksetting\\ntype: application/javascript\\n\\nThe setting module interfaces with the relink settings to store\\nthe whitelist for all the operator suffixes\\n\\\\*/\\n\\nvar utils = require('$:/plugins/flibbles/relink/js/utils');\\n\\nexports.name = \\\"suffixes\\\";\\n\\nexports.generate = function(suffixes, 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\\tsuffixes[name] = suffixes[name] || Object.create(null);\\n\\t\\tsuffixes[name][pair[1] || 1] = data;\\n\\t}\\n};\\n\",\"module-type\":\"relinksetting\",\"type\":\"application/javascript\"},\"$:/plugins/flibbles/relink-fieldnames/style\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/style\",\"tags\":\"$:/tags/Stylesheet\",\"text\":\".tc-relink-fieldnames-table {\\n\\twidth: 100%;\\n\\tborder: 0px;\\n}\\n\\n.tc-relink-fieldnames-field a {\\n\\tfont-weight: bold;\\n}\\n\\n.tc-relink-fieldnames-field td {\\n\\tborder: 0px;\\n}\\n\\n.tc-relink-fieldnames-count {\\n\\tcolor: lightgray;\\n}\\n\\n.tc-relink-fieldnames-title {\\n\\tmargin-left: 3pt;\\n\\tmin-width: 30%;\\n}\\n\\n.tc-relink-fieldnames-entry td {\\n\\tborder: 0px;\\n\\tborder-bottom: 1px solid \u003C\u003Ccolour table-border>>;\\n}\\n\\n.tc-relink-fieldnames-margin {\\n\\twidth: 25pt;\\n}\\n\"},\"$:/config/flibbles/relink/suffixes/contains\":{\"title\":\"$:/config/flibbles/relink/suffixes/contains\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/suffixes/days\":{\"title\":\"$:/config/flibbles/relink/suffixes/days\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/suffixes/field\":{\"title\":\"$:/config/flibbles/relink/suffixes/field\",\"text\":\"fieldname\"},\"$:/config/flibbles/relink/suffixes/regexp\":{\"title\":\"$:/config/flibbles/relink/suffixes/regexp\",\"text\":\"fieldname\"},\"$:/plugins/flibbles/relink-fieldnames/utils.js\":{\"title\":\"$:/plugins/flibbles/relink-fieldnames/utils.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/flibbles/relink-fieldnames/utils.js\\nmodule-type: library\\ntype: application/javascript\\n\\n\\\\*/\\n\\nvar blacklistTiddler = \\\"$:/config/flibbles/relink/fieldnames/blacklist\\\";\\nvar docPrefix = \\\"$:/language/Docs/Fields/\\\";\\n\\nvar whitelist = require('$:/plugins/flibbles/relink/js/utils.js').getContext('whitelist');\\n\\nwhitelist.hotDirectories.push(docPrefix);\\n\\nexports.isReserved = function(field, options) {\\n\\tvar method = options.settings.getConfig(\\\"fieldnames\\\").blacklist || function() { return true; };\\n\\treturn method(field);\\n};\\n\\nexports.abridge = function(string, length) {\\n\\tif (typeof string === \\\"string\\\") {\\n\\t\\tlength = length || 30;\\n\\t\\tstring = string.replace(/\\\\s+/g, \\\" \\\");\\n\\t\\treturn (string.length > length)? string.substr(0, length) + \\\"...\\\" : string;\\n\\t}\\n\\treturn string;\\n}\\n\\n// Pre v5.2.0, this will be false. But we can't rely on utils.isValidFieldName\\n// entirely, because it is forgiving about capitalization when we can't be.\\nvar capitalizationAllowed = $tw.utils.isValidFieldName(\\\"A:\\\");\\n\\nexports.isValidFieldName = function(field) {\\n\\treturn $tw.utils.isValidFieldName(field)\\n\\t\\t&& (capitalizationAllowed || !/[A-Z]/.test(field));\\n};\\n\\nexports.blurbOperands = function(operator) {\\n\\tvar string = ''\\n\\tfor (var index = 0; index \u003C operator.operands.length; index++) {\\n\\t\\tif (index > 0) {\\n\\t\\t\\tstring += ',';\\n\\t\\t}\\n\\t\\tvar operand = operator.operands[index];\\n\\t\\tif (operand.indirect) {\\n\\t\\t\\tstring += '{' + exports.abridge(operand.text) + '}';\\n\\t\\t} else if (operand.variable) {\\n\\t\\t\\tstring += '\u003C' + exports.abridge(operand.text) + '>';\\n\\t\\t} else {\\n\\t\\t\\tstring += '[' + exports.abridge(operand.text) + ']';\\n\\t\\t}\\n\\t}\\n\\treturn string;\\n};\\n\",\"module-type\":\"library\",\"type\":\"application/javascript\"}}}"}, -{"title":"$:/plugins/sq/streams","name":"Streams","description":"Rapid data entry with a keyboard driven workflow. Divide content into smaller tiddlers as you write.","plugin-type":"plugin","plugin-priority":"1","author":"Saq Imtiaz","version":"1.2.24","core-version":">=5.1.23","list":"Settings CHANGELOG","source":"https://saqimtiaz.github.io/streams/","dependents":"$:/plugins/flibbles/relink","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/sq/streams/CHANGELOG\":{\"title\":\"$:/plugins/sq/streams/CHANGELOG\",\"text\":\"Release notes for the current release:\\n\\n{{$:/plugins/sq/streams/releasenotes}}\\n\\n[[Full changelog|https://saqimtiaz.github.io/streams/#CHANGELOG]] for Streams\\n\"},\"$:/plugins/sq/streams/Settings/config\":{\"title\":\"$:/plugins/sq/streams/Settings/config\",\"caption\":\"Configuration\",\"text\":\"\\\\define sortBySettingsGroupFilter()\\n[get[settings-group]!is[blank]else[!general]] [get[settings-group-header]!is[blank]else[99]] +[join[]]\\n\\\\end\\n\\n\u003C$edit-text tiddler=\\\"$:/state/sq/streams/settings/search\\\" class=\\\"sq-search-input\\\" default=\\\"\\\" tag=\\\"input\\\" type=\\\"search\\\" placeholder=\\\"search...\\\"/>\\n\\n\u003Cdiv class=\\\"sq-list-group sq-list-group-box-shadow sq-list-stream-settings\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]prefix[$:/config/sq/streams]has[settings-template]] +[search:title,caption,description{$:/state/sq/streams/settings/search}] +[sortsub\u003CsortBySettingsGroupFilter>]\\\">\\n\u003C$list filter={{{[{!!condition}!is[blank]] :else[{!!title}]}}} variable=\\\"list-condition\\\">\\n\u003Cdiv class=\\\"sq-list-group-item\\\">\\n\u003C$transclude tiddler={{!!settings-template}}/>\\n\u003C/div>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/div>\"},\"$:/plugins/sq/streams/Settings/shortcuts\":{\"title\":\"$:/plugins/sq/streams/Settings/shortcuts\",\"caption\":\"Shortcuts\",\"text\":\"\\\\import $:/core/ui/ControlPanel/KeyboardShortcuts\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]prefix[$:/config/ShortcutInfo/streams-]removeprefix[$:/config/ShortcutInfo/]]\\\" variable=\\\"shortcutName\\\">\\n\u003C\u003Cshortcut-item>>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\"},\"$:/plugins/sq/streams/Settings\":{\"title\":\"$:/plugins/sq/streams/Settings\",\"tags\":\"$:/tags/ControlPanel\",\"caption\":\"Streams settings\",\"text\":\"\u003C\u003Ctabs \\\"$:/plugins/sq/streams/Settings/config $:/plugins/sq/streams/Settings/shortcuts\\\" \\\"$:/plugins/sq/streams/Settings/config\\\" \\\"$:/state/streams/settings/tabs\\\">>\\n\"},\"$:/plugins/sq/streams/action-macros\":{\"title\":\"$:/plugins/sq/streams/action-macros\",\"text\":\"\\\\whitespace trim\\n\\n\\\\define swiped-right-actions()\\n\u003C$list filter=\\\"[{$:/config/sq/streams/swipe-behaviour}match[contextmenu]]\\\" variable=\\\"_NULL\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003Ccontextmenu-state>> $field=\\\"current\\\" $value=\u003C\u003Cdom-data-node-title>>/>\\n\u003C$action-setfield $tiddler=\u003C\u003Ccontextmenu-state>> $field=\\\"position\\\" $value={{$:/config/sq/streams/swipe-contextmenu-position}}/>\\n\u003C$action-popup $coords=\u003C\u003Ctv-popup-coords>> $state=\u003C\u003Ccontextmenu-state>>/>\\n\u003C/$list>\\n\u003C$list filter=\\\"[{$:/config/sq/streams/swipe-behaviour}match[indent]]\\\" variable=\\\"_NULL\\\">\\n\u003C$vars currentTiddler=\u003C\u003Cdom-data-node-title>>>\\n\u003C\u003Cindent-node-actions>>\\n\u003C/$vars>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define swiped-left-actions()\\n\u003C$list filter=\\\"[{$:/config/sq/streams/swipe-behaviour}match[indent]]\\\" variable=\\\"_NULL\\\">\\n\u003C$vars currentTiddler=\u003C\u003Cdom-data-node-title>>>\\n\u003C\u003Cunindent-node-actions>>\\n\u003C/$vars>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define oncontext-menu-actions()\\n\u003C$action-setfield $tiddler=\u003C\u003Ccontextmenu-state>> $field=\\\"current\\\" $value=\u003C\u003Cdom-data-node-title>>/>\\n\u003C$action-setfield $tiddler=\u003C\u003Ccontextmenu-state>> $field=\\\"position\\\" $value=\\\"left\\\"/>\\n\u003C$action-popup $coords=\u003C\u003Ctv-popup-coords>> $state=\u003C\u003Ccontextmenu-state>>/>\\n\\\\end\\n\\n\\n\\\\define node-ctrl-btn-actions()\\n\u003C$list filter=\\\"[\u003Cdom-data-btn-role>match[stream-node-visibility]]\\\" variable=\\\"NULL\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003Cdom-data-rowchildren-visibility-state>> text={{{ [\u003Cdom-data-rowchildren-visibility-state>get[text]match[hide]then[show]else[hide]] }}} />\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003Cdom-data-btn-role>match[stream-node-decorator]]\\\" variable=\\\"NULL\\\">\\n\u003C$action-navigate $to=\u003C\u003Cdom-data-node-title>>/>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define toggle-row-edit-state()\\n\u003C$action-unselect/>\\n\u003C$list filter=\\\"[\u003Crow-edit-state>get[text]else[]!match\u003Cdom-data-node-title>]\\\" variable=\\\"NULL\\\">\\n\u003C$list filter=\\\"[[$:/status/IsReadOnly]get[text]!is[blank]else[no]!match[yes]]\\\" variable=\\\"NULL\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003Cdom-data-node-title>> />\\n\u003C!--\\t\u003C$action-setfield $tiddler=\u003C\u003Cdom-data-node-title>> throttle.refresh=\\\"yes\\\"/>-->\\n\u003C/$list>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define save-edit-node-actions()\\n\u003C!-- handle saving a node being edited -->\\n\u003C!-- XXX draft -->\\n\u003C!--\u003C$action-deletefield $tiddler={{{ [\u003Cdom-data-node-title>!is[blank]else\u003CcurrentTiddler>] }}} $field=\\\"throttle.refresh\\\" />-->\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Crow-edit-state>> />\\n\\\\end\\n\\n\\n\\\\define indent-node-actions()\\n\u003C!-- handle indenting a node -->\\n\u003C$vars previous-node={{{ [{!!parent}get[stream-list]enlist-input[]is[tiddler]before\u003CcurrentTiddler>] }}}>\\n\u003C$list filter=\\\"[\u003Cprevious-node>minlength[1]]\\\" variable=\\\"_NULL\\\">\\n\\t\u003C$action-listops $tiddler=\u003C\u003Cprevious-node>> $field=\\\"stream-list\\\" $subfilter=\\\"+[is[tiddler]] [\u003CcurrentTiddler>]\\\"/>\\n\\t\u003C$action-listops $tiddler={{!!parent}} $field=\\\"stream-list\\\" $subfilter=\\\"+[is[tiddler]] -[\u003CcurrentTiddler>]\\\"/>\\n\\t\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> parent=\u003C\u003Cprevious-node>> />\\n\u003C/$list>\\n\u003C/$vars>\\n\\\\end\\n\\n\\n\\\\define unindent-node-actions()\\n\u003C!-- handle unindenting a node -->\\n\u003C$vars new-parent={{{ [{!!parent}get[parent]] }}} new-next-node={{{ [{!!parent}get[parent]get[stream-list]enlist-input[]is[tiddler]after{!!parent}] }}}>\\n \u003C$list filter=\\\"[\u003Cnew-parent>minlength[1]]\\\" variable=\\\"_NULL\\\">\\n \u003C$action-listops $tiddler=\u003C\u003Cnew-parent>> $field=\\\"stream-list\\\" $subfilter=\\\"+[is[tiddler]] +[insertbefore:new-next-node\u003CcurrentTiddler>]\\\"/>\\n \u003C$action-listops $tiddler={{!!parent}} $field=\\\"stream-list\\\" $subfilter=\\\"+[is[tiddler]] -[\u003CcurrentTiddler>]\\\"/>\\n \u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> parent=\u003C\u003Cnew-parent>> />\\n \u003C/$list>\\n\u003C/$vars>\\n\\\\end\\n\\n\\n\\\\define demote-node-actions()\\n\u003C!-- move a node below the next node -->\\n\u003C$list filter=\\\"[{!!parent}get[stream-list]enlist-input[]after\u003CcurrentTiddler>]\\\" variable=\\\"next-node\\\">\\n \u003C$action-listops $tiddler={{!!parent}} $field=\\\"stream-list\\\" $subfilter=\\\"+[insertbefore:currentTiddler\u003Cnext-node>]\\\"/>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define promote-node-actions()\\n\u003C!-- move a node above the previous node -->\\n\u003C$list filter=\\\"[{!!parent}get[stream-list]enlist-input[]before\u003CcurrentTiddler>]\\\" variable=\\\"previous-node\\\">\\n \u003C$action-listops $tiddler={{!!parent}} $field=\\\"stream-list\\\" $subfilter=\\\"+[insertbefore:previous-node\u003CcurrentTiddler>]\\\"/>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define save-node-actions()\\n\u003C$list filter=\\\"\\\"\\\"[{$:/config/sq/streams/split-at-caret}match[yes]]\\\"\\\"\\\" variable=\\\"_NULL\\\" emptyMessage=\u003C\u003Cadd-node-actions>> >\\n\u003C$list filter=\\\"[\u003CselectionEnd>!is[blank]else[0]!match[0]]\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[text]length[]subtract\u003CselectionEnd>!match[0]]\\\" variable=\\\"_NULL\\\" emptyMessage=\u003C\u003Cadd-node-actions>>>\\n\\t\u003C$macrocall $name=\\\"add-node-actions\\\" startText={{{[\u003CcurrentTiddler>get[text]split[]rest\u003CselectionEnd>join[]trim[]]}}} streamList={{!!stream-list}} />\u003C!--insertPosition=\\\"title\\\"-->\\n\\t\u003C$action-setfield $tiddler=\\\"$:/state/sq/streams/caret-position\\\" text=\\\"0\\\"/>\\n\\t\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> text={{{[\u003CcurrentTiddler>get[text]split[]first\u003CselectionEnd>join[]]}}} stream-list=\\\"\\\"/>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C$list filter=\\\"[\u003CselectionEnd>!is[blank]else[0]match[0]]\\\" variable=\\\"_NULL\\\">\\n\\t\u003C$list filter=\\\"[\u003CcurrentTiddler>!has[text]]\\\" variable=\\\"_NULL\\\" emptyMessage=\u003C\u003Cadd-node-actions \\\"\\\" \\\"title\\\">> >\\n\\t\\t\u003C$list filter=\\\"\\\"\\\"[{$:/config/sq/streams/exit-on-saving-empty-node}match[yes]]\\\"\\\"\\\" variable=\\\"_NULL\\\" emptyMessage=\u003C\u003Cadd-node-actions>> >\\n\\t\\t\\t\u003C\u003Ccancel-edit-node-actions>>\\n\\t\\t\u003C/$list>\\n\\t\u003C/$list>\\n\u003C/$list>\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define add-new-node-actions()\\n\u003C!-- used by new node button at the bottom of a stream -->\\n\u003C$list filter=\\\"[[$:/status/IsReadOnly]get[text]!is[blank]else[no]!match[yes]]\\\" variable=\\\"NULL\\\">\\n\u003C\u003Cadd-node-actions>>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define add-node-actions(startText:\\\"\\\",insertPosition:\\\"after\\\",streamList:\\\"\\\")\\n\u003C!-- handle saving a node edit and creating a new subsequent node -->\\n\u003C$set name=\\\"parent\\\" filter=\\\"[\u003CcurrentTiddler>match\u003Cstream-root-title>] ~[{!!parent}] +[first[]]\\\" select=\\\"0\\\">\\n\u003C$wikify name=\\\"new-node\\\" text={{$:/config/sq/streams/new-node-title}}>\\n\u003C$wikify name=\\\"new-node\\\" text={{{[[\u003C\u003Cunusedtitle \\\"\\\"\\\"]addsuffix\u003Cnew-node>addsuffix[\\\"\\\"\\\">>]]}}}>\\n\\t\u003C$action-createtiddler $basetitle=\u003C\u003Cnew-node>> text=\u003C\u003C__startText__>> $template={{$:/config/sq/streams/new-node-tiddler-template}} parent=\u003C\u003Cparent>> stream-type=\\\"default\\\" stream-list=\u003C\u003C__streamList__>>/>\\n\\t\u003C$set name=\\\"parent-nodes\\\" filter=\\\"[\u003Cparent>get[stream-list]]\\\" select=\\\"0\\\">\\n\\t\u003C$set name=\\\"next-node\\\" filter=\\\"[enlist\u003Cparent-nodes>is[tiddler]$insertPosition$\u003CcurrentTiddler>]\\\" select=\\\"0\\\">\\n\\t\u003C$action-listops $tiddler=\u003C\u003Cparent>> $field=\\\"stream-list\\\" $subfilter=\\\"+[is[tiddler]] +[insertbefore:next-node\u003Cnew-node>]\\\"/>\\n\\t\u003C$list filter=\\\"[\u003Cparent>!has[stream-type]]\\\" variable=\\\"_NULL\\\">\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003Cparent>> stream-type=\\\"default\\\"/>\\n\\t\u003C/$list>\\n\\t\u003C$list filter=\\\"[enlist\u003C__streamList__>]\\\">\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> parent=\u003C\u003Cnew-node>>/>\\n\\t\u003C/$list>\\n\\t\u003C/$set>\\n\\t\u003C/$set>\\n\\t\u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003Cnew-node>>/>\\n\u003C/$wikify>\\n\u003C/$wikify>\\n\u003C/$set>\\n\\\\end\\n\\n\\n\\\\define save-multiple-actions()\\n\u003C!-- handle multiple nodes entered at once -->\\n\u003C$action-confirm $message=\\\"Split into multiple nodes?\\\" $prompt={{$:/config/sq/streams/prompt-split-to-multiple}}>\\n\u003C$list filter=\\\"[{!!text}splitregexp{$:/config/sq/streams/node-split-regexp}rest[]reverse[]]\\\" variable=\\\"fragment\\\">\\n\\t\u003C$action-confirm $message=\\\"Split into multiple nodes?\\\" $prompt=\\\"no\\\">\\n\\t\\t\u003C$macrocall $name=\\\"add-node-actions\\\" startText=\u003C\u003Cfragment>> />\\n\\t\u003C/$action-confirm>\\n\u003C/$list>\\n\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> text={{{[{!!text}splitregexp{$:/config/sq/streams/node-split-regexp}first[]]}}}/>\\n\u003C\u003Cadd-node-actions>>\\n\u003C/$action-confirm>\\n\\\\end\\n\\n\\n\\\\define cancel-edit-node-actions()\\n\u003C!-- handle cancelling the edit on an empty node -->\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>!has[stream-list]!has[text]]\\\" variable=\\\"_NULL\\\">\\n\\t\u003C$action-listops $tiddler={{{[{!!parent}]}}} $field=\\\"stream-list\\\" $subfilter=\\\"+[is[tiddler]] -[\u003CcurrentTiddler>]\\\"/>\\n\\t\u003C$action-deletetiddler $tiddler=\u003C\u003CcurrentTiddler>> />\\n\u003C/$list>\\n\u003C!--\u003C$action-deletefield $tiddler=\u003C\u003CcurrentTiddler>> $field=\\\"throttle.refresh\\\" />-->\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Crow-edit-state>> />\\n\\\\end\\n\\n\\n\\\\define merge-with-previous-node-actions()\\n\u003C!-- handle backspace on an empty node -->\\n\u003C$list filter=\\\"\\\"\\\"[\u003CcurrentTiddler>!has[text]]\\\"\\\"\\\" variable=\\\"_NULL\\\">\\n\\t\u003C\u003Ccancel-edit-node-actions>>\\n\\t\u003C\u003Cfocus-higher-node-actions>>\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"\\\"\\\"[\u003CcurrentTiddler>has[text]]\\\"\\\"\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CselectionEnd>match[0]]\\\" variable=\\\"_NULL\\\">\\n\\n\u003C!--\u003C$action-log/>-->\\n\\t\u003C$set name=\\\"parent\\\" value={{!!parent}} select=\\\"0\\\">\\n\\t\u003C$set name=\\\"stream-list\\\" filter=\\\"[\u003Cparent>get[stream-list]]\\\" select=\\\"0\\\">\\n\\t\u003C$list filter=\\\"[enlist\u003Cstream-list>before\u003CcurrentTiddler>]\\\" variable=\\\"previous-node\\\">\\n\\t\\t\u003C$list filter=\\\"[\u003Cprevious-node>!has[stream-list]]\\\" variable=\\\"_NULL\\\">\\n\\t\\t\u003C$action-confirm $message=\\\"Merge with previous node?\\\" $prompt={{$:/config/sq/streams/prompt-merge-with-previous}}>\\n\\t\\t\\t\u003C$action-setfield $tiddler=\\\"$:/state/sq/streams/caret-position\\\" text={{{[\u003Cprevious-node>get[text]length[]]}}}/>\\n\\t\\t\\t\u003C$action-setfield $tiddler=\u003C\u003Cprevious-node>> text={{{[\u003Cprevious-node>get[text]!is[blank]else[]addsuffix{!!text}]}}} stream-list={{!!stream-list}}/>\\n\\t\\t\\t\u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003Cprevious-node>>/>\\n\\t\\t\\t\u003C$action-listops $tiddler={{!!parent}} $field=\\\"stream-list\\\" $subfilter=\\\"+[is[tiddler]] -[\u003CcurrentTiddler>]\\\"/>\\t\\t\\t\\n\\t\\t\\t\u003C$action-deletetiddler $tiddler=\u003C\u003CcurrentTiddler>>/>\\n\\t\\t\u003C/$action-confirm>\\t\\n\\t\\t\u003C/$list>\\n\\t\u003C/$list>\\n\\t\u003C/$set>\\n\\t\u003C/$set>\\n\\t\\n\u003C/$list>\\n\u003C/$list>\\n\\n\\\\end\\n\\n\\n\\\\define delete-node-actions()\\n\u003C$action-confirm $message=\\\"Do you wish to delete this tiddler?\\\">\\n\\t\u003C$transclude tiddler=\\\"$:/plugins/sq/streams/delete-hook/actions\\\"/>\\n\\t\u003C$action-deletetiddler $tiddler=\u003C\u003CcurrentTiddler>> />\\n\\t\u003C$list filter=\\\"[\u003Crow-edit-state>get[text]match\u003CcurrentTiddler>]\\\">\\n\\t\\t\u003C\u003Cfocus-higher-node-actions>>\\n\\t\u003C/$list>\\n\u003C/$action-confirm>\\n\\\\end\\n\\n\\n\\\\define rename-node-actions()\\n\u003C$action-withinput message=\\\"Rename this tiddler?\\\" default=\u003C\u003CcurrentTiddler>> actions=\\\"\\\"\\\"\\n\\t\u003C$action-sendmessage $message=\\\"tm-rename-tiddler\\\" from=\u003C\u003CcurrentTiddler>> to=\u003C\u003CuserInput>>/>\\n\\t\u003C$list filter=\\\"[\u003Crow-edit-state>match\u003CcurrentTiddler>]\\\" variable=\\\"_NULL\\\">\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003CuserInput>>/>\\n\\t\u003C/$list>\\n\\\"\\\"\\\"/>\\n\\\\end\\n\\n\\n\\\\define find-last-child()\\n\u003C!-- used by focus-higher-node-actions macro -->\\n\u003C$list filter=\\\"[enlist{!!stream-list}is[tiddler]last[]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003CcurrentTiddler>>/>\\\"\\\"\\\">\\n\\t\u003C$macrocall $name=\\\"find-last-child\\\"/>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define focus-higher-node-actions()\\n\u003C!-- handles moving up in the nodes with the keyboard -->\\n\u003C$vars old-parent={{!!parent}} >\\n\u003C$list filter=\\\"[{!!parent}get[stream-list]enlist-input[]is[tiddler]before\u003CcurrentTiddler>]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003Cold-parent>!match\u003Cstream-root-title>]\\\">\u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003Cold-parent>> />\u003C/$list>\\\"\\\"\\\">\\n\\t\u003C$macrocall $name=\\\"find-last-child\\\"/>\\n\u003C/$list>\\n\u003C/$vars>\\n\\\\end\\n\\n\\n\\\\define find-next-downwards-node()\\n\u003C!-- used by focus-lower-node-actions macro -->\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>has[parent]]\\\" variable=\\\"_NULL\\\">\\n\u003C$set name=\\\"old-parent\\\" value={{!!parent}} select=\\\"0\\\">\\n\u003C$set name=\\\"old-parent-nodes\\\" filter=\\\"[\u003Cold-parent>get[stream-list]]\\\" select=\\\"0\\\">\\n\u003C$list filter=\\\"[enlist\u003Cold-parent-nodes>is[tiddler]after\u003CcurrentTiddler>]\\\" emptyMessage=\\\"\\\"\\\"\u003C$set name=\\\"currentTiddler\\\" value=\u003C\u003Cold-parent>>>\u003C\u003Cfind-next-downwards-node>>\u003C/$set>\\\"\\\"\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003CcurrentTiddler>>/>\\t\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define focus-lower-node-actions()\\n\u003C!-- handles moving down in the nodes with the keyboard -->\\n\u003C!--if children, get the first child-->\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-list]enlist-input[]is[tiddler]first[]]\\\" variable=\\\"next-node\\\">\\n \u003C$action-setfield $tiddler=\u003C\u003Crow-edit-state>> text=\u003C\u003Cnext-node>> />\\n\u003C/$list>\\n\u003C!-- if no children-->\\n\u003C!--- get closest ancestor with next sibling -->\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>!has[stream-list]]\\\" variable=\\\"_NULL\\\">\\n\\t\u003C$set name=\\\"old-active-node\\\" value=\u003C\u003CcurrentTiddler>> >\\n\\t\\t\u003C\u003Cfind-next-downwards-node>>\\n\\t\u003C/$set>\\n\u003C/$list>\\n\\\\end\\n\\n\\n\\\\define node-drag-start-actions()\\n\u003C!-- parameter to draggable widget -->\\n\u003C$action-setfield $tiddler=\u003C\u003Cdrag-title-state>> text=\u003C\u003CcurrentTiddler>>/>\\n\u003C$action-setfield $tiddler=\\\"$:/state/sq/nodes/global-drag-state\\\" text=\\\"yes\\\"/>\\n\u003C$set name=\\\"siblings\\\" filter=\\\"[{!!parent}get[stream-list]]\\\" select=\\\"0\\\">\\n\u003C$list filter=\\\"[enlist\u003Csiblings>after\u003CcurrentTiddler>]\\\" variable=\\\"next-node\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003Cdrag-title-nextsibling-state>> text=\u003C\u003Cnext-node>> />\\n\u003C/$set>\\n\\\\end\\n\\n\\n\\\\define node-drag-end-actions()\\n\u003C!-- parameter to draggable widget -->\\n\u003C$action-deletetiddler $filter=\\\"\\\"\\\"[\u003Cdrag-title-state>][\u003Cdrag-title-nextsibling-state>][[$:/state/sq/nodes/global-drag-state]]\\\"\\\"\\\" />\\n\\\\end\\n\\n\\n\\\\define stream-drop-actions()\\n\u003C!-- handles drag and drop -->\\n\u003C$vars startBrackets=\\\"[[\\\" endBrackets=\\\"]]\\\" parent=\u003C\u003CdropTargetTiddler>> >\\n\u003C$vars actionTiddler={{{[\u003CactionTiddler>trim:suffix\u003CendBrackets>trim:prefix\u003CstartBrackets>]}}}>\\n\u003C!-- if target has no stream-type, assign one -->\\n\u003C$list filter=\\\"[\u003CdropTargetTiddler>!has[stream-type]]\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003CdropTargetTiddler>> stream-type=\\\"default\\\"/>\\n\u003C/$list>\\n\u003C!-- if action tiddler has no stream-type, assign one -->\\n\u003C$list filter=\\\"[\u003CactionTiddler>!has[stream-type]]\\\" variable=\\\"_NULL\\\">\\n\\t\u003C$action-setfield $tiddler=\u003C\u003CactionTiddler>> stream-type=\\\"default\\\" />\\n\u003C/$list>\\n\u003C!-- if we are dropping onto a new parent, then we might need to handle modifier keys -->\\n\u003C$list filter=\\\"[\u003CactionTiddler>get[parent]!match\u003Cparent>] [\u003CactionTiddler>!has[parent]]\\\" variable=\\\"_NULL\\\">\\n\\t\u003C$wikify name=\\\"new-node\\\" text={{$:/config/sq/streams/new-node-title}}>\\n\\t\\t\u003C!-- ctrl modifier key on drop event -->\\n\\t\\t\u003C!-- create a new node with text of dropped node -->\\n\\t\\t\u003C$list filter=\\\"[\u003Cmodifier>match{$:/config/sq/streams/dnd-modifier-copy-node}]\\\" variable=\\\"_NULL\\\">\\n\\t\\t\\t\u003C$action-createtiddler $basetitle=\u003C\u003Cnew-node>> text={{{ [\u003CactionTiddler>get[text]] }}} parent=\u003C\u003Cparent>> stream-type=\\\"default\\\"/>\\n\\t\\t\\t\u003C!-- insert into correct position on new parent -->\\n\\t\\t\\t\u003C$action-listops $tiddler=\u003C\u003CdropTargetTiddler>> $field=\\\"stream-list\\\" $subfilter=\\\"+[insertbefore:currentTiddler\u003Cnew-node>]\\\"/>\\n\\t\\t\u003C/$list>\\n\\t\\t\u003C!-- shift modifier key on drop event -->\\n\\t\\t\u003C$list filter=\\\"[\u003Cmodifier>match{$:/config/sq/streams/dnd-modifier-transclude-node}]\\\" variable=\\\"_NULL\\\">\\n\\t\\t\\t\u003C!-- create new node on target, in correct position, text is a transclusion-->\\n\\t\\t\\t\u003C$action-createtiddler $basetitle=\u003C\u003Cnew-node>> text={{{ [\u003CactionTiddler>addprefix[{{]addsuffix[}}]] }}} parent=\u003C\u003Cparent>> stream-type=\\\"default\\\"/>\\n\\t\\t\\t\u003C!-- insert into correct position on new parent -->\\n\\t\\t\\t\u003C$action-listops $tiddler=\u003C\u003CdropTargetTiddler>> $field=\\\"stream-list\\\" $subfilter=\\\"+[insertbefore:currentTiddler\u003Cnew-node>]\\\"/>\\n\\t\\t\u003C/$list>\\n\\t\u003C/$wikify>\\n\\t\u003C!-- no modifier key on drop event -->\\n\\t\u003C!-- insert in correct position on new parent, and remove from old parent -->\\n\\t\u003C!-- assign new parent -->\\n\\t\u003C$list filter=\\\"[\u003Cmodifier>match[normal]]\\\" variable=\\\"_NULL\\\">\\n\\t\\t\u003C$action-listops $tiddler=\u003C\u003CdropTargetTiddler>> $field=\\\"stream-list\\\" $subfilter=\\\"+[insertbefore:currentTiddler\u003CactionTiddler>]\\\"/>\\n\\t\\t\u003C$set name=\\\"original-parent\\\" filter=\\\"[\u003CactionTiddler>get[parent]]\\\" select=\\\"0\\\">\\n\\t\\t\\t\u003C$action-listops $tiddler=\u003C\u003Coriginal-parent>> $field=\\\"stream-list\\\" $subfilter=\\\"-[title\u003CactionTiddler>]\\\"/>\\n\\t\\t\u003C/$set>\\n\\t\\t\u003C$action-setfield $tiddler=\u003C\u003CactionTiddler>> parent=\u003C\u003Cparent>>/>\\n\\t\u003C/$list>\\n\u003C/$list>\\n\u003C!-- we are dropping on to the same parent, insert in the correct position -->\\n\u003C$list filter=\\\"[\u003CactionTiddler>get[parent]match\u003Cparent>]\\\" variable=\\\"_NULL\\\">\\n\\t\u003C$action-listops $tiddler=\u003C\u003CdropTargetTiddler>> $field=\\\"stream-list\\\" $subfilter=\\\"+[insertbefore:currentTiddler\u003CactionTiddler>]\\\"/>\\n\u003C/$list>\\n\u003C/$vars>\\n\u003C/$vars>\\n\\\\end\"},\"$:/plugins/sq/streams/icons/node-expand-arrow\":{\"title\":\"$:/plugins/sq/streams/icons/node-expand-arrow\",\"created\":\"20200526035137040\",\"modified\":\"20200526100520031\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\u003Csvg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\">\u003Cpath d=\\\"M13.75 9.56879C14.0833 9.76124 14.0833 10.2424 13.75 10.4348L8.5 13.4659C8.16667 13.6584 7.75 13.4178 7.75 13.0329L7.75 6.97072C7.75 6.58582 8.16667 6.34525 8.5 6.5377L13.75 9.56879Z\\\">\u003C/path>\u003C/svg>\"},\"$:/config/ShortcutInfo/streams-cancel-edit\":{\"title\":\"$:/config/ShortcutInfo/streams-cancel-edit\",\"text\":\"Cancel and exit editing\"},\"$:/config/ShortcutInfo/streams-delete\":{\"title\":\"$:/config/ShortcutInfo/streams-delete\",\"text\":\"Delete node\"},\"$:/config/ShortcutInfo/streams-demote\":{\"title\":\"$:/config/ShortcutInfo/streams-demote\",\"text\":\"Demote node\"},\"$:/config/ShortcutInfo/streams-focus-higher\":{\"title\":\"$:/config/ShortcutInfo/streams-focus-higher\",\"text\":\"Move focus to higher node\"},\"$:/config/ShortcutInfo/streams-focus-lower\":{\"title\":\"$:/config/ShortcutInfo/streams-focus-lower\",\"text\":\"Move focus to lower node\"},\"$:/config/ShortcutInfo/streams-indent\":{\"title\":\"$:/config/ShortcutInfo/streams-indent\",\"text\":\"Indent node\"},\"$:/config/ShortcutInfo/streams-merge-with-previous\":{\"title\":\"$:/config/ShortcutInfo/streams-merge-with-previous\",\"text\":\"Merge with previous node, if caret is at start of a node\"},\"$:/config/ShortcutInfo/streams-promote\":{\"title\":\"$:/config/ShortcutInfo/streams-promote\",\"text\":\"Promote node\"},\"$:/config/ShortcutInfo/streams-rename\":{\"title\":\"$:/config/ShortcutInfo/streams-rename\",\"text\":\"Rename node\"},\"$:/config/ShortcutInfo/streams-save-and-continue\":{\"title\":\"$:/config/ShortcutInfo/streams-save-and-continue\",\"text\":\"Save and create next node\"},\"$:/config/ShortcutInfo/streams-save-and-exit\":{\"title\":\"$:/config/ShortcutInfo/streams-save-and-exit\",\"text\":\"Save and exit editing\"},\"$:/config/ShortcutInfo/streams-save-multiple\":{\"title\":\"$:/config/ShortcutInfo/streams-save-multiple\",\"text\":\"Split and save as multiple nodes\"},\"$:/config/ShortcutInfo/streams-unindent\":{\"title\":\"$:/config/ShortcutInfo/streams-unindent\",\"text\":\"Unindent node\"},\"$:/config/sq/streams/dnd-modifier-copy-node\":{\"title\":\"$:/config/sq/streams/dnd-modifier-copy-node\",\"description\":\"Modifier key for drag and drop to create a copy of a node.\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/select\",\"option-names\":\"ctrl alt shift meta\",\"option-values\":\"ctrl alt shift meta\",\"caption\":\"Modifier key to copy a node when dragging.\",\"text\":\"ctrl\"},\"$:/config/sq/streams/dnd-modifier-transclude-node\":{\"title\":\"$:/config/sq/streams/dnd-modifier-transclude-node\",\"description\":\"Modifier key for drag and drop to create a transclusion of a node.\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/select\",\"option-names\":\"ctrl alt shift meta\",\"option-values\":\"ctrl alt shift meta\",\"caption\":\"Modifier key to transclude a node when dragging.\",\"text\":\"shift\"},\"$:/config/sq/streams/editor-engine\":{\"title\":\"$:/config/sq/streams/editor-engine\",\"description\":\"Editor to use for Streams\",\"caption\":\"Editor to use for Streams\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/select\",\"option-names\":\"[[Default]] [[CodeMirror]]\",\"option-values\":\"text codemirror\",\"condition\":\"[[widget]modules[]prefix[$:/plugins/tiddlywiki/codemirror/edit-codemirror.js]]\",\"text\":\"text\"},\"$:/config/sq/streams/enable-breadcrumbs\":{\"title\":\"$:/config/sq/streams/enable-breadcrumbs\",\"description\":\"Enable breadcrumbs in nodes\",\"caption\":\"Show breadcrumbs\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"text\":\"yes\"},\"$:/config/sq/streams/enable-edit-toolbar\":{\"title\":\"$:/config/sq/streams/enable-edit-toolbar\",\"description\":\"Enable toolbar in editor\",\"caption\":\"Show toolbar in editor\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"text\":\"no\"},\"$:/config/sq/streams/exit-on-saving-empty-node\":{\"title\":\"$:/config/sq/streams/exit-on-saving-empty-node\",\"description\":\"Enable to exit edit mode on saving an empty node\",\"caption\":\"Exit editing on saving an empty node\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"text\":\"no\"},\"$:/config/sq/streams/new-node-tiddler-template\":{\"title\":\"$:/config/sq/streams/new-node-tiddler-template\",\"description\":\"T iddler to use as a template for new nodes\",\"caption\":\"Tiddler to use as new node template\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input\"},\"$:/config/sq/streams/new-node-title\":{\"title\":\"$:/config/sq/streams/new-node-title\",\"description\":\"Wikitext that is wikified to generate the title for new nodes\",\"caption\":\"Template wikified for node title\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input\",\"text\":\"\u003C\u003Cstream-root-title>>/\u003C\u003Cnow \\\"[UTC]YYYY0MM0DD0hh0mm0ssXXX\\\">>\"},\"$:/config/sq/streams/node-max-width\":{\"title\":\"$:/config/sq/streams/node-max-width\",\"description\":\"Maximum displayed width of a Stream node\",\"caption\":\"Maximum node width\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input\",\"text\":\"550\"},\"$:/config/sq/streams/node-split-regexp\":{\"title\":\"$:/config/sq/streams/node-split-regexp\",\"description\":\"Regular expression that is used to split longform text into multiple tiddlers\",\"caption\":\"Regular expression used to split text\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input\",\"text\":\"\\\\n\\\\n\"},\"$:/config/sq/streams/prompt-merge-with-previous\":{\"title\":\"$:/config/sq/streams/prompt-merge-with-previous\",\"description\":\"Enable to be prompted before merging a node with the previous node\",\"caption\":\"Prompt before merging with previous\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"text\":\"yes\"},\"$:/config/sq/streams/prompt-split-to-multiple\":{\"title\":\"$:/config/sq/streams/prompt-split-to-multiple\",\"description\":\"Enable to be prompted before splitting a node to multiple nodes\",\"caption\":\"Prompt before creating multiple nodes\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"text\":\"yes\"},\"$:/config/shortcuts/streams-cancel-edit\":{\"title\":\"$:/config/shortcuts/streams-cancel-edit\",\"created\":\"20200914162547334\",\"modified\":\"20200914162547341\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"Escape\"},\"$:/config/shortcuts/streams-delete\":{\"title\":\"$:/config/shortcuts/streams-delete\",\"created\":\"20200914163552494\",\"modified\":\"20200914163552502\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"ctrl-Delete\"},\"$:/config/shortcuts/streams-demote\":{\"title\":\"$:/config/shortcuts/streams-demote\",\"created\":\"20200914163104446\",\"modified\":\"20200914163104456\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"alt-Down\"},\"$:/config/shortcuts/streams-focus-higher\":{\"title\":\"$:/config/shortcuts/streams-focus-higher\",\"created\":\"20200914163342651\",\"modified\":\"20200914163342659\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"ctrl-Up\"},\"$:/config/shortcuts/streams-focus-lower\":{\"title\":\"$:/config/shortcuts/streams-focus-lower\",\"created\":\"20200914163347755\",\"modified\":\"20200914163347764\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"ctrl-Down\"},\"$:/config/shortcuts/streams-indent\":{\"title\":\"$:/config/shortcuts/streams-indent\",\"created\":\"20200914162901728\",\"modified\":\"20200914162901735\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"Tab\"},\"$:/config/shortcuts/streams-merge-with-previous\":{\"title\":\"$:/config/shortcuts/streams-merge-with-previous\",\"created\":\"20200914164323982\",\"modified\":\"20200914164323991\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"Backspace\"},\"$:/config/shortcuts/streams-promote\":{\"title\":\"$:/config/shortcuts/streams-promote\",\"created\":\"20200914163110776\",\"modified\":\"20200914163110785\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"alt-Up\"},\"$:/config/shortcuts/streams-rename\":{\"title\":\"$:/config/shortcuts/streams-rename\",\"created\":\"20200914163600676\",\"modified\":\"20200914163600683\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"alt-R\"},\"$:/config/shortcuts/streams-save-and-continue\":{\"title\":\"$:/config/shortcuts/streams-save-and-continue\",\"created\":\"20200914164329638\",\"modified\":\"20200914164329647\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"Enter\"},\"$:/config/shortcuts/streams-save-and-exit\":{\"title\":\"$:/config/shortcuts/streams-save-and-exit\",\"created\":\"20200914163850209\",\"modified\":\"20200914163850217\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"ctrl-Enter\"},\"$:/config/shortcuts/streams-save-multiple\":{\"title\":\"$:/config/shortcuts/streams-save-multiple\",\"created\":\"20200914163843685\",\"modified\":\"20200914163843694\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"alt-Enter\"},\"$:/config/shortcuts/streams-unindent\":{\"title\":\"$:/config/shortcuts/streams-unindent\",\"created\":\"20200914162907631\",\"modified\":\"20200914162907639\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"shift-Tab\"},\"$:/config/sq/streams/split-at-caret\":{\"title\":\"$:/config/sq/streams/split-at-caret\",\"description\":\"Enable to split text at caret position on saving a node\",\"caption\":\"Split text at caret position\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"text\":\"yes\"},\"$:/config/sq/streams/stream-enable-filter\":{\"title\":\"$:/config/sq/streams/stream-enable-filter\",\"description\":\"Filter that determines which tiddlers get the add node button at the bottom\",\"caption\":\"Filter to enable Streams\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input\",\"text\":\"[!is[shadow]]\"},\"$:/config/sq/streams/swipe-behaviour\":{\"title\":\"$:/config/sq/streams/swipe-behaviour\",\"description\":\"Choose whether swipe should show a contextmenu, or be used to indent/unindent nodes.\",\"caption\":\"Swipe behaviour\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/select\",\"option-names\":\"[[Show ContextMenu]] [[Indent / Un-indent]]\",\"option-values\":\"contextmenu indent\",\"condition\":\"[[$:/config/sq/streams/swipe-behaviour-animated]!is[missing]]\",\"text\":\"contextmenu\"},\"$:/config/sq/streams/swipe-contextmenu-position\":{\"title\":\"$:/config/sq/streams/swipe-contextmenu-position\",\"description\":\"Position of context menu shown on swiping.\",\"caption\":\"Position of context menu shown on swiping.\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/select\",\"settings-group\":\"swipe\",\"option-names\":\"[[Right]] [[Left]]\",\"option-values\":\"right left\",\"condition\":\"[[$:/config/sq/streams/swipe-enabled]get[text]match[yes]]\",\"text\":\"right\"},\"$:/config/sq/streams/swipe-enabled\":{\"title\":\"$:/config/sq/streams/swipe-enabled\",\"description\":\"Enable swipe to show context menu on touch devices.\",\"caption\":\"Enable swipe to show context menu on nodes.\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"settings-group\":\"swipe\",\"settings-group-header\":\"0\",\"text\":\"yes\"},\"$:/config/sq/streams/swipe-threshold\":{\"title\":\"$:/config/sq/streams/swipe-threshold\",\"description\":\"Distance in pixels that triggers a swipe, defaults to 100\",\"caption\":\"Swipe threshold in pixels\",\"settings-template\":\"$:/plugins/sq/streams/ui/templates/settings/input\",\"settings-group\":\"swipe\",\"condition\":\"[[$:/config/sq/streams/swipe-enabled]get[text]match[yes]]\",\"text\":\"70\"},\"$:/plugins/sq/streams/contextmenu/contextmenu-styles\":{\"title\":\"$:/plugins/sq/streams/contextmenu/contextmenu-styles\",\"text\":\".sq-contextmenu {\\n\\tpadding: 12px 0;\\n\\tbox-shadow: rgba(0, 0, 0, 0.40) 0px 2px 20px;\\n\\tfont-family: \\\"Segoe UI\\\", Roboto, Helvetica, Arial;\\n\\tfont-size: 13px;\\n\\tmargin-top: 4px;\\n\\tmin-width: 100px;\\n\\tmax-width: 240px;\\n\\tleft: -16px;\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tborder-radius: 6px;\\n\\tborder: 1px solid #dce0e2;\\n\\ttransition: opacity 200ms ease 0s, transform 200ms ease 0s;\\n\\tmargin-top: 30px;\\n}\\n\\n.sq-contextmenu-alignright {\\n\\ttransform: translate3d(-100%,0,0);\\n}\\n\\n.sq-contextmenu .tc-menu-list-item {\\n\\tpadding: 0 18px;\\n\\tline-height: 24px;\\n\\twhite-space: nowrap;\\n\\tcolor: #4b5155;\\n\\tcursor: default !important;\\n\\ttext-indent: 0;\\n}\\n\\n.sq-contextmenu-itemwrapper {\\n\\tdisplay: flex;\\n\\tjustify-content: space-between;\\n\\talign-items: center;\\n\\tposition: relative;\\t\\n}\\n\\n.sq-contextmenu-itemtext {\\n\\tdisplay: flex;\\n\\twhite-space: nowrap;\\n\\ttext-overflow: ellipsis;\\n\\tflex-grow: 1;\\n\\toverflow: hidden;\\t\\n}\\n\\n.sq-contextmenu-itemicon {\\n\\tcolor: #b7bcbf;\\n\\tmargin-left: 16px;\\n\\tmin-width: 22px;\\t\\n}\\n\\n.sq-contextmenu-divider {\\n\\tborder-top-width: 1px;\\n\\tborder-top-color: #eceef0;\\n\\tborder-top-style: solid;\\n\\tmargin: 6px 0;\\n}\",\"created\":\"20200602120854810\",\"modified\":\"20200603055942655\",\"tags\":\"$:/tags/Stylesheet\",\"type\":\"text/css\"},\"$:/plugins/sq/streams/contextmenu/contextmenu-template\":{\"title\":\"$:/plugins/sq/streams/contextmenu/contextmenu-template\",\"created\":\"20200602163018613\",\"modified\":\"20200603055942658\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\define menu-item(title,subtitle:\\\"\\\",actions:\\\"\\\")\\n\\t\\t\u003C$button class=\\\"tc-menu-list-item tc-btn-invisible\\\" actions=\u003C\u003C__actions__>> >\\n\\t\\t\\t\u003Cspan class=\\\"sq-contextmenu-itemwrapper\\\">\\n\\t\\t\\t\\t\u003Cspan class=\\\"sq-contextmenu-itemtext\\\">$title$\u003C/span>\\n\\t\\t\\t\\t\u003Cspan class=\\\"sq-contextmenu-itemicon\\\">\u003C$macrocall $name=\\\"displayshortcuts\\\" $output=\\\"text/plain\\\" shortcuts=\\\"$subtitle$\\\" prefix=\\\"\\\" separator=\\\" \\\" suffix=\\\"\\\"/>\u003C/span>\\n\\t\\t\\t\u003C/span>\\n\\t\\t\u003C/$button>\\n\\\\end\\n\\n\\\\define menu-divider() \u003Cdiv class=\\\"sq-contextmenu-divider\\\"/>\\n\\n\u003C$reveal type=\\\"popup\\\" state=\u003C\u003Ccontextmenu-state>> position={{{[\u003Ccontextmenu-state>get[position]]}}} tag=\\\"div\\\">\\n\\t\u003Cdiv class={{{tc-drop-down sq-contextmenu [\u003Ccontextmenu-state>get[position]match[right]then[sq-contextmenu-alignright]else[]] +[join[ ]]}}}>\\n\\t\\t\u003C$macrocall $name=\\\"menu-item\\\" title=\\\"Open\\\" actions=\\\"\\\"\\\"\u003C$action-navigate/>\\\"\\\"\\\"/>\\n\\t\\t\u003C$macrocall $name=\\\"menu-item\\\" title=\\\"Rename\\\" subtitle=\\\"((streams-rename))\\\" actions=\u003C\u003Crename-node-actions>>/>\\n\\t\\t\u003C$macrocall $name=\\\"menu-item\\\" title=\\\"Delete\\\" subtitle=\\\"((streams-delete))\\\" actions=\u003C\u003Cdelete-node-actions>>/>\\n\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/streams/contextmenu]]\\\" variable=\\\"listItem\\\">\\n\\t\\t\\t\u003C$macrocall $name=\\\"menu-item\\\"\\n\\t\\t\\t\\ttitle={{{[\u003ClistItem>get[sq-contextmenu-name]]}}} \\n\\t\\t\\t\\tsubtitle={{{[\u003ClistItem>get[key]] [\u003ClistItem>get[sq-contextmenu-subtitle]] +[first[]]}}} \\n\\t\\t\\t\\tactions={{{[\u003ClistItem>get[text]]}}} />\\n\\t\\t\u003C/$list>\\n\\t\\t\u003C\u003Cmenu-divider>>\\n\\t\\t\u003C$macrocall $name=\\\"menu-item\\\" title=\\\"Keyboard Shortcuts (?)\\\" actions=\\\"\\\"\\\"\u003C$action-navigate $to=\\\"$:/plugins/sq/streams/info/keyboard-shortcuts\\\"/>\\\"\\\"\\\"/>\\n\\t\u003C/div>\\n\u003C/$reveal>\"},\"$:/plugins/sq/streams/codemirror-tweak\":{\"title\":\"$:/plugins/sq/streams/codemirror-tweak\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/sq/streams/codemirror-tweak\\ntype: application/javascript\\nmodule-type: startup\\n\\n\\\\*/\\n\\nexports.platforms = [\\\"browser\\\"];\\nexports.synchronous = true;\\n\\nexports.startup = function() {\\n\\n\\tif($tw.wiki.getTiddler(\\\"$:/plugins/tiddlywiki/codemirror\\\") && ($tw.wiki.getTiddlerText(\\\"$:/config/Plugins/Disabled/$:/plugins/tiddlywiki/codemirror\\\",\\\"no\\\") === \\\"no\\\")) {\\n\\t\\tvar CMEngine = require(\\\"$:/plugins/tiddlywiki/codemirror/engine.js\\\").CodeMirrorEngine;\\n\\t\\tCMEngine.prototype.focus = function() {\\n\\t\\t\\tthis.cm.focus();\\n\\t\\t\\tvar caretPosition = this.widget.getAttribute(\\\"caretPosition\\\",\\\"end\\\");\\t\\n\\t\\t\\tvar index = (caretPosition === \\\"end\\\") ? this.cm.getValue().length : parseInt(caretPosition);\\n\\t\\t\\tthis.cm.doc.setSelection(this.cm.doc.posFromIndex(index));\\n\\t\\t}\\n\\t}\\n\\n}\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/plugins/sq/streams/draggable-tweaks.js\":{\"title\":\"$:/plugins/sq/streams/draggable-tweaks.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/streams/draggable-tweaks.js\\ntype: application/javascript\\nmodule-type: widget-subclass\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.baseClass = \\\"draggable\\\";\\n\\nexports.constructor = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\nexports.prototype = {};\\n\\nexports.prototype.render = function(parent,nextSibling) {\\n\\t// Call the base class handleChangeEvent function\\n\\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,parent,nextSibling);\\n\\tvar self = this;\\n\\t$tw.utils.each(this.attributes,function(v,a) {\\n\\t\\tif(a.substring(0,10) === \\\"data-node-\\\") {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tself.domNodes[0].setAttributeNS(null,a,v);\\n\\t\\t\\t} catch(e){\\n\\t\\t\\t\\t\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget-subclass\"},\"$:/plugins/sq/streams/droppable-tweaks.js\":{\"title\":\"$:/plugins/sq/streams/droppable-tweaks.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/streams/droppable-tweaks.js\\ntype: application/javascript\\nmodule-type: widget-subclass\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.baseClass = \\\"droppable\\\";\\n\\nexports.constructor = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\nexports.prototype = {};\\n\\nexports.prototype.render = function(parent,nextSibling) {\\n\\t// Call the base class handleChangeEvent function\\n\\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,parent,nextSibling);\\n\\tvar self = this;\\n\\t$tw.utils.each(this.attributes,function(v,a) {\\n\\t\\tif(a.substring(0,10) === \\\"data-node-\\\") {\\n\\t\\t\\ttry {\\n\\t\\t\\t\\tself.domNode.setAttributeNS(null,a,v);\\n\\t\\t\\t} catch(e){\\n\\t\\t\\t\\t\\n\\t\\t\\t}\\n\\t\\t}\\n\\t});\\n};\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget-subclass\"},\"$:/plugins/sq/streams/framed-engine-tweak\":{\"title\":\"$:/plugins/sq/streams/framed-engine-tweak\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/sq/streams/framed-engine-tweak\\ntype: application/javascript\\nmodule-type: startup\\n\\n\\\\*/\\n\\nvar FramedEngine = require(\\\"$:/core/modules/editor/engines/framed.js\\\").FramedEngine;\\n\\nFramedEngine.prototype.focus = function() {\\n\\tif(this.domNode.focus && this.domNode.select) {\\n\\t\\tthis.domNode.focus();\\n\\t\\tif(this.widget.getAttribute(\\\"select\\\")===\\\"false\\\") {\\n\\t\\t\\tvar caretPosition = this.widget.getAttribute(\\\"caretPosition\\\",\\\"end\\\");\\n\\t\\t\\tcaretPosition = (caretPosition === \\\"end\\\") ? this.domNode.value.length : parseInt(caretPosition);\\n\\t\\t\\tthis.domNode.setSelectionRange(caretPosition,caretPosition);\\n\\t\\t} else {\\n\\t\\t\\tthis.domNode.select();\\n\\t\\t}\\n\\t}\\n\\t/*\\n\\tif(!this.setupDblClick) {\\n\\t\\tthis.domNode.addEventListener(\\\"dblclick\\\",this.propagateDblClick.bind(this));\\n\\t\\tthis.setupDblClick = true;\\n\\t}\\n\\t*/\\n}\\n\\n/*\\nFramedEngine.prototype.propagateDblClick = function(event) {\\n\\tif(this.widget.wiki.getTiddlerText(\\\"$:/config/sq/streams/dblclick-editor-to-exit\\\") === \\\"yes\\\") {\\n\\t\\tvar newEvent = this.widget.document.createEventObject ? this.widget.document.createEventObject() : this.widget.document.createEvent(\\\"Events\\\");\\n\\t\\tif(newEvent.initEvent) {\\n\\t\\t\\tnewEvent.initEvent(\\\"dblclick\\\", true, true);\\n\\t\\t}\\n\\t\\tnewEvent.keyCode = event.keyCode;\\n\\t\\tnewEvent.which = event.which;\\n\\t\\tnewEvent.metaKey = event.metaKey;\\n\\t\\tnewEvent.ctrlKey = event.ctrlKey;\\n\\t\\tnewEvent.altKey = event.altKey;\\n\\t\\tnewEvent.shiftKey = event.shiftKey;\\n\\t\\treturn !this.widget.parentDomNode.dispatchEvent(newEvent);\\n\\t}\\n\\treturn false;\\n}\\n*/\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/plugins/sq/streams/simple-engine-tweak\":{\"title\":\"$:/plugins/sq/streams/simple-engine-tweak\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/sq/streams/simple-engine-tweak\\ntype: application/javascript\\nmodule-type: startup\\n\\n\\\\*/\\n\\nvar SimpleEngine = require(\\\"$:/core/modules/editor/engines/simple.js\\\").SimpleEngine;\\n\\nSimpleEngine.prototype.focus = function() {\\n\\tif(this.domNode.focus && this.domNode.select) {\\n\\t\\tthis.domNode.focus();\\n\\t\\tif(this.widget.getAttribute(\\\"select\\\")===\\\"false\\\") {\\n\\t\\t\\tvar caretPosition = this.widget.getAttribute(\\\"caretPosition\\\",\\\"end\\\");\\n\\t\\t\\tcaretPosition = (caretPosition === \\\"end\\\") ? this.domNode.value.length : parseInt(caretPosition);\\n\\t\\t\\tthis.domNode.setSelectionRange(caretPosition,caretPosition);\\n\\t\\t} else {\\n\\t\\t\\tthis.domNode.select();\\n\\t\\t}\\n\\t}\\n}\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/plugins/sq/streams/delete-hook/actions\":{\"title\":\"$:/plugins/sq/streams/delete-hook/actions\",\"created\":\"20200527200401408\",\"modified\":\"20200527234136578\",\"tags\":\"$:/tags/deleteTiddlerAction\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\define delete-children()\\n\\t\u003C$list filter=\\\"[enlist{!!stream-list}]\\\">\\n\\t\\t\u003C\u003Cdelete-children>>\\n\\t\u003C/$list>\\n\\t\u003C\u003C$action-deletetiddler $filter=\\\"[enlist{!!stream-list}]\\\"/>\\n\\\\end\\n\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>has[stream-type]]\\\">\\n\\t\u003C$list filter=\\\"[\u003CcurrentTiddler>has[parent]]\\\">\\n\\t\\t\u003C$action-listops $tiddler={{!!parent}} $field=\\\"stream-list\\\" $subfilter=\\\"-[\u003CcurrentTiddler>]\\\" />\\n\\t\u003C/$list>\\n\\t\u003C$list variable=\\\"count\\\" filter=\\\"[enlist{!!stream-list}count[]!match[0]]\\\">\\n\\t\\t\u003C$action-confirm $message=\\\"Do you wish to delete all tiddlers descended from this tiddler?\\\">\\n\\t\\t\\t\u003C\u003Cdelete-children>>\\n\\t\\t\u003C/$action-confirm>\\n\\t\u003C/$list>\\n\u003C/$list>\"},\"$:/plugins/sq/streams/delete-hook/hook\":{\"title\":\"$:/plugins/sq/streams/delete-hook/hook\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/streams/delete-hook/hook\\ntype: application/javascript\\nmodule-type: startup\\n\\n\\\\*/\\n\\n$tw.hooks.addHook(\\\"th-deleting-tiddler\\\",function(tiddler) {\\n\\tif(tiddler.fields[\\\"draft.of\\\"]) {\\n\\t\\treturn;\\n\\t}\\n\\t\\n\\t$tw.rootWidget.invokeActionsByTag(\\\"$:/tags/deleteTiddlerAction\\\",null,{currentTiddler : tiddler.fields.title});\\n});\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/plugins/sq/streams/filters/get-stream-nodes.js\":{\"title\":\"$:/plugins/sq/streams/filters/get-stream-nodes.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/streams/filters/get-stream-nodes.js\\ntype: application/javascript\\nmodule-type: filteroperator\\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[\\\"get-stream-nodes\\\"] = function(source,operator,options) {\\n\\tvar results = [],\\n suffixes = (operator.suffixes || []),\\n\\t\\tmatchTitles = (suffixes[0] || []).indexOf(\\\"matchtitles\\\") !== -1;\\n\\n\\tsource(function(tiddler,title) {\\n\\t\\t\\n\\t\\tvar processNode = function(node,nodeTitle) {\\n\\t\\t\\tif(node && node.fields[\\\"stream-list\\\"] && node.fields[\\\"stream-type\\\"]) {\\n\\t\\t\\t\\tresults.push(nodeTitle);\\n\\t\\t\\t\\tvar streamList = $tw.utils.parseStringArray(node.fields[\\\"stream-list\\\"]);\\n\\t\\t\\t\\t$tw.utils.each(streamList,function(streamListNodeTitle) {\\n\\t\\t\\t\\t\\tvar streamListNode = options.wiki.getTiddler(streamListNodeTitle);\\n\\t\\t\\t\\t\\tif(streamListNode) {\\n\\t\\t\\t\\t\\t\\tprocessNode(streamListNode,streamListNodeTitle);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t});\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresults.push(nodeTitle);\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif(tiddler) {\\n\\t\\t\\tprocessNode(tiddler,title);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/plugins/sq/streams/filters/get-stream-root.js\":{\"title\":\"$:/plugins/sq/streams/filters/get-stream-root.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/streams/filters/get-stream-root.js\\ntype: application/javascript\\nmodule-type: filteroperator\\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\\n//\\t[[xyz]get-stream-root[]]\\n//\\t[[xyz]get-stream-root:matchtitles[]]\\n//\\t[[xyz]get-stream-root:includeall,matchtitles[]]\\n\\n*/\\nexports[\\\"get-stream-root\\\"] = function(source,operator,options) {\\n\\tvar results = [],\\n suffixes = (operator.suffixes || []),\\n\\t\\tincludeAll = (suffixes[0] || []).indexOf(\\\"includeall\\\") !== -1,\\n\\t\\tmatchTitles = (suffixes[0] || []).indexOf(\\\"matchtitles\\\") !== -1;\\n\\n\\tsource(function(tiddler,title) {\\n\\t\\tvar ancestors = [];\\n\\t\\tif(tiddler && tiddler.fields[\\\"parent\\\"] && tiddler.fields[\\\"stream-type\\\"]) {\\n\\t\\t\\tvar parentTiddler = tiddler;\\n\\t\\t\\twhile(parentTiddler) {\\n\\t\\t\\t\\t\\tif(tiddler.fields.title.startsWith(parentTiddler.fields[\\\"title\\\"].split(\\\"/\\\")[0]) || !matchTitles ) {\\n\\t\\t\\t\\t\\t\\tancestors.unshift(parentTiddler.fields.title);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(parentTiddler.fields.parent) {\\t\\n\\t\\t\\t\\t\\tparentTiddler = options.wiki.getTiddler(parentTiddler.fields.parent);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\tancestors.unshift(title);\\n\\t\\t}\\n\\t\\tif(!includeAll) {\\n\\t\\t\\tancestors.splice(1);\\n\\t\\t}\\n\\t\\t$tw.utils.pushTop(results,ancestors);\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"filteroperator\"},\"$:/plugins/sq/streams/info/keyboard-shortcuts\":{\"title\":\"$:/plugins/sq/streams/info/keyboard-shortcuts\",\"text\":\"!! Streams keyboard shortcuts\\n\\n\u003Ctable>\\n\u003Ctbody>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]prefix[$:/config/ShortcutInfo/streams-]]\\\">\\n\u003Ctr>\\n\u003Ctd>{{!!text}}\u003C/td>\\n\u003Ctd>\u003C$macrocall $name=\\\"displayshortcuts\\\" $output=\\\"text/plain\\\" shortcuts={{{[\u003CcurrentTiddler>removeprefix[$:/config/ShortcutInfo/]addprefix[((]addsuffix[))]]}}} prefix=\\\"\\\" separator=\\\" \\\" suffix=\\\"\\\"/>\u003C/td>\\n\u003C/tr>\\n\u003C/$list>\\n\u003C/tbody>\\n\u003C/table>\\n\\nShortcuts can be customized in the [[Control Panel|$:/core/ui/ControlPanel/KeyboardShortcuts]]\\n\\n''Drag and drop''\\n\\n* hold \u003Ckbd>control\u003C/kbd> key to drag and drop and create a copy of the node in another stream tiddler\\n* hold \u003Ckbd>shift\u003C/kbd> key to drag and drop and create a node that transcludes the contents of this node, in another stream tiddler\\n\\n''for the moment it is a design decision to disallow copying/transcluding the node inside the same root (story) tiddler''\\n\\n//Note that it is a known limitation that copying a node or transcluding it does not apply to the children of the node. This is on the [[list of things to implement|Roadmap]].//\"},\"$:/plugins/sq/streams/keyboard-shortcuts/cancel-edit-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/cancel-edit-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-cancel-edit))\",\"text\":\"\u003C\u003Ccancel-edit-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/delete-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/delete-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-delete))\",\"text\":\"\u003C\u003Cdelete-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/demote-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/demote-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-demote))\",\"text\":\"\u003C\u003Cdemote-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/focus-higher-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/focus-higher-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-focus-higher))\",\"text\":\"\u003C\u003Cfocus-higher-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/focus-lower-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/focus-lower-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-focus-lower))\",\"text\":\"\u003C\u003Cfocus-lower-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/indent-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/indent-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts $:/tags/streams/contextmenu\",\"key\":\"((streams-indent))\",\"sq-contextmenu-name\":\"Indent\",\"sq-contextmenu-subtitle\":\"\",\"text\":\"\u003C\u003Cindent-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/merge-with-previous\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/merge-with-previous\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-merge-with-previous))\",\"prevent-default\":\"no\",\"text\":\"\u003C\u003Cmerge-with-previous-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/promote-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/promote-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-promote))\",\"text\":\"\u003C\u003Cpromote-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/rename-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/rename-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-rename))\",\"text\":\"\u003C\u003Crename-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/save-and-continue\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/save-and-continue\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-save-and-continue))\",\"text\":\"\u003C\u003Csave-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/save-and-exit\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/save-and-exit\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-save-and-exit))\",\"text\":\"\u003C\u003Csave-edit-node-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/save-multiple\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/save-multiple\",\"tags\":\"$:/tags/streams/keyboard-shortcuts\",\"key\":\"((streams-save-multiple))\",\"text\":\"\u003C\u003Csave-multiple-actions>>\"},\"$:/plugins/sq/streams/keyboard-shortcuts/unindent-node\":{\"title\":\"$:/plugins/sq/streams/keyboard-shortcuts/unindent-node\",\"tags\":\"$:/tags/streams/keyboard-shortcuts $:/tags/streams/contextmenu\",\"key\":\"((streams-unindent))\",\"sq-contextmenu-name\":\"Un-indent\",\"sq-contextmenu-subtitle\":\"\",\"text\":\"\u003C\u003Cunindent-node-actions>>\"},\"$:/plugins/sq/streams/icons/new-node-btn\":{\"title\":\"$:/plugins/sq/streams/icons/new-node-btn\",\"created\":\"20200528160920973\",\"modified\":\"20200528164140128\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\u003Csvg width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\">\\n\u003Cstyle>\\n .line{\\n stroke:#868c90;\\n }\\n\u003C/style>\\n \u003Ccircle cx=\\\"10.5\\\" cy=\\\"10.5\\\" r=\\\"9\\\" class=\\\"circle\\\" fill=\\\"#fff\\\" >\u003C/circle>\\n \u003Cline x1=\\\"6\\\" y1=\\\"10.5\\\" x2=\\\"15\\\" y2=\\\"10.5\\\" class=\\\"line\\\">\u003C/line>\\n \u003Cline x1=\\\"10.5\\\" y1=\\\"6\\\" x2=\\\"10.5\\\" y2=\\\"15\\\" class=\\\"line\\\">\u003C/line>\\n\u003C/svg>\"},\"$:/plugins/sq/streams/refresh-hook.js\":{\"title\":\"$:/plugins/sq/streams/refresh-hook.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/sq/streams/refresh-hook.js\\ntype: application/javascript\\nmodule-type: startup\\n\\\\*/\\n\\n$tw.hooks.addHook(\\\"th-page-refreshed\\\",function handleEvent() {\\n\\t$tw.wiki.deleteTiddler(\\\"$:/state/sq/streams/caret-position\\\");\\n});\\n\\n\",\"type\":\"application/javascript\",\"module-type\":\"startup\"},\"$:/plugins/sq/streams/releasenotes\":{\"title\":\"$:/plugins/sq/streams/releasenotes\",\"text\":\"\u003Ch3 id=\\\"1224-2022-04-07\\\">\u003Ca href=\\\"https://github.com/saqimtiaz/streams/compare/v1.2.23...v1.2.24\\\">1.2.24\u003C/a> (2022-04-07)\u003C/h3>\\n\u003Ch3 id=\\\"bug-fixes\\\">Bug Fixes\u003C/h3>\\n\u003Cul>\\n\u003Cli>hide breadcrumbs when tiddler is folded (\u003Ca href=\\\"https://github.com/saqimtiaz/streams/commit/814bc9e604a55ec91d9d7b2600905469a2cfa10b\\\">814bc9e\u003C/a>)\u003C/li>\\n\u003C/ul>\\n\",\"type\":\"text/vnd.tiddlywiki\"},\"$:/config/flibbles/relink/fields/parent\":{\"title\":\"$:/config/flibbles/relink/fields/parent\",\"created\":\"20200530105147302\",\"modified\":\"20200530105155682\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"title\"},\"$:/config/flibbles/relink/fields/stream-list\":{\"title\":\"$:/config/flibbles/relink/fields/stream-list\",\"created\":\"20200530105147302\",\"modified\":\"20200530105155682\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"list\"},\"$:/plugins/sq/streams/styles\":{\"title\":\"$:/plugins/sq/streams/styles\",\"created\":\"20170922203553093\",\"modified\":\"20170927050808722\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\".stream-root {\\n\\tmargin-left: -2.5em;\\n}\\n\\n@media only screen and (max-width: 600px) {\\n\\t.stream-root {\\n\\t\\tmargin-left: -1em;\\n\\t}\\n}\\n\\n.stream-row {\\n display: flex;\\n flex: 0 0 auto;\\n\\tuser-select: none;\\n}\\n\\n.stream-row-children {\\n\\tdisplay:flex;\\n\\tflex: 0 0 auto;\\n\\tflex-direction: column;\\n\\t/*padding-left: 0.5em;*/\\n\\tborder-left: 1px solid \u003C\u003Ccolor message-border>>;\\n\\tmargin-left: 30px;\\n}\\n\\n.stream-row-nochildren + .stream-row-children {\\n\\tborder-left: none;\\n}\\n\\n\\n.stream-node-disabled,\\n.stream-node-disabled + div.stream-row-children{\\n\\tbackground-color: \u003C\u003Ccolor tiddler-editor-border>>;\\n}\\n\\n.stream-node-disabled + div.stream-row-children + div.stream-node-disabled,\\n.stream-node-disabled + div.stream-row-children + div.stream-node-disabled + div.stream-row-children,\\n.stream-node-disabled.stream-row-nochildren + div.stream-row-children,\\n.stream-node-disabled.stream-row-nochildren + div.stream-row-children > div.stream-node-disabled {\\n\\tbackground-color: transparent;\\n}\\n\\n/* hide last droppable in a list when the last row is disabled */\\n.stream-node-disabled + div.stream-row-children + div.stream-droppable.tc-droppable.stream-droppable-terminal{\\n\\tdisplay: none;\\n\\t/*visibility: hidden;*/\\n}\\n\\n.stream-node-disabled + div.stream-row-children + .stream-node-disabled + div.stream-row-children + div.stream-droppable.tc-droppable.stream-droppable-terminal{\\n\\tdisplay: block;\\n}\\n\\n\\n/*\\n.stream-node-disabled.stream-row-nochildren + div.stream-row-children {\\n\\tvisibility: hidden;\\n}\\n\\n.stream-node-disabled.stream-row-nochildren + div.stream-row-children + div + div {\\n\\tvisibility: visible;\\n}\\n*/\\n\\n\\n.stream-droppable.tc-droppable.tc-dragover > .tc-droppable-placeholder,\\n.stream-droppable.tc-droppable.tc-dragover > div > .tc-droppable-placeholder {\\n\\tmargin-left: 29px;\\n\\tline-height: 5px;\\n\\theight: 5px;\\n\\tborder: 2px solid \u003C\u003Ccolor dropzone-background>>;\\n\\tbackground-color: \u003C\u003Ccolor dropzone-background>>;\\n}\\n\\n/*\\n.stream-droppable-terminal.tc-drag-over .stream-droppable-spacer {\\n\\theight: 0;\\n}\\n*/\\n\\n.stream-droppable-spacer {\\n\\theight: 0.3em;\\n}\\n\\n\u003C$vars currentTiddler={{{[prefix[$:/state/sq-context-popup]]}}}>\\n[data-node-title=\\\"{{!!current}}\\\"],\\n[data-node-title=\\\"{{!!current}}\\\"] + div{\\n\\tbackground: \u003C\u003Ccolor notification-background>>;\\n\\tcolor: \u003C\u003Ccolor message-foreground>>;\\n}\\n\u003C/$vars>\\n\\n.stream-node-control {\\n\\tdisplay: flex;\\n flex: 0 0 45px;\\n padding-top: 4px;\\n padding-left: 4px;\\n}\\n\\n.stream-node-control .stream-node-collapser,\\n.stream-node-control .stream-node-handle {\\n display: flex;\\n height: 13px;\\n width: 13px;\\n margin-top: 4px;\\n border-radius: 50%;\\n justify-content: center;\\n align-items: center;\\n}\\n\\n.stream-node-control.stream-node-control-addnew .stream-node-handle {\\n\\twidth: 20px;\\n\\theight: 20px;\\n\\tmargin-top: 0;\\n}\\n\\n.stream-node-control.stream-node-control-addnew .stream-node-collapser {\\n\\twidth: 16px;\\n}\\n\\n.stream-node-control.stream-node-control-addnew div.tc-btn-invisible svg {\\n\\topacity: 0.8;\\n}\\n\\n\\n.stream-node-control.stream-node-control-addnew div.tc-btn-invisible svg circle {\\n\\tfill: \u003C\u003Ccolor tiddler-controls-foreground>>;\\n\\topacity: 0.6;\\n}\\n\\n.stream-node-control.stream-node-control-addnew div.tc-btn-invisible svg line.line {\\n\\tstroke: \u003C\u003Ccolor foreground>>;\\n\\topacity: 1;\\n}\\n\\n.stream-node-control.stream-node-control-addnew div.tc-btn-invisible:hover svg circle {\\n\\tfill: \u003C\u003Ccolor tiddler-controls-foreground-hover>>;\\n}\\n\\n.stream-node-control .stream-node-collapser {\\n\\theight: 13px;\\n\\twidth: 20px;\\n\\topacity:0;\\n}\\n\\n.stream-row-nochildren .stream-node-collapser {\\n\\tvisibility: hidden;\\n}\\n\\n.stream-row:hover .stream-node-collapser,\\n.stream-row-children-collapsed.stream-row:hover .stream-node-collapser {\\n\\topacity: 0.4;\\n}\\n\\n.stream-row:hover .stream-node-collapser:hover,\\n.stream-row-children-collapsed.stream-row:hover .stream-node-collapser:hover {\\n\\topacity: 0.9;\\n}\\n\\n.stream-row-children-collapsed .stream-node-control .stream-node-collapser {\\n\\topacity: 0.4;\\n}\\n\\n.stream-node-collapser.tc-btn-invisible,\\n.stream-node-collapser.tc-btn-invisible:focus {\\n\\toutline: none;\\n}\\n\\n.stream-node-collapser svg {\\n\\ttransform: rotateZ(90deg);\\n\\ttransition: transform 200ms ease-in-out 0s;\\n}\\n\\n.stream-row-children-collapsed .stream-node-collapser svg {\\n\\ttransform: rotateZ(0deg);\\n}\\n\\n/*\\n.stream-node-control .stream-node-handle-wrapper .stream-node-handle {\\n\\twidth: 13px;\\n\\theight: 13px;\\n\\tdisplay: flex;\\n\\talign-items : center;\\n\\tjustify-content: center;\\n}\\n*/\\n\\n.stream-node-control .stream-node-handle .stream-node-handle-inner {\\n border-radius: 50%;\\n width: 6px;\\n height: 6px;\\n background-color: \u003C\u003Ccolor foreground>>;\\n\\topacity: 0.3;\\n}\\n\\n.stream-node-control .sq-contextmenu-container {\\n\\tdisplay: flex;\\n}\\n\\n/*\\n.stream-row:hover .stream-node-control .stream-node-handle-wrapper .stream-node-handle-inner {\\n\\topacity: 0.7;\\n}\\n*/\\n\\n.stream-row:hover .stream-node-control .stream-node-handle:hover .stream-node-handle-inner {\\n\\topacity: 1;\\n} \\n\\n\u003C$vars currentTiddler={{{[prefix[$:/state/sq-context-popup]]}}}>\\n[data-node-title=\\\"{{!!current}}\\\"] .stream-node-handle .stream-node-handle-inner {\\n border: 5px solid #5778d8;\\n opacity: 1;\\n}\\n\u003C/$vars>\\n\\n\\n.stream-node-block {\\n overflow-wrap: break-word;\\n\\tmax-width: {{$:/config/sq/streams/node-max-width}}px;\\n min-height: calc(1.5em + 8px);\\n box-sizing: border-box;\\n margin-top: -1px;\\n min-width: 100px;\\n width: 100%;\\n line-height: 1.5em;\\n cursor: text;\\n padding-top: 4px;\\n padding-bottom: 4px;\\n\\tuser-select: text;\\n\\t/*white-space: pre-wrap;*/\\n}\\n\\n.stream-node-block textarea {\\n\\twidth: 100%;\\n\\toutline-color: \u003C\u003Ccolor tiddler-editor-border>>;\\n\\tborder: 1px solid \u003C\u003Ccolor tiddler-editor-border>>;\\n\\n\\tresize: none;\\n}\\n\\n.stream-node-block textarea.streams-editor {\\n\\tline-height:1.5em;\\n\\tmargin-bottom: 0.6em;\\n}\\n\\n.stream-node-block > h1:first-child,\\n.stream-node-block > h2:first-child,\\n.stream-node-block > h3:first-child,\\n.stream-node-block > h4:first-child,\\n.stream-node-block > h5:first-child,\\n.stream-node-block > h6:first-child,\\n.stream-node-block p:first-child {\\n\\tmargin-top:0;\\n}\\n\\n.stream-node-block > h1:last-child,\\n.stream-node-block > h2:last-child,\\n.stream-node-block > h3:last-child,\\n.stream-node-block > h4:last-child,\\n.stream-node-block > h5:last-child,\\n.stream-node-block > h6:last-child,\\n.stream-node-block p:last-child {\\n\\tmargin-bottom:0;\\n}\\n\\nspan.sq-breadcrumbs-fragment {\\n white-space: nowrap;\\n overflow: hidden;\\n display: inline-block;\\n text-overflow: ellipsis;\\n max-width: calc({{$:/config/sq/streams/node-max-width}}px - 50px);\\n}\\n\\nspan.sq-breadcrumbs-fragment a.tc-tiddlylink {\\n\\tcolor: \u003C\u003Ccolor foreground>>;\\n}\\n\\n/*** framed engine styles ***/\\n\\n.tc-tiddler-frame .stream-node-block input.tc-edit-texteditor,\\n.tc-tiddler-frame .stream-node-block textarea.tc-edit-texteditor,\\n.tc-tiddler-frame .stream-node-block iframe.tc-edit-texteditor {\\n\\tbackground: \u003C\u003Ccolor background>> !important;\\n\\tmargin-top:0;\\n\\tmargin-bottom: -1.6em;\\n}\\n\\n\u003C$reveal state=\\\"$:/config/sq/streams/enable-edit-toolbar\\\" type=\\\"nomatch\\\" text=\\\"yes\\\">\\n.stream-node-block .tc-editor-toolbar {\\n\\tdisplay: none;\\n}\\n\u003C/$reveal>\\n\\n\u003C$reveal state=\\\"$:/state/sq/streams/global-drag-state\\\" type=\\\"match\\\" text=\\\"yes\\\">\\n\\n/** active drag css **/\\n\\n\u003C/$reveal>\\n\\n\u003C$reveal state=\\\"$:/state/sq/streams/global-drag-state\\\" type=\\\"nomatch\\\" text=\\\"yes\\\">\\n\\n/**no active drag css **/\\n\\n\u003C/$reveal>\"},\"$:/plugins/sq/streams/breadcrumbs-view-template\":{\"title\":\"$:/plugins/sq/streams/breadcrumbs-view-template\",\"created\":\"20200529205858594\",\"list-before\":\"$:/core/ui/ViewTemplate/body\",\"modified\":\"20200530055142652\",\"tags\":\"$:/tags/ViewTemplate\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\whitespace trim\\n\\\\define stream-show-breadcrumbs()\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>has[stream-type]]\\\">\\n\\t\u003C$list filter=\\\"[\u003CcurrentTiddler>has[parent]]\\\">\\n\\t\\t\u003C$set name=\\\"currentTiddler\\\" filter=\\\"[{!!parent}]\\\" select=\\\"0\\\">\\n\\t\\t\\t\u003C\u003Cstream-show-breadcrumbs>>\\n\\t\\t\u003C/$set>\\n\\t\u003C/$list>\\t\\n\\t\u003C$list filter=\\\"[\u003CcurrentTiddler>!match\u003CstoryTiddler>]\\\">\\n\\t\\t\u003C$wikify name=\\\"display-title\\\" text={{{ [\u003CcurrentTiddler>!is[binary]get[text]!is[blank]] ~[{!!title}] }}}>\\n\\t\\t\\t\u003Cspan class=\\\"sq-breadcrumbs-fragment\\\">\\n\\t\\t\\t\u003C$link to=\u003C\u003CcurrentTiddler>>>\\n\\t\\t\\t\\t\u003C$text text={{{ [\u003Cdisplay-title>split[]first[50]join[]] }}}/>\\n\\t\\t\\t\u003C/$link>>\\n\\t\\t\\t\u003C/span>\\n\\t\\t\u003C/$wikify>\\n\\t\u003C/$list>\\n\u003C/$list>\\n\\\\end\\n\u003C$list filter=\\\"\\\"\\\"[\u003Cfolded-state>get[text]!is[blank]else[show]!match[hide]]\\\"\\\"\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[{$:/config/sq/streams/enable-breadcrumbs}match[yes]]\\\" variable=\\\"_NULL\\\">\\n\u003C\u003Cstream-show-breadcrumbs>>\\n\u003C/$list>\\n\u003C/$list>\\n\\n\"},\"$:/plugins/sq/streams/editor-template\":{\"title\":\"$:/plugins/sq/streams/editor-template\",\"created\":\"20200601145424630\",\"modified\":\"20200602053704598\",\"tags\":\"\",\"type\":\"text/vnd.tiddlywiki\",\"text\":\"\\\\define config-visibility-title()\\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\\n\\\\end\\n\u003C$streams-edit tag=\\\"textarea\\\" autoHeight=\\\"yes\\\" minHeight=\\\"1em\\\" focus=\\\"yes\\\" select=\\\"false\\\" class=\\\"streams-editor tc-edit-texteditor tc-edit-texteditor-body\\\" caretPosition={{{[{$:/state/sq/streams/caret-position}!is[blank]else[end]]}}}>\u003C$set name=\\\"targetTiddler\\\"value=\u003C\u003CcurrentTiddler>>>\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\\\">\u003C$reveal type=\\\"nomatch\\\" state=\u003C\u003Cconfig-visibility-title>> text=\\\"hide\\\" class=\\\"tc-text-editor-toolbar-item-wrapper\\\">\u003C$transclude tiddler=\\\"$:/core/ui/EditTemplate/body/toolbar/button\\\"\\nmode=\\\"inline\\\"/>\u003C/$reveal>\u003C/$list>\u003C/$set>\u003C/$streams-edit>\"},\"$:/plugins/sq/streams/nodes-list-template\":{\"title\":\"$:/plugins/sq/streams/nodes-list-template\",\"created\":\"20171022203553093\",\"modified\":\"20171122050808722\",\"text\":\"\\\\import [[$:/plugins/sq/streams/action-macros]] [all[shadows+tiddlers]tag[$:/tags/streams/actionmacros]] [all[shadows+tiddlers]tag[$:/tags/streams/user-actionmacros]]\\n\\\\whitespace trim\\n\\n\u003C$vars stream-root-title=\u003C\u003CcurrentTiddler>>\\n\\tcontextmenu-state=\u003C\u003Cqualify \\\"$:/state/sq-context-popup\\\">>\\n\\trow-edit-state=\u003C\u003Cqualify \\\"$:/state/sq/streams/current-edit-tiddler\\\">>\\n\\tdrag-title-state=\u003C\u003Cqualify \\\"$:/state/sq/streams/current-drag-title\\\">>\\n\\tdrag-title-nextsibling-state=\u003C\u003Cqualify \\\"$:/state/sq/streams/current-drag-nextsibling\\\">> \\n>\\n\\t\u003C$eventcatcher\\n\\t\\tevents=\\\"click\\\"\\n\\t\\tselector=\\\".stream-node-ctrl-btn\\\"\\n\\t\\tactions-click=\u003C\u003Cnode-ctrl-btn-actions>>\\n\\t\\ttag=\\\"div\\\"\\n\\t>\\n\\t\u003C$eventcatcher\\n\\t\\tevents=\\\"dblclick swiped-right swiped-left\\\"\\n\\t\\ttag=\\\"div\\\"\\n\\t\\tselector=\\\".stream-row\\\"\\n\\t\\tactions-dblclick=\u003C\u003Ctoggle-row-edit-state>>\\n\\t\\tactions-swiped-right=\u003C\u003Cswiped-right-actions>>\\n\\t\\tactions-swiped-left=\u003C\u003Cswiped-left-actions>>\\n\\t>\\n\\t\u003C$eventcatcher\\n\\t\\ttag=\\\"div\\\"\\n\\t\\tevents=\\\"contextmenu\\\"\\n\\t\\tselector=\\\".sq-contextmenu-container\\\"\\n\\t\\tactions-contextmenu=\u003C\u003Concontext-menu-actions>>\\n\\t>\\n\\t\u003C$swiper\\n\\t\\ttag=\\\"div\\\"\\n\\t\\tenable={{$:/config/sq/streams/swipe-enabled}}\\n\\t\\tswipethreshold={{$:/config/sq/streams/swipe-threshold}}\\n\\t>\\n\\t\u003Cdiv class={{{ stream-root [{$:/state/sq/nodes/global-drag-state}match[yes]then[stream-dragactive]] [\u003CcurrentTiddler>!has[stream-list]then[stream-newlist]] +[join[ ]] }}}>\\n\\t\\t{{||$:/plugins/sq/streams/templates/stream-root-template}}\\n\\t\\t\u003C$list filter=\\\"[all[current]match\u003Cstream-root-title>]\\\" variable=\\\"_NULL\\\">\\n\\t\\t\\t\u003C!-- if we are the root, add a button to add more nodes-->\\n\\t\\t\\t\u003Cdiv class=\\\"stream-row\\\">\\n\\t\\t\\t\\t\u003Cdiv class=\\\"stream-node-control stream-node-control-addnew\\\">\\n\\t\\t\\t\\t\\t\u003Cdiv class=\\\"stream-node-collapser\\\">\\n\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\\t\u003Cdiv class=\\\"stream-node-handle\\\">\\n\\t\\t\\t\\t\\t\\t\u003C$button tag=\\\"div\\\" class=\\\"tc-btn-invisible\\\" tooltip=\\\"add node\\\" actions=\u003C\u003Cadd-new-node-actions>> >\\n\\t\\t\\t\\t\\t\\t\\t{{$:/plugins/sq/streams/icons/new-node-btn}}\\n\\t\\t\\t\\t\\t\\t\u003C/$button>\\n\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\\t\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/streams/root-buttons]]\\\" variable=\\\"btnTiddler\\\">\\n\\t\\t\\t\\t\\t\\t\u003Cdiv class=\\\"stream-node-handle\\\">\\n\\t\\t\\t\\t\\t\\t\\t\u003C$transclude tiddler=\u003C\u003CbtnTiddler>>/>\\n\\t\\t\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\\t\u003C/$list>\\n\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\\t\u003Cdiv class=\\\"stream-node-block\\\">\\n\\t\\t\\t\\t\\t\u003C!--consider moving last child dropzone in here, though thats for children too-->\\n\\t\\t\\t\\t\u003C/div>\\n\\t\\t\\t\u003C/div>\\t\\t\\t\\t\\n\\t\\t\\t\u003C$set name=\\\"currentTiddler\\\" filter={{{[\u003Ccontextmenu-state>get[current]]}}}>\\n\\t\\t\\t\\t{{||$:/plugins/sq/streams/contextmenu/contextmenu-template}}\\n\\t\\t\\t\u003C/$set>\\n\\t\\t\u003C/$list>\\t\\n\\t\u003C/div>\\n\\t\u003C/$swiper>\\n\\t\u003C/$eventcatcher>\\n\\t\u003C/$eventcatcher>\\n\\t\u003C/$eventcatcher>\\n\u003C/$vars>\\n\"},\"$:/plugins/sq/streams/templates/stream-root-template\":{\"title\":\"$:/plugins/sq/streams/templates/stream-root-template\",\"text\":\"\\\\whitespace trim\\n\u003C$vars dropTargetTiddler=\u003C\u003CcurrentTiddler>> >\\n\\t\u003C$list filter=\\\"[list[!!stream-list]!is[missing]]\\\">\\n\\t\\t\u003C$set name=\\\"enable-dnd\\\" filter=\\\"[\u003Cenable-dnd>match[no]] ~[\u003Cdrag-title-state>get[text]match\u003CcurrentTiddler>then[no]]\\\" select=\\\"0\\\">\\n\\t\\t\\t{{||$:/plugins/sq/streams/templates/stream-row-template}}\\n\\t\\t\u003C/$set>\\n\\t\u003C/$list>\\n\\t\u003C$tiddler tiddler=\\\"\\\">\\n\\t\\t\u003C!-- to drop after the last child of any list level-->\\n\\t\\t\u003C$droppable\\n\\t\\t\\tactions=\u003C\u003Cstream-drop-actions>>\\n\\t\\t\\ttag=\\\"div\\\"\\n\\t\\t\\tenable=\u003C\u003Cenable-dnd>>\\n\\t\\t\\tclass=\\\"stream-droppable stream-droppable-terminal\\\"\\n\\t\\t\\tdisabledClass=\\\"stream-node-disabled\\\"\\n\\t\\t>\\n\\t\\t\\t\u003Cdiv class=\\\"tc-droppable-placeholder\\\">\\n\\t\\t\\t \\n\\t\\t\\t\u003C/div>\u003C!-- idea only want below div with height when its a child with no more children-->\\n\\t\\t\\t\u003C$list filter=\\\"[\u003CcurrentTiddler>!has[stream-list]]\\\" variable=\\\"_NULL\\\">\u003Cdiv class=\\\"stream-droppable-spacer\\\"/>\u003C/$list>\\n\\t\\t\u003C/$droppable>\\n\\t\u003C/$tiddler>\\n\u003C/$vars>\"},\"$:/plugins/sq/streams/templates/stream-row-body\":{\"title\":\"$:/plugins/sq/streams/templates/stream-row-body\",\"text\":\"\u003C$transclude mode=\\\"block\\\"/>\"},\"$:/plugins/sq/streams/templates/stream-row-template\":{\"title\":\"$:/plugins/sq/streams/templates/stream-row-template\",\"text\":\"\\\\whitespace trim\\n\u003C$qualify\\n\\tname=\\\"row-children-visibility-state\\\"\\n\\ttitle={{{ [[$:/state/sq/streams/visibility/]addsuffix\u003CcurrentTiddler>] }}}\\n>\\n\u003C$droppable \\n\\tactions=\u003C\u003Cstream-drop-actions>>\\n\\ttag=\\\"div\\\"\\n\\tclass={{{ stream-droppable [list[!!stream-list]is[tiddler]then[]else[stream-row-nochildren]] +[join[ ]]}}}\\n\\tenable={{{[\u003Cdrag-title-nextsibling-state>get[text]match\u003CcurrentTiddler>then[no]] ~[\u003Cenable-dnd>]}}}\\n\\tdisabledClass=\\\"stream-node-disabled\\\"\\n\\tdata-node-title=\u003C\u003CcurrentTiddler>>\\n>\\n\\t\u003Cdiv class=\\\"tc-droppable-placeholder\\\"/>\\n\\t\u003Cdiv class={{{ stream-row [\u003Crow-children-visibility-state>get[text]match[hide]then[stream-row-children-collapsed]] +[join[ ]]}}}\\n\\t\\tdata-node-title=\u003C\u003CcurrentTiddler>>\\n\\t\\tdata-node-tags={{!!tags}}\\n\\t>\\n\\t\\t\u003C$draggable\\n\\t\\t\\ttag=\\\"div\\\"\\n\\t\\t\\ttiddler=\u003C\u003CcurrentTiddler>>\\n\\t\\t\\tstartactions=\u003C\u003Cnode-drag-start-actions>>\\n\\t\\t\\tendactions=\u003C\u003Cnode-drag-end-actions>>\\n\\t\\t\\tclass=\\\"stream-node-control sq-contextmenu-container\\\"\\n\\t\\t\\tdata-node-title=\u003C\u003CcurrentTiddler>>\\n\\t\\t>\\n\\t\\t\\t\u003Cbutton type=\\\"button\\\" class=\\\"tc-btn-invisible stream-node-ctrl-btn stream-node-collapser\\\" data-btn-role=\\\"stream-node-visibility\\\" data-rowchildren-visibility-state=\u003C\u003Crow-children-visibility-state>>>\\n\\t\\t\\t\\t{{$:/plugins/sq/streams/icons/node-expand-arrow}}\\n\\t\\t\\t\u003C/button>\\n\\t\\t\\t\u003Cdiv class=\\\"stream-node-handle tc-btn-invisible stream-node-ctrl-btn\\\" data-btn-role=\\\"stream-node-decorator\\\" data-node-title=\u003C\u003CcurrentTiddler>>>\\n\\t\\t\\t\\t\\t\u003Cdiv class=\\\"stream-node-handle-inner\\\"/>\\n\\t\\t\\t\u003C/div>\\n\\t\\t\u003C/$draggable>\\n\\t\\t\u003Cdiv class=\\\"stream-node-block\\\">\\n\\t\\t\\t\u003C$list filter=\\\"[\u003Crow-edit-state>get[text]!is[blank]else[]match\u003CcurrentTiddler>]\\\" variable=\\\"NULL\\\" emptyMessage=\\\"\\\"\\\"{{||$:/plugins/sq/streams/templates/stream-row-body}}\\\"\\\"\\\">\\n\\t\\t\\t\\t\u003C$keyboard-plus shortcutTag=\\\"$:/tags/streams/keyboard-shortcuts\\\">\\n\\t\\t\\t\\t\\t{{||$:/plugins/sq/streams/editor-template}}\\n\\t\\t\\t\\t\u003C/$keyboard-plus>\\t\\t\\t\\n\\t\\t\\t\u003C/$list>\\n\\t\\t\u003C/div>\\n\\t\u003C/div>\\n\u003C/$droppable>\\n\u003C$reveal\\n\\ttag=\\\"div\\\"\\n\\ttype=\\\"nomatch\\\"\\n\\tstateTitle=\u003C\u003Crow-children-visibility-state>>\\n\\ttext=\\\"hide\\\"\\n\\tclass=\\\"stream-row-children\\\"\\n>\\n\\t\\t{{||$:/plugins/sq/streams/templates/stream-root-template}}\\n\u003C/$reveal>\\n\u003C/$qualify>\"},\"$:/plugins/sq/streams/stream-view-template\":{\"title\":\"$:/plugins/sq/streams/stream-view-template\",\"created\":\"20170922203553093\",\"modified\":\"20170929050808722\",\"tags\":\"[[$:/tags/ViewTemplate]]\",\"list-after\":\"$:/core/ui/ViewTemplate/body\",\"text\":\"\u003C$list filter=\\\"\\\"\\\"[\u003Cfolded-state>get[text]!is[blank]else[show]!match[hide]]\\\"\\\"\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"\\\"\\\"[all[current]subfilter{$:/config/sq/streams/stream-enable-filter}]\\\"\\\"\\\">\\n{{||$:/plugins/sq/streams/nodes-list-template}}\\n\u003C/$list>\\n\u003C/$list>\"},\"$:/plugins/sq/streams/sq-ui-styles\":{\"title\":\"$:/plugins/sq/streams/sq-ui-styles\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"/** checkbox switches start **/\\n/** https://www.w3schools.com/howto/howto_css_switch.asp **/\\n/* The switch - the box around the slider */\\nlabel.squi-form-switch {\\n\\tposition: relative;\\n\\tdisplay: inline-block;\\n\\twidth: 36px;\\n\\theight: 12px;\\n}\\n\\n/* Hide default HTML checkbox */\\nlabel.squi-form-switch input {\\n\\topacity: 0;\\n\\twidth: 0;\\n\\theight: 0;\\n}\\n\\n/* The slider */\\nlabel.squi-form-switch span {\\n\\tposition: absolute;\\n\\tcursor: pointer;\\n\\ttop: 0;\\n\\tleft: 0;\\n\\tright: 0;\\n\\tbottom: 0;\\n\\tbackground-color: \u003C\u003Ccolor tiddler-controls-foreground>>;\\n\\t-webkit-transition: .2s;\\n\\ttransition: .2s;\\n}\\n\\nlabel.squi-form-switch span:before {\\n\\tposition: absolute;\\n\\tcontent: \\\"\\\";\\n\\theight: 20px;\\n\\twidth: 20px;\\n\\tleft: -1px;\\n\\ttop: -4px;\\n\\tbottom: 4px;\\n\\tbackground-color: \u003C\u003Ccolor background>>;\\n\\t-webkit-transition: .2s;\\n\\ttransition: .2s;\\n\\tbox-shadow: 0 1px 3px 0 rgba(0,0,0,0.7);\\n}\\n\\nlabel.squi-form-switch input:checked + span {\\n\\tbackground-color: rgba(26,115,232,0.5);\\n}\\n\\nlabel.squi-form-switch input:checked + span:before {\\n\\tbackground-color: rgb(26,115,232);\\n\\topacity: 1;\\n}\\n\\nlabel.squi-form-switch input:focus + span {\\n\\tbox-shadow: 0 0 1px #2196F3;\\n}\\n\\nlabel.squi-form-switch input:checked + span:before {\\n\\t-webkit-transform: translateX(17px);\\n\\t-ms-transform: translateX(17px);\\n\\ttransform: translateX(17px);\\n}\\n\\nlabel.squi-form-switch span {\\n\\tborder-radius: 12px;\\n}\\n\\nlabel.squi-form-switch span:before {\\n\\tborder-radius: 50%;\\n}\\n\\ndiv.squi-form-label {\\n\\t\\n}\\n\\n/*** checkbox switches end ***/\\n\\n/** form select elements **/\\n.squi-form-select {\\n\\tappearance: none;\\n\\tbackground: url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='12' fill='%235F6368'%3E%3Cpath d='M0 0h24L12 12z'/%3E%3C/svg%3E\\\") calc(100% - 8px) center no-repeat;\\n\\tbackground-color: rgb(241,243,244);\\n\\tbackground-size: 10px;\\n\\tborder: none;\\n\\tborder-radius: 4px;\\n\\tcolor: rgb(32,33,36);\\n\\tcursor: pointer;\\n\\tmax-width: 100%;\\n\\toutline: none;\\n\\tpadding: 6px 21px 6px 8px;\\n/*\\twidth: 200px;*/\\n}\\n\\ninput.squi-form-input {\\n\\tborder: 1px solid \u003C\u003Ccolor tiddler-controls-foreground>>;\\n\\tborder-radius: 3px;\\n\\tbackground-color: rgb(241,243,244);\\n\\tpadding: 6px;\\n}\\n\\ninput.squi-form-input:focus {\\n\\toutline-color: #ccc;\\n}\\n\\n\\n.sq-list-group {\\n\\tdisplay: flex;\\n\\tflex-direction: column;\\n\\tpadding-left: 0;\\n\\tmargin-bottom: 0;\\n\\tbox-sizing: border-box;\\n}\\n\\n.sq-list-group-box-shadow {\\n\\tbox-shadow:1px 1px 5px rgba(0, 0, 0, 0.3);\\t\\n\\tborder-bottom-left-radius: .25rem;\\n\\tborder-bottom-right-radius: .25rem;\\n\\tborder-top-left-radius: .25rem;\\n\\tborder-top-right-radius: .25rem;\\t\\t\\n}\\n\\t\\n.sq-list-group-item\\t{\\n\\tposition: relative;\\n\\tdisplay: block;\\n\\tpadding: 0.75rem 1.25rem;\\n\\tbackground-color: \u003C\u003Ccolor background>>;\\n\\tborder: 1px solid rgba(0,0,0,.125);\\n\\twidth: 100%;\\n\\tcolor: #495057;\\n\\ttext-align:\\tinherit;\\t\\n\\tdisplay: flex;\\n\\tflex-direction: row;\\n\\tjustify-content: space-between!important;\\n\\talign-items: center!important;\\n\\tword-spacing: 0.1em;\\n}\\n\\n\\n.sq-list-group-item+.sq-list-group-item {\\n\\tborder-top-width: 0;\\n}\\n\\n.sq-list-group-item:first-child {\\n\\tborder-top-left-radius: .25rem;\\n\\tborder-top-right-radius: .25rem;\\n}\\n\\n.sq-list-group-item:last-child {\\n\\tborder-bottom-left-radius: .25rem;\\n\\tborder-bottom-right-radius: .25rem;\\n}\\n\\n.sq-list-stream-settings {\\n\\tfont-size: 90%;\\n}\\n\\ninput.sq-search-input {\\n display: block;\\n width: 100%;\\n height: calc(1.5em + .75rem + 2px);\\n padding: .375rem .75rem;\\n font-size: 0.8rem;\\n font-weight: 400;\\n line-height: 1.5;\\n color: #495057;\\n background-color: \u003C\u003Ccolor background>>;\\n background-clip: padding-box;\\n border: 1px solid #ced4da;\\n border-radius: .25rem;\\n transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;\\n margin-bottom: 0.75em;\\n}\\n\\ninput.sq-search-input:focus {\\ncolor: #495057;\\n background-color: \u003C\u003Ccolor background>>;\\n border-color: #80bdff;\\n outline: 0;\\n box-shadow: 0 0 0 0.2rem rgba(0,123,255,.25);\\n}\\n\"},\"$:/plugins/sq/streams/ui/templates/settings/input-switch\":{\"title\":\"$:/plugins/sq/streams/ui/templates/settings/input-switch\",\"text\":\"\u003Clabel class=\\\"squi-form-label\\\">\u003C$link tooltip={{!!description}}>{{!!caption}}\u003C/$link>\u003C/label>\u003C$checkbox field=\\\"text\\\" checked=\\\"yes\\\" unchecked=\\\"no\\\" class=\\\"squi-form-switch\\\"/>\"},\"$:/plugins/sq/streams/ui/templates/settings/input\":{\"title\":\"$:/plugins/sq/streams/ui/templates/settings/input\",\"text\":\"\u003Clabel class=\\\"squi-form-label\\\">\u003C$link tooltip={{!!description}}>{{!!caption}}\u003C/$link>\u003C/label>\\n\u003C$edit-text tag=\\\"input\\\" class=\\\"squi-form-input\\\"/>\"},\"$:/plugins/sq/streams/ui/templates/settings/select\":{\"title\":\"$:/plugins/sq/streams/ui/templates/settings/select\",\"text\":\"\u003Clabel class=\\\"squi-form-label\\\">\u003C$link tooltip={{!!description}}>{{!!caption}}\u003C/$link>\u003C/label>\\n\u003C$vars cnt={{{[enlist{!!option-names}count[]]}}}>\\n\u003C$select class=\\\"squi-form-select\\\">\\n\u003C$list filter=\\\"[range\u003Ccnt>]\\\" variable=\\\"index\\\">\\n\u003Coption value={{{[enlist{!!option-values}nth\u003Cindex>]}}}>\u003C$text text={{{[enlist{!!option-names}nth\u003Cindex>]}}}/>\u003C/option>\\n\u003C/$list>\\n\u003C/$select>\\n\u003C/$vars>\"},\"$:/plugins/sq/lib/swipeevents.js\":{\"title\":\"$:/plugins/sq/lib/swipeevents.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/lib/swipeevents.js\\ntype: application/javascript\\nmodule-type: library\\nBased on https://github.com/john-doherty/swiped-events\\nhttps://github.com/umanghome/swipe-listener\\nhttps://github.com/scriptex/touchsweep/blob/master/src/touchsweep.js\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\nexports.platforms = [\\\"browser\\\"];\\n\\nfunction SwipeEventsFactory(element,options) {\\n\\n\\tif(typeof window.CustomEvent !== 'function') {\\n\\t\\t\\n\\t\\twindow.CustomEvent = function (event, params) {\\n\\t\\t\\tparams = params || { bubbles: false, cancelable: false, detail: undefined };\\n\\t\\t\\tvar evt = document.createEvent('CustomEvent');\\n\\t\\t\\tevt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\\n\\t\\t\\treturn evt;\\n\\t\\t};\\n\\t\\twindow.CustomEvent.prototype = window.Event.prototype;\\n\\t}\\n\\t\\n\\tif(!element) {\\n\\t\\treturn;\\n\\t}\\n\\telement.addEventListener(\\\"touchstart\\\", handleTouchStart, false);\\n\\telement.addEventListener(\\\"touchmove\\\", handleTouchMove, false);\\n\\telement.addEventListener(\\\"touchend\\\", handleTouchEnd, false);\\n\\t\\n\\toptions = options || {};\\n\\t\\n\\tvar xDown = null,\\n\\t\\tyDown = null,\\n\\t\\txDiff = null,\\n\\t\\tyDiff = null,\\n\\t\\ttimeDown = null,\\n\\t\\tstartEl = null,\\n\\t\\tdefaults = {\\n\\t\\t\\t\\\"swipe-threshold\\\": 20,\\n\\t\\t\\t\\\"swipe-timeout\\\": 500\\n\\t\\t};\\n\\t\\t\\n\\t$tw.utils.extend(defaults,options);\\t\\n\\n\\t/**\\n\\t * Fires swiped event if swipe detected on touchend\\n\\t * @param {object} e - browser event object\\n\\t * @returns {void}\\n\\t */\\n\\tfunction handleTouchEnd(e) {\\n\\n\\t\\t// if the user released on a different target, cancel!\\n\\t\\tif (startEl !== e.target) return;\\n\\n\\t\\tvar swipeThreshold = parseInt(getNearestAttribute(startEl, 'data-swipe-threshold', defaults[\\\"swipe-threshold\\\"]), 10); // default 20px\\n\\t\\tvar swipeTimeout = parseInt(getNearestAttribute(startEl, 'data-swipe-timeout', defaults[\\\"swipe-timeout\\\"]), 10);\\t // default 500ms\\n\\t\\tvar timeDiff = Date.now() - timeDown;\\n\\t\\tvar eventType = '';\\n\\t\\tvar changedTouches = e.changedTouches || e.touches || [];\\n\\n\\t\\tif (Math.abs(xDiff) > Math.abs(yDiff)) { // most significant\\n\\t\\t\\tif (Math.abs(xDiff) > swipeThreshold && timeDiff \u003C swipeTimeout) {\\n\\t\\t\\t\\tif (xDiff > 0) {\\n\\t\\t\\t\\t\\teventType = 'swiped-left';\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\telse {\\n\\t\\t\\t\\t\\teventType = 'swiped-right';\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\telse if (Math.abs(yDiff) > swipeThreshold && timeDiff \u003C swipeTimeout) {\\n\\t\\t\\tif (yDiff > 0) {\\n\\t\\t\\t\\teventType = 'swiped-up';\\n\\t\\t\\t}\\n\\t\\t\\telse {\\n\\t\\t\\t\\teventType = 'swiped-down';\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif (eventType !== '') {\\n\\n\\t\\t\\tvar eventData = {\\n\\t\\t\\t\\tdir: eventType.replace(/swiped-/, ''),\\n\\t\\t\\t\\txStart: parseInt(xDown, 10),\\n\\t\\t\\t\\txEnd: parseInt((changedTouches[0] || {}).clientX || -1, 10),\\n\\t\\t\\t\\tyStart: parseInt(yDown, 10),\\n\\t\\t\\t\\tyEnd: parseInt((changedTouches[0] || {}).clientY || -1, 10)\\n\\t\\t\\t};\\n\\n\\t\\t\\t// fire `swiped` event event on the element that started the swipe\\n\\t\\t\\tstartEl.dispatchEvent(new CustomEvent('swiped', { bubbles: true, cancelable: true, detail: eventData }));\\n\\n\\t\\t\\t// fire `swiped-dir` event on the element that started the swipe\\n\\t\\t\\tstartEl.dispatchEvent(new CustomEvent(eventType, { bubbles: true, cancelable: true, detail: eventData }));\\n\\t\\t}\\n\\n\\t\\t// reset values\\n\\t\\txDown = null;\\n\\t\\tyDown = null;\\n\\t\\ttimeDown = null;\\n\\t}\\n\\n\\t/**\\n\\t * Records current location on touchstart event\\n\\t * @param {object} e - browser event object\\n\\t * @returns {void}\\n\\t */\\n\\tfunction handleTouchStart(e) {\\n\\n\\t\\t// if the element has data-swipe-ignore=\\\"true\\\" we stop listening for swipe events\\n\\t\\tif (e.target.getAttribute('data-swipe-ignore') === 'true') return;\\n\\n\\t\\tstartEl = e.target;\\n\\n\\t\\ttimeDown = Date.now();\\n\\t\\txDown = e.touches[0].clientX;\\n\\t\\tyDown = e.touches[0].clientY;\\n\\t\\txDiff = 0;\\n\\t\\tyDiff = 0;\\n\\t}\\n\\n\\t/**\\n\\t * Records location diff in px on touchmove event\\n\\t * @param {object} e - browser event object\\n\\t * @returns {void}\\n\\t */\\n\\tfunction handleTouchMove(e) {\\n\\n\\t\\tif (!xDown || !yDown) return;\\n\\n\\t\\tvar xUp = e.touches[0].clientX;\\n\\t\\tvar yUp = e.touches[0].clientY;\\n\\n\\t\\txDiff = xDown - xUp;\\n\\t\\tyDiff = yDown - yUp;\\n\\t}\\n\\n\\t/**\\n\\t * Gets attribute off HTML element or nearest parent\\n\\t * @param {object} el - HTML element to retrieve attribute from\\n\\t * @param {string} attributeName - name of the attribute\\n\\t * @param {any} defaultValue - default value to return if no match found\\n\\t * @returns {any} attribute value or defaultValue\\n\\t */\\n\\tfunction getNearestAttribute(el, attributeName, defaultValue) {\\n\\n\\t\\t// walk up the dom tree looking for data-action and data-trigger\\n\\t\\twhile (el && el !== document.documentElement) {\\n\\n\\t\\t\\tvar attributeValue = el.getAttribute(attributeName);\\n\\n\\t\\t\\tif (attributeValue) {\\n\\t\\t\\t\\treturn attributeValue;\\n\\t\\t\\t}\\n\\n\\t\\t\\tel = el.parentNode;\\n\\t\\t}\\n\\n\\t\\treturn defaultValue;\\n\\t}\\n};\\n\\nexports.SwipeEvents = SwipeEventsFactory;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"library\",\"Based on https\":\"//github.com/john-doherty/swiped-events\",\"https\":\"//github.com/scriptex/touchsweep/blob/master/src/touchsweep.js\"},\"$:/plugins/sq/streams/action-unselect.js\":{\"title\":\"$:/plugins/sq/streams/action-unselect.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/sq/streams/action-unselect.js\\ntype: application/javascript\\nmodule-type: 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;\\n\\nvar UnselectWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nUnselectWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nUnselectWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.parentDomNode = parent;\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nUnselectWidget.prototype.execute = function() {\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nUnselectWidget.prototype.refresh = function(changedTiddlers) {\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nUnselectWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tif (window.getSelection) {\\n\\t\\twindow.getSelection().removeAllRanges();\\n\\t} else if (document.selection) {\\n\\t\\tdocument.selection.empty();\\n\\t}\\n\\treturn true;\\n};\\n\\nUnselectWidget.prototype.allowActionPropagation = function() {\\n\\treturn false;\\n};\\n\\nexports[\\\"action-unselect\\\"] = UnselectWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/plugins/sq/streams/action-withinput.js\":{\"title\":\"$:/plugins/sq/streams/action-withinput.js\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/sq/streams/action-withinput.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nPrompt user for input before executing actions contained inside the widget.\\nThe string entered by the user is available in the variable userInput in the actions contained in the widget.\\n\\nPrompt user for confirmation before executing actions contained inside the widget.\\nIf the user cancels, the actions are not executed.\\n\\nExample:\\n\u003C$button>go\\n\u003C$action-withinput message=\\\"What is your name?\\\" actions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\\\"name\\\" $value=\u003C\u003CuserInput>>/>\\\"\\\"\\\" />\\n\u003C/$button>\\n\\nParameters:\\nmessage : message to display\\ndefault: default value, defaults to an empty string\\n\\n\\n\\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 WithInputWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nWithInputWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nWithInputWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.parentDomNode = parent;\\n\\tthis.renderChildren(parent,nextSibling);\\n};\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nWithInputWidget.prototype.execute = function() {\\n\\tthis.message = this.getAttribute(\\\"message\\\");\\n\\tthis.defaultValue = this.getAttribute(\\\"default\\\",\\\"\\\");\\n\\tthis.actions = this.getAttribute(\\\"actions\\\");\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nRefresh the widget by ensuring our attributes are up to date\\n*/\\nWithInputWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"message\\\"] || changedAttributes[\\\"default\\\"] || changedAttributes[\\\"actions\\\"]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n/*\\nInvoke the action associated with this widget\\n*/\\nWithInputWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tif(this.message && this.actions) {\\n\\t\\tvar userData = prompt(this.message,this.defaultValue);\\n\\t\\tif(userData != null) {\\n\\t\\t\\tthis.setVariable(\\\"userInput\\\",userData);\\n\\t\\t\\tthis.invokeActionString(this.actions,this,event);\\n\\t\\t\\treturn true;\\n\\t\\t}\\n\\t}\\n};\\n\\nWithInputWidget.prototype.allowActionPropagation = function() {\\n\\treturn false;\\n};\\n\\nexports[\\\"action-withinput\\\"] = WithInputWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/plugins/sq/streams/widgets/keyboard-plus.js\":{\"title\":\"$:/plugins/sq/streams/widgets/keyboard-plus.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/streams/widgets/keyboard-plus.js\\ntype: application/javascript\\nmodule-type: widget\\n\\\\*/\\n(function(){\\n\\t\\nvar Widget = require(\\\"$:/core/modules/widgets/widget.js\\\").widget;\\n\\nvar KeyboardWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nKeyboardWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tvar tag = this.parseTreeNode.isBlock ? \\\"div\\\" : \\\"span\\\";\\n\\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\\n\\t\\ttag = this.tag;\\n\\t}\\n\\t// Create element\\n\\tvar domNode = this.document.createElement(tag);\\n\\t// Assign classes\\n\\tvar classes = (this[\\\"class\\\"] || \\\"\\\").split(\\\" \\\");\\n\\tclasses.push(\\\"tc-keyboard\\\");\\n\\tdomNode.className = classes.join(\\\" \\\");\\n\\t\\n\\t\\n\\t// Add a keyboard event handler\\n\\tdomNode.addEventListener(\\\"keydown\\\",function (event) {\\n\\t\\t\\t// CM triggers two events\\n\\t\\t\\t// second event has:\\n\\t\\t\\t//\\t\\tdefaultPrevented : true\\n\\t\\t\\t//\\t\\tdetail: 0\\n\\t\\t\\t// \\t\\teventPhase 3 (instead of 2)\\n\\t\\t\\t// \\t\\tisComposing : false\\n\\t\\t\\tif(!event.defaultPrevented) {\\n\\t\\t\\t\\tvar key, action, preventDefault;\\n\\t\\t\\t\\tfor(var i=0; i\u003Cself.shortcutTiddlers.length; i++) {\\n\\t\\t\\t\\t\\tif(self.shortcutParsedList[i] !== undefined && $tw.keyboardManager.checkKeyDescriptors(event,self.shortcutParsedList[i])) {\\n\\t\\t\\t\\t\\t\\tkey = self.shortcutParsedList[i];\\n\\t\\t\\t\\t\\t\\taction = self.shortcutActionList[i];\\n\\t\\t\\t\\t\\t\\tpreventDefault = self.shortcutPreventDefaultList[i];\\n\\t\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif(key !== undefined) {\\n\\t\\t\\t\\t\\tif(preventDefault) {\\n\\t\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tObject.defineProperty(event,\\\"sqHandled\\\",{value:true});\\n\\t\\t\\t\\t\\t//event.sqHandled = true;\\n\\t\\t\\t\\t\\tevent.stopPropagation();\\n\\t\\t\\t\\t\\t//event.stopImmediatePropagation();\\n\\t\\t\\t\\t\\tself.invokeActionString(action,self,event);\\n\\t\\t\\t\\t\\treturn true;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn false;\\n\\t\\t}\\n\\t},false);\\n\\t\\n\\t// Insert element\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\t\\n}\\t\\n\\t\\nKeyboardWidget.prototype.execute = function() {\\n\\tvar self = this;\\n\\t// Get attributes\\n\\tthis.tag = this.getAttribute(\\\"tag\\\",\\\"\\\");\\n\\tthis[\\\"class\\\"] = this.getAttribute(\\\"class\\\",\\\"\\\");\\n\\tthis.shortcutTiddlerTag = this.getAttribute(\\\"shortcutTag\\\");\\n\\t//var keyInfoArray = [];\\n\\t\\n\\tthis.shortcutTiddlers = this.wiki.getTiddlersWithTag(this.shortcutTiddlerTag);\\n\\tthis.shortcutKeysList = [];\\n\\tthis.shortcutActionList = [];\\n\\tthis.shortcutParsedList = [];\\n\\tthis.shortcutPreventDefaultList = [];\\n\\t\\n\\tfor(var i=0; i\u003Cthis.shortcutTiddlers.length; i++) {\\n\\t\\tvar title = this.shortcutTiddlers[i],\\n\\t\\t\\ttiddlerFields = this.wiki.getTiddler(title).fields;\\n\\t\\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\\n\\t\\tthis.shortcutActionList[i] = tiddlerFields.text;\\n\\t\\tthis.shortcutPreventDefaultList[i] = tiddlerFields[\\\"prevent-default\\\"] && tiddlerFields[\\\"prevent-default\\\"] === \\\"no\\\" ? false : true;\\n\\t\\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? $tw.keyboardManager.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\\n\\t}\\n\\t\\n\\t// Make child widgets\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\\n\\t\\n\\tvar newList = this.wiki.getTiddlersWithTag(this.shortcutTiddlerTag)\\n\\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\\n\\t\\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\\n\\t\\t($tw.keyboardManager.detectNewShortcuts(changedTiddlers))\\n\\t);\\n\\t// Re-cache shortcuts if something changed\\n\\tif(hasChanged) {\\n\\t//\\tthis.updateShortcutLists(newList);\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\t\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"class\\\"] || changedAttributes.tag) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\n\\nKeyboardWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\\n\\tif(!variables) {\\n\\t\\tvariables = {};\\n\\t}\\n\\t\\n\\tvar activeElement = document.activeElement;\\n\\tvar selection;\\n\\tif(activeElement && activeElement.tagName === \\\"IFRAME\\\") {\\n\\t\\tvar idoc = activeElement.contentDocument || activeElement.contentWindow.document;\\n\\t\\tactiveElement = idoc.activeElement;\\n\\t\\tselection = idoc.getSelection();\\n\\t} else {\\n\\t\\tselection = window.getSelection();\\n\\t}\\n\\n\\tif(window.CodeMirror && document.activeElement.closest(\\\".CodeMirror\\\")) {\\n\\t\\tvar cm = document.activeElement.closest(\\\".CodeMirror\\\").CodeMirror;\\n\\t\\tvar cursor = cm.getCursor(\\\"start\\\");\\n\\t\\tvar startRange = cm.getRange({\\\"line\\\":0,\\\"ch\\\":0},{\\\"line\\\":cursor.line,\\\"ch\\\":cursor.ch});\\n\\t\\tvar selectionStart = startRange.length;\\n\\t\\tvar selection = cm.getSelection();\\n\\t\\tvar selectionEnd = selectionStart + selection.length;\\n\\t\\t\\n\\t\\tvariables[\\\"selectionStart\\\"] = startRange.length.toString();\\n\\t\\tvariables[\\\"selectionEnd\\\"] = (selectionStart + selection.length).toString();\\n\\t\\tvariables[\\\"selection\\\"] = cm.getSelection().toString();\\n\\t} else if(activeElement && selection && ((activeElement.tagName === \\\"INPUT\\\" && activeElement.type === \\\"TEXT\\\") || activeElement.tagName === \\\"TEXTAREA\\\")) {\\n\\t\\tvariables[\\\"selectionStart\\\"] = activeElement.selectionStart.toString();\\n\\t\\tvariables[\\\"selectionEnd\\\"] = activeElement.selectionEnd.toString();\\n\\t\\tvariables[\\\"selection\\\"] = selection.toString();\\n\\t}\\n\\n\\t//this.selection_original_invokeActionString(actions,triggeringWidget,event,variables);\\n\\tObject.getPrototypeOf(Object.getPrototypeOf(this)).invokeActionString.call(this,actions,triggeringWidget,event,variables);\\n}\\n\\nexports[\\\"keyboard-plus\\\"] = KeyboardWidget;\\n\\n})();\\t\",\"type\":\"application/javascript\",\"module-type\":\"widget\"},\"$:/plugins/sq/streams/streams-edit\":{\"title\":\"$:/plugins/sq/streams/streams-edit\",\"text\":\"/*\\\\\\n\\ntitle: $:/plugins/sq/streams/streams-edit\\ntype: application/javascript\\nmodule-type: widget-subclass\\n\\n\\\\*/\\n\\nexports.baseClass = \\\"edit\\\";\\nexports.name = \\\"streams-edit\\\";\\n\\nexports.constructor = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n}\\nexports.prototype = {};\\n\\nexports.prototype.getEditorType = function() {\\n\\tvar tiddler = this.wiki.getTiddler(this.editTitle);\\n\\tvar type = tiddler.fields.type || \\\"text/vnd.tiddlywiki\\\";\\n\\tvar editorType;\\n\\tif(type === \\\"text/vnd.tiddlywiki\\\") {\\n\\t\\teditorType = this.wiki.getTiddlerText(\\\"$:/config/sq/streams/editor-engine\\\");\\n\\t\\tif((!$tw.wiki.getTiddler(\\\"$:/plugins/tiddlywiki/codemirror\\\") || $tw.wiki.getTiddlerText(\\\"$:/config/Plugins/Disabled/$:/plugins/tiddlywiki/codemirror\\\",\\\"no\\\") === \\\"yes\\\" || !$tw.modules.titles[\\\"$:/plugins/tiddlywiki/codemirror/edit-codemirror.js\\\"]) && (editorType === \\\"codemirror\\\") ) {\\n\\t\\t\\teditorType = \\\"text\\\";\\n\\t\\t}\\n\\t\\treturn editorType;\\n\\t}\\n\\teditorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\\n\\tif(!editorType) {\\n\\t\\tvar typeInfo = $tw.config.contentTypeInfo[type];\\n\\t\\tif(typeInfo && typeInfo.encoding === \\\"base64\\\") {\\n\\t\\t\\teditorType = \\\"binary\\\";\\n\\t\\t} else {\\n\\t\\t\\teditorType = \\\"text\\\";\\n\\t\\t}\\n\\t}\\n\\treturn editorType;\\n};\",\"type\":\"application/javascript\",\"module-type\":\"widget-subclass\"},\"$:/plugins/sq/streams/widgets/swiper.js\":{\"title\":\"$:/plugins/sq/streams/widgets/swiper.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/sq/streams/widgets/swiper.js\\ntype: application/javascript\\nmodule-type: widget\\n\\nSwipe event handler 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;\\n//var SwipeListener = require(\\\"$:/sq/lib/swipe-listener\\\");\\nvar SwipeEvents = require(\\\"$:/plugins/sq/lib/swipeevents.js\\\").SwipeEvents;\\n\\nvar SwipeWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSwipeWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSwipeWidget.prototype.render = function(parent,nextSibling) {\\n\\tvar self = this;\\n\\t// Remember parent\\n\\tthis.parentDomNode = parent;\\n\\t// Compute attributes and execute state\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\t// Create element\\n\\tvar tag = this.parseTreeNode.isBlock ? \\\"div\\\" : \\\"span\\\";\\n\\tif(this.swipeTag && $tw.config.htmlUnsafeElements.indexOf(this.swipeTag) === -1) {\\n\\t\\ttag = this.swipeTag;\\n\\t}\\t\\n\\tvar domNode = this.document.createElement(tag);\\n\\tif(this.swipeEnable) {\\n\\t\\tSwipeEvents(domNode,{\\\"swipe-threshold\\\": this.swipeThreshold});\\n\\t}\\n\\tparent.insertBefore(domNode,nextSibling);\\n\\tthis.renderChildren(domNode,null);\\n\\tthis.domNodes.push(domNode);\\n}\\n\\n/*\\nCompute the internal state of the widget\\n*/\\nSwipeWidget.prototype.execute = function() {\\n\\tvar self = this;\\n\\tthis.swipeThreshold = parseInt(this.getAttribute(\\\"swipethreshold\\\",\\\"100\\\"));\\n\\tthis.swipeEnable = this.getAttribute(\\\"enable\\\",\\\"yes\\\") === \\\"yes\\\";\\n\\tthis.swipeTag = this.getAttribute(\\\"tag\\\");\\n\\tthis.makeChildWidgets();\\n};\\n\\n/*\\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\\n*/\\nSwipeWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif($tw.utils.count(changedAttributes) > 0) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t} else {\\n\\t\\treturn this.refreshChildren(changedTiddlers);\\n\\t}\\n};\\n\\nexports.swiper = SwipeWidget;\\n\\n})();\",\"type\":\"application/javascript\",\"module-type\":\"widget\"}}}","revision":"0","bag":"default"}, -{"text":"{\n \"tiddlers\": {\n \"$:/plugins/sq/streams-as-editor/single-tiddler-streams.js\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/single-tiddler-streams.js\",\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/sq/streams-as-editor/single-tiddler-streams.js\\ntype: application/javascript\\nmodule-type: widget\\n\\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 UUID = (function() {\\n var self = {};\\n var lut = []; for (var i=0; i\u003C256; i++) { lut[i] = (i\u003C16?'0':'')+(i).toString(16); }\\n self.generate = function() {\\n\\tvar d0 = Math.random()*0xffffffff|0;\\n\\tvar d1 = Math.random()*0xffffffff|0;\\n\\tvar d2 = Math.random()*0xffffffff|0;\\n\\tvar d3 = Math.random()*0xffffffff|0;\\n\\treturn lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+\\n\\t lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+\\n\\t lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+\\n\\t lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];\\n }\\n return self;\\n})();\\n\\nvar SingleTiddlerStreamsWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSingleTiddlerStreamsWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSingleTiddlerStreamsWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.parentDomNode = parent;\\n\\t//this.renderChildren(parent,nextSibling);\\n\\n\\t\\n};\\n\\nSingleTiddlerStreamsWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar sourceTiddler = this.wiki.getTiddler(this.tiddlerTitle);\\n\\tif(!sourceTiddler) {\\n\\t\\treturn;\\n\\t}\\n\\tvar sourceText = \\\"\\\\n\\\\\\\\rules only list \\\\n\\\\n\\\" + this.wiki.getTiddlerText(this.tiddlerTitle);\\n\\tvar wikifyParser = this.wiki.parseText(\\\"text/vnd.tiddlywiki\\\",sourceText, {\\n\\t\\tparseAsInline : false\\n\\t});\\n\\tconsole.log(wikifyParser);\\n\\t\\n\\tvar tree = wikifyParser.tree;\\n\\tif(tree.length == 0 || tree[0].tag !== \\\"ul\\\" || tree.length !== 1) {\\n\\t\\treturn;\\n\\t}\\n\\tvar list = tree[0];\\n\\t\\n\\tthis.nodes = [];\\n\\tvar parentTiddlerFields = {\\n\\t\\ttitle: this.tiddlerTitle\\n\\t}\\n\\tthis.nodes.push(parentTiddlerFields);\\n\\tthis.processList(list,parentTiddlerFields);\\n\\tconsole.log(1);\\n\\t\\n\\tthis.createNodeTiddlers();\\n\\treturn true;\\n};\\n\\nSingleTiddlerStreamsWidget.prototype.createNodeTiddlers = function() {\\n\\tfor(var i=0; i\u003Cthis.nodes.length; i++) {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.nodes[i].title);\\n\\t\\tvar newTiddler = new $tw.Tiddler(tiddler,this.nodes[i]);\\n\\t\\tthis.wiki.addTiddler(newTiddler);\\n\\t}\\n};\\n\\n// process UL tag\\nSingleTiddlerStreamsWidget.prototype.processList = function(list,parentTiddler) {\\t\\t\\n\\tvar childNodes = [];\\n\\t\\t\\n\\tfor(var i=0; i\u003Clist.children.length; i++) {\\n\\n\\t\\tvar tiddler = {\\n\\t\\t\\t\\\"title\\\": \\\"$:/streams/temp/\\\" + this.tiddlerTitle + \\\"/\\\" + UUID.generate(),\\n\\t\\t\\t\\\"parent\\\": parentTiddler.title,\\n\\t\\t\\t\\\"text\\\": list.children[i].children[0].text,\\n\\t\\t\\t\\\"stream-type\\\" : \\\"default\\\"\\n\\t\\t};\\t\\t\\n\\t\\t\\n\\t\\tvar subList = list.children[i].children[1];\\n\\t\\tif(subList && subList.tag === \\\"ul\\\") {\\n\\t\\t\\tthis.processList(subList,tiddler);\\n\\t\\t}\\n\\t\\t\\n\\t\\tchildNodes.push(tiddler.title);\\n\\t\\tthis.nodes.push(tiddler);\\n\\t\\t// add tiddler to wiki\\n\\t}\\n\\tparentTiddler[\\\"stream-list\\\"] = $tw.utils.stringifyList(childNodes);\\n\\t//save child nodes to stream-list in parent\\n}\\n\\n\\nSingleTiddlerStreamsWidget.prototype.execute = function() {\\n\\tthis.tiddlerTitle = this.getAttribute(\\\"$tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n//\\tthis.makeChildWidgets();\\n};\\n\\n\\nSingleTiddlerStreamsWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"tiddler\\\"] || changedTiddlers[this.tiddlerTitle]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports[\\\"action-editwithstreams\\\"] = SingleTiddlerStreamsWidget;\\n\\n})();\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"$:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\\ntype: application/javascript\\nmodule-type: filteroperator\\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[\\\"stream-to-wikilist\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler && tiddler.fields[\\\"stream-list\\\"]) {\\t\\t\\t\\n\\t\\t\\tvar wikilist = \\\"\\\";\\n\\t\\t\\t\\n\\t\\t\\tfunction processNode(node,prefix) {\\t\\t\\t\\t\\n\\t\\t\\t\\tvar streamList = $tw.utils.parseStringArray(node.getFieldString(\\\"stream-list\\\"));\\n\\t\\t\\t\\tfor(var i=0; i\u003CstreamList.length; i++) {\\n\\t\\t\\t\\t\\tvar n = $tw.wiki.getTiddler(streamList[i]);\\n\\t\\t\\t\\t\\tvar line = prefix + \\\" \\\" + $tw.wiki.getTiddlerText(streamList[i],\\\"\\\") + \\\"\\\\n\\\";\\n\\t\\t\\t\\t\\twikilist += line;\\n\\t\\t\\t\\t\\tif(n && n.fields[\\\"stream-list\\\"] != undefined) {\\n\\t\\t\\t\\t\\t\\tprocessNode(n,prefix + \\\"*\\\");\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t\\n\\t\\t\\tprocessNode(tiddler,\\\"*\\\");\\n\\t\\t\\tresults.push(wikilist);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\",\n \"type\": \"application/javascript\",\n \"module-type\": \"filteroperator\"\n },\n \"$:/plugins/sq/streams-as-editor/viewtemplate\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/viewtemplate\",\n \"created\": \"20200816211512617\",\n \"modified\": \"20200817155923474\",\n \"tags\": \"$:/tags/ViewTemplate\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\\\\define delete-children()\\n\\t\u003C$list filter=\\\"[enlist{!!stream-list}]\\\">\\n\\t\\t\u003C\u003Cdelete-children>>\\n\\t\u003C/$list>\\n\\t\u003C$action-deletetiddler $filter=\\\"[enlist{!!stream-list}]\\\"/>\\n\\\\end\\n\\n\u003C$list filter=\\\"\\\"\\\"[\u003Cfolded-state>get[text]!is[blank]else[show]!match[hide]]\\\"\\\"\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-type]!is[blank]else[default]match[singletiddler]]\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-status]!is[blank]else[default]!match[active]]\\\" variable=\\\"_NULL\\\">\\n\u003C$button> edit with Streams\\n\u003C$action-editwithstreams $tiddler=\u003C\u003CcurrentTiddler>>/>\\n\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> hide-body=\\\"yes\\\" stream-status=\\\"active\\\"/>\\n\u003C/$button>\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-status]match[active]]\\\" variable=\\\"_NULL\\\">\\n{{||$:/plugins/sq/streams/nodes-list-template}}\\n\u003C$button> save\\n\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> text={{{[\u003CcurrentTiddler>stream-to-wikilist[]]}}} />\\n\u003C\u003Cdelete-children>>\\n\u003C$action-deletefield $tiddler=\u003C\u003CcurrentTiddler>> hide-body=\\\"no\\\" stream-list=\\\"\\\" stream-status=\\\"\\\"/>\\n\u003C/$button>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$list>\"\n }\n }\n}","version":"0.0.01","type":"application/json","title":"$:/plugins/sq/streams-as-editor","source":"","revision":"0","plugin-type":"plugin","list":"","description":"Streams Editor for Lists","dependents":"","core-version":">=5.1.22","bag":"default","author":"Saq Imtiaz"}, -{"text":"{\n \"tiddlers\": {\n \"$:/config/SearchResults/Default\": {\n \"title\": \"$:/config/SearchResults/Default\",\n \"created\": \"20200820180447855\",\n \"modified\": \"20200820180500121\",\n \"tags\": \"\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"$:/plugins/sq/streams-search/StreamSearchResults\"\n },\n \"$:/plugins/sq/streams-search/stream-root-filter.js\": {\n \"title\": \"$:/plugins/sq/streams-search/stream-root-filter.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/sq/streams-search/stream-root-filter.js\\ntype: application/javascript\\nmodule-type: filteroperator\\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[\\\"stream-root\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler && tiddler.fields[\\\"parent\\\"] && tiddler.fields[\\\"stream-type\\\"]) {\\t\\t\\t\\n\\n\\t\\t\\tvar parentTiddler = tiddler;\\n\\t\\t\\t\\n\\t\\t\\twhile(parentTiddler && parentTiddler.fields.parent) {\\n\\t\\t\\t\\tparentTiddler = options.wiki.getTiddler(parentTiddler.fields.parent);\\n\\t\\t\\t}\\n\\t\\t\\tif(parentTiddler && parentTiddler.fields && tiddler.fields.title.startsWith(parentTiddler.fields[\\\"title\\\"])) {\\n\\t\\t\\t\\t$tw.utils.pushTop(results,parentTiddler.fields.title);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tresults.push(title);\\n\\t\\t\\t}\\n\\t\\t\\t\\n\\t\\t} else {\\n\\t\\t\\tresults.push(title);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\",\n \"type\": \"application/javascript\",\n \"module-type\": \"filteroperator\"\n },\n \"$:/plugins/sq/streams-search/StreamSearchResults\": {\n \"title\": \"$:/plugins/sq/streams-search/StreamSearchResults\",\n \"caption\": \"Streams\",\n \"created\": \"20200818210522653\",\n \"modified\": \"20200818212724254\",\n \"tags\": \"$:/tags/SearchResults\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\\\\define searchResultList()\\n//\u003Csmall>{{$:/language/Search/Matches/Title}}\u003C/small>//\\n\\n\u003C$list filter=\\\"[!is[system]search:title{$(searchTiddler)$}sort[title]stream-root[]limit[250]]\\\">\\n\u003Cspan class={{{[\u003CcurrentTiddler>addsuffix[-primaryList]] -[\u003CsearchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/span>\\n\u003C/$list>\\n\\n//\u003Csmall>{{$:/language/Search/Matches/All}}\u003C/small>//\\n\\n\u003C$list filter=\\\"[!is[system]search{$(searchTiddler)$}sort[title]stream-root[]limit[250]]\\\">\\n\u003Cspan class={{{[\u003CcurrentTiddler>addsuffix[-secondaryList]] -[\u003CsearchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\\n\u003C$transclude tiddler=\\\"$:/core/ui/ListItemTemplate\\\"/>\\n\u003C/span>\\n\u003C/$list>\\n\\n\\\\end\\n\u003C\u003CsearchResultList>>\"\n }\n }\n}","version":"0.0.02","type":"application/json","title":"$:/plugins/sq/streams-search","source":"","revision":"0","plugin-type":"plugin","list":"","description":"Streams addon: Search","dependents":"","core-version":">=5.1.22","bag":"default","author":"Saq Imtiaz"}, -{"title":"$:/plugins/tiddlywiki/filesystem","name":"Filesystem","description":"Synchronize changes from the node.js server to the local filesystem","list":"readme","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/tiddlywiki/filesystem/filesystemadaptor.js\":{\"title\":\"$:/plugins/tiddlywiki/filesystem/filesystemadaptor.js\",\"text\":\"/*\\\\\\ntitle: $:/plugins/tiddlywiki/filesystem/filesystemadaptor.js\\ntype: application/javascript\\nmodule-type: syncadaptor\\n\\nA sync adaptor module for synchronising with the local filesystem via node.js APIs\\n\\n\\\\*/\\n(function(){\\n\\n/*jslint node: true, browser: true */\\n/*global $tw: false */\\n\\\"use strict\\\";\\n\\n// Get a reference to the file system\\nvar fs = $tw.node ? require(\\\"fs\\\") : null,\\n\\tpath = $tw.node ? require(\\\"path\\\") : null;\\n\\nfunction FileSystemAdaptor(options) {\\n\\tvar self = this;\\n\\tthis.wiki = options.wiki;\\n\\tthis.boot = options.boot || $tw.boot;\\n\\tthis.logger = new $tw.utils.Logger(\\\"filesystem\\\",{colour: \\\"blue\\\"});\\n\\t// Create the \u003Cwiki>/tiddlers folder if it doesn't exist\\n\\t$tw.utils.createDirectory(this.boot.wikiTiddlersPath);\\n}\\n\\nFileSystemAdaptor.prototype.name = \\\"filesystem\\\";\\n\\nFileSystemAdaptor.prototype.supportsLazyLoading = false;\\n\\nFileSystemAdaptor.prototype.isReady = function() {\\n\\t// The file system adaptor is always ready\\n\\treturn true;\\n};\\n\\nFileSystemAdaptor.prototype.getTiddlerInfo = function(tiddler) {\\n\\t//Returns the existing fileInfo for the tiddler. To regenerate, call getTiddlerFileInfo().\\n\\tvar title = tiddler.fields.title;\\n\\treturn this.boot.files[title];\\n};\\n\\n/*\\nReturn a fileInfo object for a tiddler, creating it if necessary:\\n filepath: the absolute path to the file containing the tiddler\\n type: the type of the tiddler file (NOT the type of the tiddler -- see below)\\n hasMetaFile: true if the file also has a companion .meta file\\n\\nThe boot process populates this.boot.files for each of the tiddler files that it loads.\\nThe type is found by looking up the extension in $tw.config.fileExtensionInfo (eg \\\"application/x-tiddler\\\" for \\\".tid\\\" files).\\n\\nIt is the responsibility of the filesystem adaptor to update this.boot.files for new files that are created.\\n*/\\nFileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) {\\n\\t// Always generate a fileInfo object when this fuction is called\\n\\tvar title = tiddler.fields.title, newInfo, pathFilters, extFilters,\\n\\t\\tfileInfo = this.boot.files[title];\\n\\tif(this.wiki.tiddlerExists(\\\"$:/config/FileSystemPaths\\\")) {\\n\\t\\tpathFilters = this.wiki.getTiddlerText(\\\"$:/config/FileSystemPaths\\\",\\\"\\\").split(\\\"\\\\n\\\");\\n\\t}\\n\\tif(this.wiki.tiddlerExists(\\\"$:/config/FileSystemExtensions\\\")) {\\n\\t\\textFilters = this.wiki.getTiddlerText(\\\"$:/config/FileSystemExtensions\\\",\\\"\\\").split(\\\"\\\\n\\\");\\n\\t}\\n\\tnewInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\\n\\t\\tdirectory: this.boot.wikiTiddlersPath,\\n\\t\\tpathFilters: pathFilters,\\n\\t\\textFilters: extFilters,\\n\\t\\twiki: this.wiki,\\n\\t\\tfileInfo: fileInfo\\n\\t});\\n\\tcallback(null,newInfo);\\n};\\n\\n\\n/*\\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\\n*/\\nFileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback,options) {\\n\\tvar self = this;\\n\\tvar syncerInfo = options.tiddlerInfo || {};\\n\\tthis.getTiddlerFileInfo(tiddler,function(err,fileInfo) {\\n\\t\\tif(err) {\\n\\t\\t\\treturn callback(err);\\n\\t\\t}\\n\\t\\t$tw.utils.saveTiddlerToFile(tiddler,fileInfo,function(err,fileInfo) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tif ((err.code == \\\"EPERM\\\" || err.code == \\\"EACCES\\\") && err.syscall == \\\"open\\\") {\\n\\t\\t\\t\\t\\tfileInfo = fileInfo || self.boot.files[tiddler.fields.title];\\n\\t\\t\\t\\t\\tfileInfo.writeError = true;\\n\\t\\t\\t\\t\\tself.boot.files[tiddler.fields.title] = fileInfo;\\n\\t\\t\\t\\t\\t$tw.syncer.logger.log(\\\"Sync failed for \\\\\\\"\\\"+tiddler.fields.title+\\\"\\\\\\\" and will be retried with encoded filepath\\\",encodeURIComponent(fileInfo.filepath));\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Store new boot info only after successful writes\\n\\t\\t\\tself.boot.files[tiddler.fields.title] = fileInfo;\\n\\t\\t\\t// Cleanup duplicates if the file moved or changed extensions\\n\\t\\t\\tvar options = {\\n\\t\\t\\t\\tadaptorInfo: syncerInfo.adaptorInfo || {},\\n\\t\\t\\t\\tbootInfo: fileInfo || {},\\n\\t\\t\\t\\ttitle: tiddler.fields.title\\n\\t\\t\\t};\\n\\t\\t\\t$tw.utils.cleanupTiddlerFiles(options,function(err,fileInfo) {\\n\\t\\t\\t\\tif(err) {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t});\\n\\t\\t});\\n\\t});\\n};\\n\\n/*\\nLoad a tiddler and invoke the callback with (err,tiddlerFields)\\n\\nWe don't need to implement loading for the file system adaptor, because all the tiddler files will have been loaded during the boot process.\\n*/\\nFileSystemAdaptor.prototype.loadTiddler = function(title,callback) {\\n\\tcallback(null,null);\\n};\\n\\n/*\\nDelete a tiddler and invoke the callback with (err)\\n*/\\nFileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) {\\n\\tvar self = this,\\n\\t\\tfileInfo = this.boot.files[title];\\n\\t// Only delete the tiddler if we have writable information for the file\\n\\tif(fileInfo) {\\n\\t\\t$tw.utils.deleteTiddlerFile(fileInfo,function(err,fileInfo) {\\n\\t\\t\\tif(err) {\\n\\t\\t\\t\\tif ((err.code == \\\"EPERM\\\" || err.code == \\\"EACCES\\\") && err.syscall == \\\"unlink\\\") {\\n\\t\\t\\t\\t\\t// Error deleting the file on disk, should fail gracefully\\n\\t\\t\\t\\t\\t$tw.syncer.displayError(\\\"Server desynchronized. Error deleting file for deleted tiddler \\\\\\\"\\\" + title + \\\"\\\\\\\"\\\",err);\\n\\t\\t\\t\\t\\treturn callback(null,fileInfo);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\treturn callback(err);\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t// Remove the tiddler from self.boot.files & return null adaptorInfo\\n\\t\\t\\tself.removeTiddlerFileInfo(title);\\n\\t\\t\\treturn callback(null,null);\\n\\t\\t});\\n\\t} else {\\n\\t\\tcallback(null,null);\\n\\t}\\n};\\n\\n/*\\nDelete a tiddler in cache, without modifying file system.\\n*/\\nFileSystemAdaptor.prototype.removeTiddlerFileInfo = function(title) {\\n\\t// Only delete the tiddler info if we have writable information for the file\\n\\tif(this.boot.files[title]) {\\n\\t\\tdelete this.boot.files[title];\\n\\t};\\n};\\n\\nif(fs) {\\n\\texports.adaptorClass = FileSystemAdaptor;\\n}\\n\\n})();\\n\",\"type\":\"application/javascript\",\"module-type\":\"syncadaptor\"},\"$:/plugins/tiddlywiki/filesystem/readme\":{\"title\":\"$:/plugins/tiddlywiki/filesystem/readme\",\"text\":\"The filesystem plugin is used under Node.js to synchronise tiddler changes back to the file system. It is inert when used in the browser.\\n\\n[[Source code|https://github.com/Jermolene/TiddlyWiki5/blob/master/plugins/tiddlywiki/filesystem]]\\n\"}}}"}, {"title":"$:/plugins/tiddlywiki/menubar","name":"Menu Bar","description":"Menu Bar","list":"readme config","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/config/DefaultColourMappings/menubar-foreground\":{\"title\":\"$:/config/DefaultColourMappings/menubar-foreground\",\"text\":\"#fff\"},\"$:/config/DefaultColourMappings/menubar-background\":{\"title\":\"$:/config/DefaultColourMappings/menubar-background\",\"text\":\"#5778d8\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols\",\"text\":\"hide\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server\",\"text\":\"hide\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar\",\"text\":\"hide\"},\"$:/config/plugins/menubar/TableOfContents/Tag\":{\"title\":\"$:/config/plugins/menubar/TableOfContents/Tag\",\"text\":\"TableOfContents\"},\"$:/config/plugins/menubar/breakpoint\":{\"title\":\"$:/config/plugins/menubar/breakpoint\",\"text\":\"620px\"},\"$:/plugins/tiddlywiki/menubar/config\":{\"title\":\"$:/plugins/tiddlywiki/menubar/config\",\"tags\":\"$:/tags/ControlPanel/Toolbars\",\"caption\":\"Menu Bar\",\"text\":\"\\\\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/\\n\\n! Menu Bar Configuration\\n\\n!! Menu Items\\n\\nSelect which menu items will be shown. You can also drag items to reorder them.\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/MenuBar\\\" itemTemplate=\\\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n!! Breakpoint Position\\n\\nThe breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`).\\n\\n\u003C$edit-text tiddler=\\\"$:/config/plugins/menubar/breakpoint\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\n!! Contents Tag\\n\\nThe tag for the ~TableOfContents used in the Contents dropdown\\n\\n\u003C$edit-text tiddler=\\\"$:/config/plugins/menubar/TableOfContents/Tag\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\n!! Menu Bar Colours\\n\\nTo change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette\\n\"},\"$:/plugins/tiddlywiki/menubar/items/contents\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/contents\",\"caption\":\"Contents\",\"description\":\"Table of Contents\",\"is-dropdown\":\"yes\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\u003Cdiv class=\\\"tc-table-of-contents\\\">\\n\\n\u003C$macrocall $name=\\\"toc-selective-expandable\\\" tag={{$:/config/plugins/menubar/TableOfContents/Tag}}/>\\n\\n\u003C/div>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/hamburger\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/hamburger\",\"tags\":\"$:/tags/MenuBar\",\"caption\":\"Hamburger\",\"description\":\"Show the full menu bar on a narrow screen\",\"custom-menu-content\":\"{{$:/plugins/tiddlywiki/menubar/items/hamburger}}\",\"show-when\":\"narrow\",\"text\":\"\u003C$list filter=\\\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]\\\">\\n\u003C$button set=\\\"$:/state/popup/menubar/hamburger\\\" setTo=\\\"yes\\\">\\n{{$:/core/images/menu-button}}\\n\u003C/$button>\\n\u003C/$list>\\n\u003C$list filter=\\\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]\\\">\\n\u003C$button set=\\\"$:/state/popup/menubar/hamburger\\\" setTo=\\\"no\\\">\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Page controls from the sidebar\",\"caption\":\"Page controls\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\\\" mode=\\\"inline\\\"/>\",\"text\":\"\\\\whitespace trim\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\u003C$set name=\\\"hidden\\\" value=\u003C\u003Cconfig-title>>>\\n\u003C$list filter=\\\"[\u003Chidden>!text[hide]]\\\" storyview=\\\"pop\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/search\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/search\",\"custom-menu-content\":\"{{$:/plugins/tiddlywiki/menubar/items/search}}\",\"description\":\"Search\",\"caption\":\"Search\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\\\\define cancel-search-actions()\\n\u003C$set name=\\\"userInput\\\" value={{{ [\u003C__storeTitle__>get[text]] }}}>\\n\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!match\u003CuserInput>]\\\" emptyMessage=\\\"\\\"\\\"\u003C$action-deletetiddler $filter=\\\"[\u003C__storeTitle__>] [\u003C__tiddler__>] [\u003C__selectionStateTitle__>]\\\"/>\\\"\\\"\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003C__tiddler__>> text=\u003C\u003CuserInput>>/>\u003C$action-setfield $tiddler=\u003C\u003C__refreshTitle__>> text=\\\"yes\\\"/>\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define input-accept-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\"\\\"\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\n\\n\\\\define input-accept-variant-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\"\\\"\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\n\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\") \u003C$macrocall $name=\\\"change-input-tab\\\" stateTitle=\\\"$:/state/tab/search-results/sidebar\\\" tag=\\\"$:/tags/SearchResults\\\" beforeafter=\\\"$beforeafter$\\\" defaultState={{$:/config/SearchResults/Default}} actions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\\\"$:/state/search/currentTab\\\" text=\u003C\u003CnextTab>>/>\\\"\\\"\\\"/>\\n\\n\\\\whitespace trim\\n\u003C$vars searchTiddler=\\\"$:/temp/menubarsearch/input\\\" searchListState=\u003C\u003Cqualify \\\"$:/state/search-list/selected-item\\\">>>\\n\u003Cspan style=\\\"margin: 0 0.5em;\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003Cform class=\\\"tc-form-inline\\\">\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\" tiddler=\\\"$:/temp/menubarsearch\\\" storeTitle=\u003C\u003CsearchTiddler>> selectionStateTitle=\u003C\u003CsearchListState>> \\n\\t\\trefreshTitle=\\\"$:/temp/menubarsearch/refresh\\\" tag=\\\"input\\\" type=\\\"search\\\" focusPopup=\\\"$:/state/popup/menubar-search-dropdown\\\" \\n\\t\\tclass=\\\"tc-popup-handle tc-menu-show-when-wide\\\" placeholder=\\\"Search...\\\" default=\\\"\\\" cancelPopups=\\\"yes\\\" \\n\\t\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>> inputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>> inputCancelActions=\u003C\u003Ccancel-search-actions>> \\n\\t\\tfilterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter=\\\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\\\" />\\n\u003C/form>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/span>\\n\u003C$reveal tag=\\\"div\\\" class=\\\"tc-block-dropdown-wrapper\\\" state=\\\"$:/state/popup/menubar-search-dropdown\\\" type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\\n\u003Cdiv class=\\\"tc-block-dropdown tc-search-drop-down\\\">\\n\\n\u003C$list filter=\\\"[\u003CsearchTiddler>get[text]minlength[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003Cdiv class=\\\"tc-search-results\\\">Type your search terms\u003C/div>\\\"\\\"\\\" variable=\\\"ignore\\\">\\n\\n\u003C$list filter=\\\"[\u003CsearchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003Cdiv class=\\\"tc-search-results\\\">{{$:/language/Search/Search/TooShort}}\u003C/div>\\\"\\\"\\\" variable=\\\"listItem\\\">\\n\\n\u003C$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} userInput={{{ [\u003CsearchTiddler>get[text]] }}}>\\n\\n{{$:/core/ui/SearchResults}}\\n\\n\u003C/$vars>\\n\\n\u003C/$list>\\n\\n\u003C/$list>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\\n\\n\u003C/$vars>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/server\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/server\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Server options\",\"caption\":\"Server\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/server\\\" mode=\\\"inline\\\"/>\",\"text\":\"\u003C$list filter=\\\"[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003C$transclude tiddler=\\\"$:/core/ui/Buttons/save-wiki\\\" mode=\\\"inline\\\"/>\\n\u003C/$list>\\n\u003C$list filter=\\\"[[$:/status/IsLoggedIn]get[text]else[no]match[no]]\\\" variable=\\\"ignore\\\">\\n\u003C$button message=\\\"tm-login\\\">\\nLogin\\n\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/sidebar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/sidebar\",\"caption\":\"Sidebar\",\"description\":\"Sidebar\",\"is-dropdown\":\"yes\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\u003C$scrollable fallthrough=\\\"none\\\" class=\\\"tc-popup-keep tc-menubar-dropdown-sidebar\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/SideBarSegments/tabs\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/$scrollable>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/topleftbar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/topleftbar\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Items from $:/tags/TopLeftBar\",\"caption\":\"Legacy Top Left Bar\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/topleftbar\\\" mode=\\\"inline\\\"/>\",\"text\":\"\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\"},\"$:/plugins/tiddlywiki/menubar/items/toprightbar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/toprightbar\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Items from $:/tags/TopRightBar\",\"caption\":\"Legacy Top Right Bar\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/toprightbar\\\" mode=\\\"inline\\\"/>\",\"custom-menu-styles-wide\":\"float: right;\",\"text\":\"\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\"},\"$:/plugins/tiddlywiki/menubar/menu\":{\"title\":\"$:/plugins/tiddlywiki/menubar/menu\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\\\\define menubar-inner(size)\\n\u003Cul class=\\\"tc-menubar-list\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]]\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter=\\\"[[$size$]match[wide]] ~[\u003CcurrentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003Cli style={{!!custom-menu-styles-$size$}} class={{{ [\u003CcurrentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>!is-dropdown[yes]]\\\" variable=\\\"listItem\\\" emptyMessage=\\\"\\\"\\\"\\n\\t\u003C!-- Dropdown -->\\n\\t\u003C$set name=\\\"dropdown-state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/topmenu/dropdown/\\\">>>\\n\\t\u003C$set name=\\\"dropdown-state\\\" value={{{ [\u003Cdropdown-state>addsuffix\u003CcurrentTiddler>] }}}>\\n\\t\u003C$button popup=\u003C\u003Cdropdown-state>> selectedClass=\\\"tc-selected\\\">\\n\\t\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\\t\u003C$transclude field=\\\"caption\\\" mode=\\\"inline\\\"/>\\n\\t\u003C$text text=\\\" \\\"/>\\n\\t\u003Cspan class=\\\"tc-menubar-dropdown-arrow\\\">\\n\\t\u003C$transclude tiddler=\\\"$:/core/images/down-arrow\\\" mode=\\\"inline\\\"/>\\n\\t\u003C/span>\\n\\t\u003C/$set>\\n\\t\u003C/$button>\\n\\t\u003C/$set>\\n\\t\u003C/$set>\\n\\\"\\\"\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>has[custom-menu-content]]\\\" variable=\\\"listItem\\\" emptyMessage=\\\"\\\"\\\"\\n\\t\u003C!-- Link -->\\n\\t\u003C$link to={{!!target}}>\\n\\t\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\\t\u003C$transclude field=\\\"caption\\\" mode=\\\"inline\\\"/>\\n\\t\u003C/$set>\\n\\t\u003C/$link>\\n\\\"\\\"\\\">\\n\u003C!-- Custom content -->\\n\u003C$transclude field=\\\"custom-menu-content\\\" mode=\\\"inline\\\"/>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/ul>\\n\\\\end\\n\\n\u003C$list filter=\\\"[\u003Ctv-config-static>!match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\\\" variable=\\\"listItem\\\">\\n\u003Cnav class=\\\"tc-menubar tc-adjust-top-of-scroll\\\">\\n\u003Cdiv class=\\\"tc-menubar-narrow\\\">\\n\u003C\u003Cmenubar-inner narrow>>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-menubar-wide\\\">\\n\u003C\u003Cmenubar-inner wide>>\\n\u003C/div>\\n\u003Cdiv style=\\\"clear:both;\\\"/>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"dropdown-state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/topmenu/dropdown/\\\">>>\\n\u003C$set name=\\\"dropdown-state\\\" value={{{ [\u003Cdropdown-state>addsuffix\u003CcurrentTiddler>] }}}>\\n\u003C$reveal type=\\\"popup\\\" state=\u003C\u003Cdropdown-state>> position={{{ [\u003CcurrentTiddler>get[dropdown-position]else[below]] }}} class={{{ [\u003CcurrentTiddler>get[class]] }}} tag=\\\"div\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\u003C$transclude/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/nav>\\n\u003C/$list>\\n\u003C/$list>\\n\"},\"$:/core/ui/PageTemplate/topleftbar\":{\"title\":\"$:/core/ui/PageTemplate/topleftbar\",\"text\":\"\u003C!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar -->\"},\"$:/core/ui/PageTemplate/toprightbar\":{\"title\":\"$:/core/ui/PageTemplate/toprightbar\",\"text\":\"\u003C!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar -->\"},\"$:/plugins/tiddlywiki/menubar/readme\":{\"title\":\"$:/plugins/tiddlywiki/menubar/readme\",\"text\":\"!! Introduction\\n\\nThis plugin provides a menu bar with the following features:\\n\\n* Menu items take the form of simple text links, dropdowns, or entirely custom content\\n* Menu items can be individually enabled via the control panel\\n* Responds to reduced screen width by abbreviating the menu items to a \\\"hamburger\\\" dropdown\\n\\n!! Menu Item Tiddlers\\n\\nMenu items are tagged \u003C\u003Ctag $:/tags/MenuBar>>. The following fields are used by this plugin:\\n\\n|!Field Name |!Purpose |\\n|title |Each menu item must have a unique title (not shown to the user) |\\n|description |Description for use in listings |\\n|tags |Must contain `$:/tags/MenuBar` |\\n|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required |\\n|target |For simple link menu items specifies a tiddler title as the target of the link |\\n|is-dropdown |Set to `yes` to indicate a dropdown menu item |\\n|dropdown-position |Optional position for the dropdown (can be ''left'', ''above'', ''aboveleft'', ''aboveright'', ''right'', ''belowleft'', ''belowright'' or ''below'') |\\n|text |For dropdown menu items, specifies the body of the dropdown |\\n|custom-menu-content |Optional wikitext to be displayed in place of the caption |\\n|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide |\\n|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow |\\n\\nCustom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element.\\n\\nNote that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`.\\n\"},\"$:/plugins/tiddlywiki/menubar/styles\":{\"title\":\"$:/plugins/tiddlywiki/menubar/styles\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define breakpoint-plus-one()\\n\u003C$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] ~[{$:/config/plugins/menubar/breakpoint}] }}} />\\n\\\\end\\n\\n\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}} />\\n\\\\end\\n\\n\\\\define set-sidebar-scrollable-top-if-hamburger()\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] -$:/plugins/tiddlywiki/menubar/items/hamburger +[limit[1]]\\\">\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tmargin-top: 2em;\\n\\t}\\n\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define set-sidebar-scrollable-top()\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\\\">\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tmargin-top: 2em;\\n\\t}\\n\\n\u003C/$list>\\n\u003C$reveal state=\\\"$:/state/popup/menubar/hamburger\\\" type=\\\"match\\\" text=\\\"yes\\\">\\n\\n\\t\u003C$set name=\\\"itemCount\\\" value={{{ [all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[count[]] }}}>\\n\\n\\t\\t.tc-sidebar-scrollable {\\n\\t\\t\\tmargin-top: calc(\u003C\u003CitemCount>> * 2em);\\n\\t\\t}\\n\\n\\t\u003C/$set>\\n\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\nnav.tc-menubar {\\n\\tposition: fixed;\\n\\tz-index: 850;\\n\\tdisplay: inline-block;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tleft: 0;\\n}\\n\\nnav.tc-menubar ul.tc-menubar-list {\\n\\tposition: relative;\\n\\tlist-style-type: none;\\n\\tmargin: 0;\\n\\tpadding: 0 0 0 42px;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tbackground: \u003C\u003Ccolour menubar-background>>;\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\thtml nav.tc-menubar ul.tc-menubar-list {\\n\\t\\tpadding: 0 0 0 8px;\\n\\t}\\n\\n}\\n\\nnav.tc-menubar li.tc-menubar-item {\\n\\tdisplay: inline-block;\\n\\tmargin: 0;\\n\\tpadding: 0;\\n}\\n\\nnav.tc-menubar .tc-menubar-narrow li.tc-menubar-item {\\n\\tdisplay: block;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a,\\nnav.tc-menubar li.tc-menubar-item > button {\\n\\tdisplay: inline-block;\\n/*\\ttext-transform: uppercase; */\\n\\tline-height: 1;\\n\\tfont-weight: 700;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tcolor: \u003C\u003Ccolour menubar-foreground>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour menubar-foreground>>;\\n\\ttext-decoration: none;\\n\\tpadding: 0.5em;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\tcursor: pointer;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a.tc-selected,\\nnav.tc-menubar li.tc-menubar-item > button.tc-selected {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item svg {\\n\\ttransition: none;\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour menubar-foreground>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg {\\n\\twidth: 0.5em;\\n\\theight: 0.5em;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a.tc-selected svg,\\nnav.tc-menubar li.tc-menubar-item > button.tc-selected svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a:hover,\\nnav.tc-menubar li.tc-menubar-item > button:hover svg,\\nnav.tc-menubar li.tc-menubar-item > button:hover {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a:active,\\nnav.tc-menubar li.tc-menubar-item > button:active svg,\\nnav.tc-menubar li.tc-menubar-item > button:active {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar .tc-drop-down,\\nnav.tc-menubar .tc-block-dropdown {\\n\\tmax-width: 70vw;\\n\\tmax-height: 70vh;\\n\\toverflow: auto;\\n}\\n\\nnav.tc-menubar .tc-drop-down a {\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar .tc-drop-down .tc-table-of-contents button {\\n\\tdisplay: inline-block;\\n\\twidth: auto;\\n}\\n\\nnav.tc-menubar .tc-drop-down ol {\\n\\tmargin: 0;\\n}\\n\\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a,\\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button {\\n\\tdisplay: inline;\\n\\twidth: auto;\\n}\\n\\nnav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n}\\n\\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\\n\\n\\t.tc-menubar-wide {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\\n@media (min-width: \u003C\u003Cbreakpoint-plus-one>>) {\\n\\n\\tnav.tc-menubar li.tc-menubar-item.tc-menubar-narrow,\\n\\t.tc-menubar-narrow {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t\u003C\u003Cset-sidebar-scrollable-top-if-hamburger>>\\n\\n}\\n\\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\\n\\n\\t\u003C\u003Cset-sidebar-scrollable-top>>\\n\\n}\\n@media print {\\n\\n\\tnav.tc-menubar {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\"},\"$:/tags/MenuBar\":{\"title\":\"$:/tags/MenuBar\",\"list\":\"$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar\"}}}"}, {"created":"20230928091243648","text":"\n","title":"$:/plugins/tiddlywiki/menubar/items/about","caption":"About","description":"Table of Proyectos","is-dropdown":"yes","tags":"$:/tags/MenuBar","modified":"20230928091329047"}, {"created":"20230928091359995","text":"\u003Cdiv class=\"tc-table-of-contents\">\n\n\u003C\u003Ctoc-selective-expandable 'Actividades'>>\n\n\u003C/div>\n","title":"$:/plugins/tiddlywiki/menubar/items/actividades","caption":"Actividades","description":"Table of Proyectos","is-dropdown":"yes","tags":"$:/tags/MenuBar","modified":"20230928091829374"}, @@ -509,7 +490,7 @@ Error message and password prompt {"created":"20230928045458114","title":"$:/state/tab--1498284803","text":"$:/core/ui/AdvancedSearch/Shadows","modified":"20230929092935273"}, {"created":"20230927221015986","title":"$:/state/tab--1963855381","text":"$:/core/ui/ControlPanel/Toolbars","modified":"20230929091921580"}, {"created":"20230928040704540","title":"$:/state/tab--2112689675","text":"$:/core/ui/ControlPanel/Basics","modified":"20230928055052216"}, -{"created":"20230928083530469","title":"$:/state/tab--86143343","text":"$:/core/ui/ControlPanel/Plugins/Installed/Plugins","modified":"20230929105858985"}, +{"created":"20230928083530469","title":"$:/state/tab--86143343","text":"$:/core/ui/ControlPanel/Plugins/Installed/Plugins","modified":"20230929172413552"}, {"created":"20230928040708019","title":"$:/state/tab--959111941","text":"$:/core/ui/ControlPanel/Stylesheets","modified":"20230928054758889"}, {"created":"20230927070359746","title":"$:/state/tab-1749438307","text":"$:/core/ui/ControlPanel/Plugins","modified":"20230929172214864"}, {"created":"20230928040939296","title":"$:/state/tab-453520357","text":"$:/core/ui/ControlPanel/EditTemplateBody","modified":"20230928040947232"}, @@ -524,7 +505,7 @@ Error message and password prompt {"created":"20230928082306069","title":"$:/state/toc/TableOfContents-Servicios--944721818","text":"open","modified":"20230928082306069"}, {"created":"20230928082231303","title":"$:/state/toc/TableOfContents-Talleres--944721818","text":"open","modified":"20230928083015283"}, {"title":"$:/status/RequireReloadDueToPluginChange","text":"yes"}, -{"title":"$:/StoryList","created":"20230929172155714","text":"","list":"$:/ControlPanel copinchapedia","modified":"20230929172234179"}, +{"title":"$:/StoryList","created":"20230929180941714","text":"","list":"copinchapedia","modified":"20230929180952134"}, {"created":"20230928034438840","title":"$:/theme","text":"$:/themes/tiddlywiki/centralised","modified":"20230928062438120"}, {"title":"$:/themes/tiddlywiki/centralised","name":"Centralised","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Centralises the story river","dependents":"$:/themes/tiddlywiki/snowwhite","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/centralised/styles.tid\":{\"title\":\"$:/themes/tiddlywiki/centralised/styles.tid\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\\n\\n\\thtml .tc-page-container {\\n\\t\\ttext-align: center;\\n\\t}\\n\\n\\thtml .tc-story-river {\\n\\t\\tposition: relative;\\n\\t\\twidth: 770px;\\n\\t\\tpadding: 42px;\\n\\t\\tmargin: 0 auto;\\n\\t\\ttext-align: left;\\n\\t}\\n\\n\\thtml .tc-sidebar-scrollable {\\n\\t\\ttext-align: left;\\n\\t\\tleft: 50%;\\n\\t\\tright: 0;\\n\\t\\tmargin-left: 343px;\\n\\t}\\n}\\n\"}}}"}, {"title":"$:/themes/tiddlywiki/snowwhite","name":"Snow White","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Emphasises individual tiddlers","dependents":"$:/themes/tiddlywiki/vanilla","plugin-priority":"0","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/snowwhite/base\":{\"title\":\"$:/themes/tiddlywiki/snowwhite/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n.tc-sidebar-header {\\n\\ttext-shadow: 0 1px 0 \u003C\u003Ccolour sidebar-foreground-shadow>>;\\n}\\n\\n.tc-tiddler-info {\\n\\t\u003C\u003Cbox-shadow \\\"inset 1px 2px 3px rgba(0,0,0,0.1)\\\">>\\n}\\n\\n@media screen {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n\\t}\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow none>>\\n\\t}\\n}\\n\\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\\n\\t\u003C\u003Ctransition \\\"fill 150ms ease-in-out\\\">>\\n}\\n\\n.tc-tiddler-controls button.tc-selected,\\n.tc-page-controls button.tc-selected {\\n\\t\u003C\u003Cfilter \\\"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\\\">>\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-edit-tags {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"none\\\">>\\n\\tborder: none;\\n\\toutline: none;\\n}\\n\\ntextarea.tc-edit-texteditor {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 5px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-drop-down {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-block-dropdown {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-modal {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n}\\n\\n.tc-modal-footer {\\n\\tborder-radius: 0 0 6px 6px;\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 0 #fff\\\">>;\\n}\\n\\n\\n.tc-alert {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.6)\\\">>\\n}\\n\\n.tc-notification {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n\\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\\n}\\n\\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\\n\\tborder-top: none;\\n\\theight: 1px;\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\\\">>\\n}\\n\\n.tc-message-box img {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\\n.tc-plugin-info {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\"}}}"}, @@ -566,6 +547,7 @@ Error message and password prompt {"created":"20230928073732659","text":"[[Intersticialidad]]\n\n[[Diseno intersticial]]\n\n[[Diseno participativo intersticial]]\n\n[[Ventajas de la instersticialidad]]\n\n[[Ventajas de la instersticialidad 1]]\n\n[[La maquina intersticial 1]]\n\n[[carta resistor]]\n\n---\n\n# A quien van dirijido?\n\n# Cuantas sesiones serian?\n\n# Cuales son los colectivo?\n\n* XFR\n\n* Archivistas\n\n* Bases?\n\n* Tecnologia como un proceso rizomatico\n\n** En la medida que somos capaces de crear e interconectar alternativas reevaluamos el pontencial de la tecnologia para nosotors mismo y nuestra comunidad.\n\nIntersticialidad \n\n\n* diy-diwo\n** hardware abierto\n*** opensource vs privado \n*** opensorce y autonomia comunitaria\n*** opensource y sentido de pertenencia\n*** amplificar la participacion\n***pequena escala\n***vista panoramica\n\n* sinergia\n** tejido comunitario.\n*** tejido con el territorios\n** tejido digital desde lo online\n*** trabajar en red, (con otros colectivos, otros contextos)\n** que problemas solucionan?\n*** reciclaje. \n\nofrecer a partir de la escusa de la maquina,.\n\ntoca las 3 patas:\n\nmedioambiental del reciclaje\nreuso\n\nsocial\nparticipacion \n\ndisenar de manera colectiva y abierta. \n\n* openstructures\n\n** disenar con una pauta en comun\n** disenar metasistemas:\n** contienen y organizan la diversidad\n\n\n....\n\n2. definir las dinamicas\n\n * desarrolalr diferentes proyectos o miniproyectos que haya en diferentes colectivos,.\n * la creatividad en sinergias. caso habana . poder explircar como se va articulando. \n * poder comunica, comunicar, sistematizar. \n * modulos,. como hacer maquinas de forma modular, y para que:\n\n la suma de trabajar en colectivo que la suma de las partes\n\n \n\n","title":"La maquina intersticial","modified":"20230929114501419","tags":"Talleres"}, {"created":"20230928192759382","text":"Propuestas:\n\n* Como disenar de forma modular para reciclar, reusar y reparar.\n\n* Como fabricar filamento 3D a partir de botellas de plástico reciclado.\n\n* Como construir cosas creando intersticialidad participativa entre diferentes redes.\n\nLa conversión de residuos plásticos en filamentos para impresoras 3D.\n\nComenzaremos por establecer la conexión entre la red mundial de recicladores de código abierto Precious Plastic, la red de openstructures de fabricación a base de una retícula modular de diseño común y la red Reprap de construcción de máquinas autorreplicables de código abierto. A través de la comprensión de estas relaciones colaborativas, desarrollaremos sistemas sinérgicos que permitan a los participantes reflexionar sobre la construcción de comunidades más resilientes. donde se promueve el reuso de componentes y materiales. y tambien que las maquinas puedan ser construidas con l mayor variedad de procesos disponibles localmente y sin mucha complejid de formas en sus partes para ue cualquiera pueda reproducir estas partes por mas cantidad de procesos.\n\nDurante estos cursos, abordaremos temáticas fundamentales:\n\n* La clasificación de los plásticos y su importancia en el proceso de reciclaje local\n\n* El proceso de transformar estos residuos plásticos en filamentos aptos para ser utilizados en impresoras 3D.\n\n* El diseno modular usando la reticula de openstructures y su importancia para la reutilizacion de componentes y la creacion de dinamicas aprticipativas.\n\n* El diseno 3D y la creación de modelos paramétricos, utilizando software de codigo abierto. donde Los participantes aprenderán a modelar piezas y objetos que se adaptarán a las necesidades específicas de cada proyecto. Fomentando la creatividad y la personalización. \n\n\ntodo esto es la practica que tengo,. que se enfoca ahora po busca en lo instersticial. o se cohesiona como practica hlistica. \n\n\nLas técnicas fabricacion digital asociados\n\nAbordaremos esto revisando la construcción diy de extrusores de filamentos de impresion 3D y , desde la búsqueda de relaciones intersticiales entre distintas redes, los participantes aprenderán a construir estos extrusores a través de un enfoque DIY (Do It Yourself) y DIWO (Do It With Others). Se fomentará el reuso de las partes diseñadas, promoviendo así el valor de la economía circular y el aprovechamiento de recursos.\n\nEn resumen, los cursos de formación que ofrecemos proporcionarán a los participantes las habilidades y conocimientos necesarios para la construcción y utilización de impresoras 3D que funcionen gracias a filamentos obtenidos a partir de plástico reciclado. Trabajaremos de forma colaborativa, aprovechando las ventajas del código abierto, el diseño modular y la autorreplicación de máquinas para crear comunidades más resilientes.","tags":"","title":"La maquina intersticial 1","modified":"20230929113431266"}, {"created":"20230928052135645","text":"","tags":"","title":"New Tiddler","modified":"20230928052139390"}, +{"created":"20230929180802098","text":"","tags":"","title":"New Tiddler 1","modified":"20230929180804673"}, {"created":"20230928082455352","text":"\u003Cdiv class=\"tc-table-of-contents\">\n\n\u003C\u003Ctoc-selective-expandable 'Notas'>>\n\n\u003C/div>","tags":"$:/tags/SideBar","title":"Notas","modified":"20230928082835695"}, {"created":"20230928081511282","text":"","title":"Precious-plastic-la-habana","modified":"20230928081512450","tags":"Proyectos"}, {"created":"20230928050341828","text":"$:/core/ui/ViewTemplate/","title":"quitar elementos de tiddler","modified":"20230928050343529"}, diff --git a/1--conocer/wiki/index.html b/1--conocer/wiki/index.html index a7dbc30..964007a 100644 --- a/1--conocer/wiki/index.html +++ b/1--conocer/wiki/index.html @@ -197,8 +197,6 @@ Error message and password prompt
  • $:/plugins/felixhayashi/topstoryview
  • -
  • $:/plugins/sq/streams-as-editor
  • -
  • $:/plugins/tiddlywiki/menubar
  • $:/plugins/tiddlywiki/menubar/items/about
  • @@ -452,7 +450,6 @@ Error message and password prompt {"created":"20230927220926364","text":"alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #ffffff\nbackground: #ffffff\nblockquote-bar: \u003C\u003Ccolour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: \u003C\u003Ccolour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: \u003C\u003Ccolour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: \u003C\u003Ccolour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: \u003C\u003Ccolour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: \u003C\u003Ccolour background>>\ndragger-background: \u003C\u003Ccolour foreground>>\ndragger-foreground: \u003C\u003Ccolour background>>\ndropdown-background: #000000\ndropdown-border: #000000\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #4e4e4e\nhighlight-background: #ffff00\nhighlight-foreground: #000000\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: #000000\nmodal-background: #000000\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #000000\nnetwork-activity-foreground: #448844\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f5f2e9\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background: \nselection-foreground: \nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: \u003C\u003Ccolour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: \u003C\u003Ccolour tab-border-selected>>\nsidebar-tab-border: \u003C\u003Ccolour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: \u003C\u003Ccolour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: \u003C\u003Ccolour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: \u003C\u003Ccolour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: #f5f2e9\ntiddler-border: #f5f2e9\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #4e4e4e\ntiddler-editor-background: #f5f2e9\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #888888\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: \u003C\u003Ccolour background>>\ntiddler-link-foreground: \u003C\u003Ccolour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #2b2b2b\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: \u003C\u003Ccolour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000","title":"$:/palettes/copincha","name":"Copincha","description":"Paleta de Copincha","tags":"$:/tags/Palette","type":"application/x-tiddler-dictionary","color-scheme":"light","modified":"20230928055527395"}, {"text":"{\n \"tiddlers\": {\n \"$:/plugins/felixhayashi/respawn/respawn.js\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/respawn.js\",\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/respawn/respawn.js\\ntype: application/javascript\\nmodule-type: startup\\n\\n@preserve\\n\\n\\\\*/\\n\\n(function(){\\n \\n /*jslint node: true, browser: true */\\n /*global $tw: false */\\n \\\"use strict\\\";\\n \\n var configTRef = \\\"$:/plugins/felixhayashi/respawn/config\\\";\\n \\n var changeListener = function(changedTiddlers) {\\n \\n if(!changedTiddlers[\\\"$:/StoryList\\\"]) return;\\n \\n var tObj = $tw.wiki.getTiddler(\\\"$:/StoryList\\\");\\n if(tObj && !tObj.fields[\\\"list\\\"].length) {\\n \\n var confTObj = $tw.wiki.getTiddler(configTRef);\\n var config = confTObj ? confTObj.fields : {};\\n \\n window.setTimeout(function() {\\n $tw.rootWidget.dispatchEvent({\\n type: \\\"tm-home\\\"\\n });\\n }, parseInt(config.delay) || 500);\\n }\\n \\n };\\n \\n exports.name = \\\"respawn\\\";\\n exports.platforms = [\\\"browser\\\"];\\n exports.after = [\\\"story\\\"];\\n exports.synchronous = true;\\n \\n exports.startup = function() {\\n \\n $tw.wiki.addEventListener(\\\"change\\\", changeListener);\\n \\n };\\n\\n})();\\n\",\n \"type\": \"application/javascript\",\n \"module-type\": \"startup\"\n },\n \"$:/plugins/felixhayashi/respawn/Configuration\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/Configuration\",\n \"text\": \"\u003C!-- The config output is not written to this tiddler! -->\\n\\nPlease see the [[GitHub page|https://github.com/felixhayashi/TW5-Respawn]] for more information on the options.\\n\\nYou may have to save and reload the wiki to activate changes.\\n\\n\u003Ctable>\\n \u003Ctr>\\n \u003Cth align=\\\"left\\\">Delay (seconds):\u003C/th>\\n \u003Ctd>\\n \u003C$edit-text\\n tiddler=\\\"$:/plugins/felixhayashi/respawn/config\\\"\\n field=\\\"delay\\\"\\n tag=\\\"input\\\"\\n default=\\\"500\\\" />\\n \u003C/td>\\n \u003C/tr>\\n\u003C/table>\"\n },\n \"$:/plugins/felixhayashi/respawn/License\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/License\",\n \"text\": \"This code is released under the BSD license. For the exact terms visit:\\n\\nhttps://github.com/felixhayashi/TW5-Respawn/blob/master/LICENSE\"\n },\n \"$:/plugins/felixhayashi/respawn/Readme\": {\n \"title\": \"$:/plugins/felixhayashi/respawn/Readme\",\n \"text\": \"Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-Respawn]] for more information.\"\n }\n }\n}","version":"0.0.3","type":"application/json","title":"$:/plugins/felixhayashi/respawn","source":"https://github.com/felixhayashi/TW5-respawn","released":"","plugin-type":"plugin","list":"Configuration License Readme","description":"Respawn – Open default tiddlers when river is empty","dependents":"","core-version":">=5.1.5","author":"Felix Küppers"}, {"text":"{\n \"tiddlers\": {\n \"$:/plugins/felixhayashi/topstoryview/config.js\": {\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/felixhayashi/topstoryview/config.js\\ntype: application/javascript\\nmodule-type: library\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";exports.config={classNames:{storyRiver:\\\"tc-story-river\\\",backDrop:\\\"story-backdrop\\\",tiddlerFrame:\\\"tc-tiddler-frame\\\",tiddlerTitle:\\\"tc-title\\\"},references:{userConfig:\\\"$:/config/topStoryView\\\",focussedTiddlerStore:\\\"$:/temp/focussedTiddler\\\",refreshTrigger:\\\"$:/temp/focussedTiddler/refresh\\\"},checkbackTime:$tw.utils.getAnimationDuration()}})();\",\n \"title\": \"$:/plugins/felixhayashi/topstoryview/config.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"library\"\n },\n \"$:/plugins/felixhayashi/topstoryview/layout\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/layout\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"tags\": [\n \"$:/tags/Stylesheet\"\n ],\n \"text\": \"html .tc-story-river:after {\\n content: \\\"\\\";\\n display: block; }\\n\"\n },\n \"$:/plugins/felixhayashi/topstoryview/Configuration\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/Configuration\",\n \"text\": \"Please see the [[GitHub page|https://github.com/felixhayashi/TW5-TopStoryView]] for more information on the options.\\n\\nSave and reload the wiki to activate changes.\\n\\n\u003Ctable>\\n \u003Ctr>\\n \u003Cth align=\\\"left\\\">Scroll offset:\u003C/th>\\n \u003Ctd>\u003C$edit-text tiddler=\\\"$:/config/topStoryView\\\" field=\\\"scroll-offset\\\" tag=\\\"input\\\" default=\\\"150px\\\" />\u003C/td>\\n \u003C/tr>\\n\u003C/table>\"\n },\n \"$:/plugins/felixhayashi/topstoryview/License\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/License\",\n \"text\": \"This code is released under the BSD license. For the exact terms visit:\\n\\nhttps://github.com/felixhayashi/TW5-TopStoryView/blob/master/LICENSE\"\n },\n \"$:/plugins/felixhayashi/topstoryview/Readme\": {\n \"title\": \"$:/plugins/felixhayashi/topstoryview/Readme\",\n \"text\": \"Please visit the [[GitHub page|https://github.com/felixhayashi/TW5-TopStoryView]] for more information.\"\n },\n \"$:/plugins/felixhayashi/topstoryview/top.js\": {\n \"text\": \"/*\\\\\\ntitle: $:/plugins/felixhayashi/topstoryview/top.js\\ntype: application/javascript\\nmodule-type: storyview\\n\\nViews the story as a linear sequence\\n\\n@preserve\\n\\n\\\\*/\\n(function(){\\\"use strict\\\";var t=require(\\\"$:/plugins/felixhayashi/topstoryview/config.js\\\").config;var e=\\\"cubic-bezier(0.645, 0.045, 0.355, 1)\\\";var i=function(e){this.listWidget=e;this.pageScroller=new $tw.utils.PageScroller;this.pageScroller.scrollIntoView=this.scrollIntoView;this.pageScroller.storyRiverDomNode=document.getElementsByClassName(t.classNames.storyRiver)[0];var i=$tw.wiki.getTiddler(t.references.userConfig);var o=i?i.fields:{};$tw.hooks.addHook(\\\"th-opening-default-tiddlers-list\\\",this.hookOpenDefaultTiddlers);var r=parseInt(o[\\\"scroll-offset\\\"]);this.pageScroller.scrollOffset=isNaN(r)?71:r;this.recalculateBottomSpace()};i.prototype.refreshStart=function(t,e){};i.prototype.refreshEnd=function(t,e){};i.prototype.hookOpenDefaultTiddlers=function(t){return t};i.prototype.navigateTo=function(t){var e=this.listWidget.findListItem(0,t.title);if(e===undefined)return;var i=this.listWidget.children[e];var o=i.findFirstDomNode();if(!(o instanceof Element))return;this.pageScroller.scrollIntoView(o)};i.prototype.insert=function(t){if(!t)return;var e=t.findFirstDomNode();if(!(e instanceof Element))return;this.startInsertAnimation(e,function(){this.recalculateBottomSpace()}.bind(this))};i.prototype.remove=function(t){if(!t)return;var e=t.findFirstDomNode();if(!(e instanceof Element)){t.removeChildDomNodes();return}var i=this.getLastFrame()===e;this.startRemoveAnimation(t,e,function(){t.removeChildDomNodes();this.recalculateBottomSpace();if(i){this.pageScroller.scrollIntoView(this.getLastFrame())}}.bind(this))};i.prototype.getLastFrame=function(){var t=this.listWidget.children[this.listWidget.children.length-1];return t?t.findFirstDomNode():null};i.prototype.recalculateBottomSpace=function(){var t=this.pageScroller.storyRiverDomNode;if(this.getLastFrame()){var e=this.getLastFrame().getBoundingClientRect();var i=window.innerHeight;if(e.height\u003Ci){t.style[\\\"paddingBottom\\\"]=i-e.height+\\\"px\\\";return}}t.style[\\\"paddingBottom\\\"]=\\\"\\\"};i.prototype.scrollIntoView=function(t){if(this.preventNextScrollAttempt){this.preventNextScrollAttempt=false}if(!t)return;var e=$tw.utils.getAnimationDuration();this.cancelScroll();this.startTime=Date.now();var i=$tw.utils.getScrollPosition();var o=t.getBoundingClientRect(),r={left:o.left+i.x,top:o.top+i.y,width:o.width,height:o.height};var n=function(t,e,i,o){if(t\u003C=i){return t}else if(e\u003Co&&i\u003Ct+e-o){return t+e-o}else if(i\u003Ct){return t}else{return i}},s=n(r.left,r.width,i.x,window.innerWidth),a=r.top-this.scrollOffset;if(s!==i.x||a!==i.y){var l=this,c;c=function(){var t;if(e\u003C=0){t=1}else{t=(Date.now()-l.startTime)/e}if(t>=1){l.cancelScroll();t=1}t=$tw.utils.slowInSlowOut(t);window.scrollTo(i.x+(s-i.x)*t,i.y+(a-i.y)*t);if(t\u003C1){l.idRequestFrame=l.requestAnimationFrame.call(window,c)}};c()}};i.prototype.startInsertAnimation=function(t,i){var o=$tw.utils.getAnimationDuration();var r=window.getComputedStyle(t),n=parseInt(r.marginBottom,10),s=parseInt(r.marginTop,10),a=t.offsetHeight+s;setTimeout(function(){$tw.utils.setStyle(t,[{transition:\\\"none\\\"},{marginBottom:\\\"\\\"}]);i()},o);$tw.utils.setStyle(t,[{transition:\\\"none\\\"},{marginBottom:-a+\\\"px\\\"},{opacity:\\\"0.0\\\"}]);$tw.utils.forceLayout(t);$tw.utils.setStyle(t,[{transition:\\\"opacity \\\"+o+\\\"ms \\\"+e+\\\", \\\"+\\\"margin-bottom \\\"+o+\\\"ms \\\"+e},{marginBottom:n+\\\"px\\\"},{opacity:\\\"1.0\\\"}])};i.prototype.startRemoveAnimation=function(t,i,o){var r=$tw.utils.getAnimationDuration();var n=i.offsetWidth,s=window.getComputedStyle(i),a=parseInt(s.marginBottom,10),l=parseInt(s.marginTop,10),c=i.offsetHeight+l;setTimeout(o,r);$tw.utils.setStyle(i,[{transition:\\\"none\\\"},{transform:\\\"translateX(0px)\\\"},{marginBottom:a+\\\"px\\\"},{opacity:\\\"1.0\\\"}]);$tw.utils.forceLayout(i);$tw.utils.setStyle(i,[{transition:$tw.utils.roundTripPropertyName(\\\"transform\\\")+\\\" \\\"+r+\\\"ms \\\"+e+\\\", \\\"+\\\"opacity \\\"+r+\\\"ms \\\"+e+\\\", \\\"+\\\"margin-bottom \\\"+r+\\\"ms \\\"+e},{transform:\\\"translateX(-\\\"+n+\\\"px)\\\"},{marginBottom:-c+\\\"px\\\"},{opacity:\\\"0.0\\\"}])};exports.top=i})();\",\n \"title\": \"$:/plugins/felixhayashi/topstoryview/top.js\",\n \"type\": \"application/javascript\",\n \"module-type\": \"storyview\"\n }\n }\n}","version":"0.2.0","type":"application/json","title":"$:/plugins/felixhayashi/topstoryview","source":"https://github.com/felixhayashi/TW5-TopStoryView","released":"","plugin-type":"plugin","list":"Configuration License Readme","description":"TopStoryView – Always scroll navigated tiddlers to the top","dependents":"","core-version":">=5.1.5","author":"Felix Küppers"}, -{"text":"{\n \"tiddlers\": {\n \"$:/plugins/sq/streams-as-editor/single-tiddler-streams.js\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/single-tiddler-streams.js\",\n \"text\": \"/*\\\\\\n\\ntitle: $:/plugins/sq/streams-as-editor/single-tiddler-streams.js\\ntype: application/javascript\\nmodule-type: widget\\n\\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 UUID = (function() {\\n var self = {};\\n var lut = []; for (var i=0; i\u003C256; i++) { lut[i] = (i\u003C16?'0':'')+(i).toString(16); }\\n self.generate = function() {\\n\\tvar d0 = Math.random()*0xffffffff|0;\\n\\tvar d1 = Math.random()*0xffffffff|0;\\n\\tvar d2 = Math.random()*0xffffffff|0;\\n\\tvar d3 = Math.random()*0xffffffff|0;\\n\\treturn lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+\\n\\t lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+\\n\\t lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+\\n\\t lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];\\n }\\n return self;\\n})();\\n\\nvar SingleTiddlerStreamsWidget = function(parseTreeNode,options) {\\n\\tthis.initialise(parseTreeNode,options);\\n};\\n\\n/*\\nInherit from the base widget class\\n*/\\nSingleTiddlerStreamsWidget.prototype = new Widget();\\n\\n/*\\nRender this widget into the DOM\\n*/\\nSingleTiddlerStreamsWidget.prototype.render = function(parent,nextSibling) {\\n\\tthis.computeAttributes();\\n\\tthis.execute();\\n\\tthis.parentDomNode = parent;\\n\\t//this.renderChildren(parent,nextSibling);\\n\\n\\t\\n};\\n\\nSingleTiddlerStreamsWidget.prototype.invokeAction = function(triggeringWidget,event) {\\n\\tvar sourceTiddler = this.wiki.getTiddler(this.tiddlerTitle);\\n\\tif(!sourceTiddler) {\\n\\t\\treturn;\\n\\t}\\n\\tvar sourceText = \\\"\\\\n\\\\\\\\rules only list \\\\n\\\\n\\\" + this.wiki.getTiddlerText(this.tiddlerTitle);\\n\\tvar wikifyParser = this.wiki.parseText(\\\"text/vnd.tiddlywiki\\\",sourceText, {\\n\\t\\tparseAsInline : false\\n\\t});\\n\\tconsole.log(wikifyParser);\\n\\t\\n\\tvar tree = wikifyParser.tree;\\n\\tif(tree.length == 0 || tree[0].tag !== \\\"ul\\\" || tree.length !== 1) {\\n\\t\\treturn;\\n\\t}\\n\\tvar list = tree[0];\\n\\t\\n\\tthis.nodes = [];\\n\\tvar parentTiddlerFields = {\\n\\t\\ttitle: this.tiddlerTitle\\n\\t}\\n\\tthis.nodes.push(parentTiddlerFields);\\n\\tthis.processList(list,parentTiddlerFields);\\n\\tconsole.log(1);\\n\\t\\n\\tthis.createNodeTiddlers();\\n\\treturn true;\\n};\\n\\nSingleTiddlerStreamsWidget.prototype.createNodeTiddlers = function() {\\n\\tfor(var i=0; i\u003Cthis.nodes.length; i++) {\\n\\t\\tvar tiddler = this.wiki.getTiddler(this.nodes[i].title);\\n\\t\\tvar newTiddler = new $tw.Tiddler(tiddler,this.nodes[i]);\\n\\t\\tthis.wiki.addTiddler(newTiddler);\\n\\t}\\n};\\n\\n// process UL tag\\nSingleTiddlerStreamsWidget.prototype.processList = function(list,parentTiddler) {\\t\\t\\n\\tvar childNodes = [];\\n\\t\\t\\n\\tfor(var i=0; i\u003Clist.children.length; i++) {\\n\\n\\t\\tvar tiddler = {\\n\\t\\t\\t\\\"title\\\": \\\"$:/streams/temp/\\\" + this.tiddlerTitle + \\\"/\\\" + UUID.generate(),\\n\\t\\t\\t\\\"parent\\\": parentTiddler.title,\\n\\t\\t\\t\\\"text\\\": list.children[i].children[0].text,\\n\\t\\t\\t\\\"stream-type\\\" : \\\"default\\\"\\n\\t\\t};\\t\\t\\n\\t\\t\\n\\t\\tvar subList = list.children[i].children[1];\\n\\t\\tif(subList && subList.tag === \\\"ul\\\") {\\n\\t\\t\\tthis.processList(subList,tiddler);\\n\\t\\t}\\n\\t\\t\\n\\t\\tchildNodes.push(tiddler.title);\\n\\t\\tthis.nodes.push(tiddler);\\n\\t\\t// add tiddler to wiki\\n\\t}\\n\\tparentTiddler[\\\"stream-list\\\"] = $tw.utils.stringifyList(childNodes);\\n\\t//save child nodes to stream-list in parent\\n}\\n\\n\\nSingleTiddlerStreamsWidget.prototype.execute = function() {\\n\\tthis.tiddlerTitle = this.getAttribute(\\\"$tiddler\\\",this.getVariable(\\\"currentTiddler\\\"));\\n//\\tthis.makeChildWidgets();\\n};\\n\\n\\nSingleTiddlerStreamsWidget.prototype.refresh = function(changedTiddlers) {\\n\\tvar changedAttributes = this.computeAttributes();\\n\\tif(changedAttributes[\\\"tiddler\\\"] || changedTiddlers[this.tiddlerTitle]) {\\n\\t\\tthis.refreshSelf();\\n\\t\\treturn true;\\n\\t}\\n\\treturn this.refreshChildren(changedTiddlers);\\n};\\n\\nexports[\\\"action-editwithstreams\\\"] = SingleTiddlerStreamsWidget;\\n\\n})();\",\n \"type\": \"application/javascript\",\n \"module-type\": \"widget\"\n },\n \"$:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\",\n \"text\": \"/*\\\\\\ntitle: $:/plugins/sq/streams-as-editor/stream-to-wikilist-filter.js\\ntype: application/javascript\\nmodule-type: filteroperator\\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[\\\"stream-to-wikilist\\\"] = function(source,operator,options) {\\n\\tvar results = [];\\n\\tsource(function(tiddler,title) {\\n\\t\\tif(tiddler && tiddler.fields[\\\"stream-list\\\"]) {\\t\\t\\t\\n\\t\\t\\tvar wikilist = \\\"\\\";\\n\\t\\t\\t\\n\\t\\t\\tfunction processNode(node,prefix) {\\t\\t\\t\\t\\n\\t\\t\\t\\tvar streamList = $tw.utils.parseStringArray(node.getFieldString(\\\"stream-list\\\"));\\n\\t\\t\\t\\tfor(var i=0; i\u003CstreamList.length; i++) {\\n\\t\\t\\t\\t\\tvar n = $tw.wiki.getTiddler(streamList[i]);\\n\\t\\t\\t\\t\\tvar line = prefix + \\\" \\\" + $tw.wiki.getTiddlerText(streamList[i],\\\"\\\") + \\\"\\\\n\\\";\\n\\t\\t\\t\\t\\twikilist += line;\\n\\t\\t\\t\\t\\tif(n && n.fields[\\\"stream-list\\\"] != undefined) {\\n\\t\\t\\t\\t\\t\\tprocessNode(n,prefix + \\\"*\\\");\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\t\\n\\t\\t\\tprocessNode(tiddler,\\\"*\\\");\\n\\t\\t\\tresults.push(wikilist);\\n\\t\\t}\\n\\t});\\n\\treturn results;\\n};\\n\\n})();\",\n \"type\": \"application/javascript\",\n \"module-type\": \"filteroperator\"\n },\n \"$:/plugins/sq/streams-as-editor/viewtemplate\": {\n \"title\": \"$:/plugins/sq/streams-as-editor/viewtemplate\",\n \"created\": \"20200816211512617\",\n \"modified\": \"20200817155923474\",\n \"tags\": \"$:/tags/ViewTemplate\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\\\\define delete-children()\\n\\t\u003C$list filter=\\\"[enlist{!!stream-list}]\\\">\\n\\t\\t\u003C\u003Cdelete-children>>\\n\\t\u003C/$list>\\n\\t\u003C$action-deletetiddler $filter=\\\"[enlist{!!stream-list}]\\\"/>\\n\\\\end\\n\\n\u003C$list filter=\\\"\\\"\\\"[\u003Cfolded-state>get[text]!is[blank]else[show]!match[hide]]\\\"\\\"\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-type]!is[blank]else[default]match[singletiddler]]\\\" variable=\\\"_NULL\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-status]!is[blank]else[default]!match[active]]\\\" variable=\\\"_NULL\\\">\\n\u003C$button> edit with Streams\\n\u003C$action-editwithstreams $tiddler=\u003C\u003CcurrentTiddler>>/>\\n\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> hide-body=\\\"yes\\\" stream-status=\\\"active\\\"/>\\n\u003C/$button>\\n\u003C/$list>\\n\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>get[stream-status]match[active]]\\\" variable=\\\"_NULL\\\">\\n{{||$:/plugins/sq/streams/nodes-list-template}}\\n\u003C$button> save\\n\u003C$action-setfield $tiddler=\u003C\u003CcurrentTiddler>> text={{{[\u003CcurrentTiddler>stream-to-wikilist[]]}}} />\\n\u003C\u003Cdelete-children>>\\n\u003C$action-deletefield $tiddler=\u003C\u003CcurrentTiddler>> hide-body=\\\"no\\\" stream-list=\\\"\\\" stream-status=\\\"\\\"/>\\n\u003C/$button>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$list>\"\n }\n }\n}","version":"0.0.01","type":"application/json","title":"$:/plugins/sq/streams-as-editor","source":"","revision":"0","plugin-type":"plugin","list":"","description":"Streams Editor for Lists","dependents":"","core-version":">=5.1.22","bag":"default","author":"Saq Imtiaz"}, {"title":"$:/plugins/tiddlywiki/menubar","name":"Menu Bar","description":"Menu Bar","list":"readme config","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/config/DefaultColourMappings/menubar-foreground\":{\"title\":\"$:/config/DefaultColourMappings/menubar-foreground\",\"text\":\"#fff\"},\"$:/config/DefaultColourMappings/menubar-background\":{\"title\":\"$:/config/DefaultColourMappings/menubar-background\",\"text\":\"#5778d8\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/pagecontrols\",\"text\":\"hide\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/server\",\"text\":\"hide\"},\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar\":{\"title\":\"$:/config/plugins/menubar/MenuItems/Visibility/$:/plugins/tiddlywiki/menubar/items/sidebar\",\"text\":\"hide\"},\"$:/config/plugins/menubar/TableOfContents/Tag\":{\"title\":\"$:/config/plugins/menubar/TableOfContents/Tag\",\"text\":\"TableOfContents\"},\"$:/config/plugins/menubar/breakpoint\":{\"title\":\"$:/config/plugins/menubar/breakpoint\",\"text\":\"620px\"},\"$:/plugins/tiddlywiki/menubar/config\":{\"title\":\"$:/plugins/tiddlywiki/menubar/config\",\"tags\":\"$:/tags/ControlPanel/Toolbars\",\"caption\":\"Menu Bar\",\"text\":\"\\\\define config-base() $:/config/plugins/menubar/MenuItems/Visibility/\\n\\n! Menu Bar Configuration\\n\\n!! Menu Items\\n\\nSelect which menu items will be shown. You can also drag items to reorder them.\\n\\n\u003C$set name=\\\"tv-config-toolbar-icons\\\" value=\\\"yes\\\">\\n\\n\u003C$set name=\\\"tv-config-toolbar-text\\\" value=\\\"yes\\\">\\n\\n\u003C$macrocall $name=\\\"list-tagged-draggable\\\" tag=\\\"$:/tags/MenuBar\\\" itemTemplate=\\\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\\\"/>\\n\\n\u003C/$set>\\n\\n\u003C/$set>\\n\\n!! Breakpoint Position\\n\\nThe breakpoint position between narrow and wide screens. Should include CSS units (eg. `400px`).\\n\\n\u003C$edit-text tiddler=\\\"$:/config/plugins/menubar/breakpoint\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\n!! Contents Tag\\n\\nThe tag for the ~TableOfContents used in the Contents dropdown\\n\\n\u003C$edit-text tiddler=\\\"$:/config/plugins/menubar/TableOfContents/Tag\\\" default=\\\"\\\" tag=\\\"input\\\"/>\\n\\n!! Menu Bar Colours\\n\\nTo change the colour of the menu bar, define the colours `menubar-foreground` and `menubar-background` in the currently selected palette\\n\"},\"$:/plugins/tiddlywiki/menubar/items/contents\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/contents\",\"caption\":\"Contents\",\"description\":\"Table of Contents\",\"is-dropdown\":\"yes\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\u003Cdiv class=\\\"tc-table-of-contents\\\">\\n\\n\u003C$macrocall $name=\\\"toc-selective-expandable\\\" tag={{$:/config/plugins/menubar/TableOfContents/Tag}}/>\\n\\n\u003C/div>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/hamburger\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/hamburger\",\"tags\":\"$:/tags/MenuBar\",\"caption\":\"Hamburger\",\"description\":\"Show the full menu bar on a narrow screen\",\"custom-menu-content\":\"{{$:/plugins/tiddlywiki/menubar/items/hamburger}}\",\"show-when\":\"narrow\",\"text\":\"\u003C$list filter=\\\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[no]]\\\">\\n\u003C$button set=\\\"$:/state/popup/menubar/hamburger\\\" setTo=\\\"yes\\\">\\n{{$:/core/images/menu-button}}\\n\u003C/$button>\\n\u003C/$list>\\n\u003C$list filter=\\\"[[$:/state/popup/menubar/hamburger]get[text]else[no]match[yes]]\\\">\\n\u003C$button set=\\\"$:/state/popup/menubar/hamburger\\\" setTo=\\\"no\\\">\\n{{$:/core/images/close-button}}\\n\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Page controls from the sidebar\",\"caption\":\"Page controls\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/pagecontrols\\\" mode=\\\"inline\\\"/>\",\"text\":\"\\\\whitespace trim\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\u003C$set name=\\\"hidden\\\" value=\u003C\u003Cconfig-title>>>\\n\u003C$list filter=\\\"[\u003Chidden>!text[hide]]\\\" storyview=\\\"pop\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$set>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/search\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/search\",\"custom-menu-content\":\"{{$:/plugins/tiddlywiki/menubar/items/search}}\",\"description\":\"Search\",\"caption\":\"Search\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\\\\define cancel-search-actions()\\n\u003C$set name=\\\"userInput\\\" value={{{ [\u003C__storeTitle__>get[text]] }}}>\\n\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!match\u003CuserInput>]\\\" emptyMessage=\\\"\\\"\\\"\u003C$action-deletetiddler $filter=\\\"[\u003C__storeTitle__>] [\u003C__tiddler__>] [\u003C__selectionStateTitle__>]\\\"/>\\\"\\\"\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003C__tiddler__>> text=\u003C\u003CuserInput>>/>\u003C$action-setfield $tiddler=\u003C\u003C__refreshTitle__>> text=\\\"yes\\\"/>\\n\u003C/$list>\\n\u003C/$set>\\n\\\\end\\n\\n\\\\define input-accept-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\\"\\\"\\\">\u003C$action-navigate $to={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\\n\\n\\\\define input-accept-variant-actions() \u003C$list filter=\\\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\\\" emptyMessage=\\\"\\\"\\\"\u003C$list filter=\\\"[\u003C__tiddler__>get[text]!is[missing]] ~[\u003C__tiddler__>get[text]is[shadow]]\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\\"\\\"\\\">\u003C$list filter=\\\"[\u003C__tiddler__>get[text]minlength[1]]\\\">\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{{ [\u003C__tiddler__>get[text]] }}}/>\u003C/$list>\u003C/$list>\\n\\n\\\\define set-next-input-tab(beforeafter:\\\"after\\\") \u003C$macrocall $name=\\\"change-input-tab\\\" stateTitle=\\\"$:/state/tab/search-results/sidebar\\\" tag=\\\"$:/tags/SearchResults\\\" beforeafter=\\\"$beforeafter$\\\" defaultState={{$:/config/SearchResults/Default}} actions=\\\"\\\"\\\"\u003C$action-setfield $tiddler=\\\"$:/state/search/currentTab\\\" text=\u003C\u003CnextTab>>/>\\\"\\\"\\\"/>\\n\\n\\\\whitespace trim\\n\u003C$vars searchTiddler=\\\"$:/temp/menubarsearch/input\\\" searchListState=\u003C\u003Cqualify \\\"$:/state/search-list/selected-item\\\">>>\\n\u003Cspan style=\\\"margin: 0 0.5em;\\\">\\n\u003C$keyboard key=\\\"((input-tab-right))\\\" actions=\u003C\u003Cset-next-input-tab>>>\\n\u003C$keyboard key=\\\"((input-tab-left))\\\" actions=\u003C\u003Cset-next-input-tab \\\"before\\\">>>\\n\u003Cform class=\\\"tc-form-inline\\\">\\n\u003C$macrocall $name=\\\"keyboard-driven-input\\\" tiddler=\\\"$:/temp/menubarsearch\\\" storeTitle=\u003C\u003CsearchTiddler>> selectionStateTitle=\u003C\u003CsearchListState>> \\n\\t\\trefreshTitle=\\\"$:/temp/menubarsearch/refresh\\\" tag=\\\"input\\\" type=\\\"search\\\" focusPopup=\\\"$:/state/popup/menubar-search-dropdown\\\" \\n\\t\\tclass=\\\"tc-popup-handle tc-menu-show-when-wide\\\" placeholder=\\\"Search...\\\" default=\\\"\\\" cancelPopups=\\\"yes\\\" \\n\\t\\tinputAcceptActions=\u003C\u003Cinput-accept-actions>> inputAcceptVariantActions=\u003C\u003Cinput-accept-variant-actions>> inputCancelActions=\u003C\u003Ccancel-search-actions>> \\n\\t\\tfilterMinLength={{$:/config/Search/MinLength}} configTiddlerFilter=\\\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\\\" />\\n\u003C/form>\\n\u003C/$keyboard>\\n\u003C/$keyboard>\\n\u003C/span>\\n\u003C$reveal tag=\\\"div\\\" class=\\\"tc-block-dropdown-wrapper\\\" state=\\\"$:/state/popup/menubar-search-dropdown\\\" type=\\\"nomatch\\\" text=\\\"\\\" default=\\\"\\\">\\n\\n\u003Cdiv class=\\\"tc-block-dropdown tc-search-drop-down\\\">\\n\\n\u003C$list filter=\\\"[\u003CsearchTiddler>get[text]minlength[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003Cdiv class=\\\"tc-search-results\\\">Type your search terms\u003C/div>\\\"\\\"\\\" variable=\\\"ignore\\\">\\n\\n\u003C$list filter=\\\"[\u003CsearchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\\\" emptyMessage=\\\"\\\"\\\"\u003Cdiv class=\\\"tc-search-results\\\">{{$:/language/Search/Search/TooShort}}\u003C/div>\\\"\\\"\\\" variable=\\\"listItem\\\">\\n\\n\u003C$vars configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} userInput={{{ [\u003CsearchTiddler>get[text]] }}}>\\n\\n{{$:/core/ui/SearchResults}}\\n\\n\u003C/$vars>\\n\\n\u003C/$list>\\n\\n\u003C/$list>\\n\\n\u003C/div>\\n\\n\u003C/$reveal>\\n\\n\u003C/$vars>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/server\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/server\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Server options\",\"caption\":\"Server\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/server\\\" mode=\\\"inline\\\"/>\",\"text\":\"\u003C$list filter=\\\"[[$:/status/IsLoggedIn]get[text]else[no]match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003C$transclude tiddler=\\\"$:/core/ui/Buttons/save-wiki\\\" mode=\\\"inline\\\"/>\\n\u003C/$list>\\n\u003C$list filter=\\\"[[$:/status/IsLoggedIn]get[text]else[no]match[no]]\\\" variable=\\\"ignore\\\">\\n\u003C$button message=\\\"tm-login\\\">\\nLogin\\n\u003C/$button>\\n\u003C/$list>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/sidebar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/sidebar\",\"caption\":\"Sidebar\",\"description\":\"Sidebar\",\"is-dropdown\":\"yes\",\"tags\":\"$:/tags/MenuBar\",\"text\":\"\u003C$scrollable fallthrough=\\\"none\\\" class=\\\"tc-popup-keep tc-menubar-dropdown-sidebar\\\">\\n\\n\u003C$transclude tiddler=\\\"$:/core/ui/SideBarSegments/tabs\\\" mode=\\\"inline\\\"/>\\n\\n\u003C/$scrollable>\\n\"},\"$:/plugins/tiddlywiki/menubar/items/topleftbar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/topleftbar\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Items from $:/tags/TopLeftBar\",\"caption\":\"Legacy Top Left Bar\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/topleftbar\\\" mode=\\\"inline\\\"/>\",\"text\":\"\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\"},\"$:/plugins/tiddlywiki/menubar/items/toprightbar\":{\"title\":\"$:/plugins/tiddlywiki/menubar/items/toprightbar\",\"tags\":\"$:/tags/MenuBar\",\"description\":\"Items from $:/tags/TopRightBar\",\"caption\":\"Legacy Top Right Bar\",\"custom-menu-content\":\"\u003C$transclude tiddler=\\\"$:/plugins/tiddlywiki/menubar/items/toprightbar\\\" mode=\\\"inline\\\"/>\",\"custom-menu-styles-wide\":\"float: right;\",\"text\":\"\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]reverse[]]\\\" variable=\\\"listItem\\\" storyview=\\\"pop\\\">\\n\\n\u003C$transclude tiddler=\u003C\u003ClistItem>> mode=\\\"inline\\\"/>\\n\\n\u003C/$list>\"},\"$:/plugins/tiddlywiki/menubar/menu\":{\"title\":\"$:/plugins/tiddlywiki/menubar/menu\",\"tags\":\"$:/tags/PageTemplate\",\"text\":\"\\\\define menubar-inner(size)\\n\u003Cul class=\\\"tc-menubar-list\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]]\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter=\\\"[[$size$]match[wide]] ~[\u003CcurrentTiddler>get[show-when]match[$size$]] ~[{$:/state/popup/menubar/hamburger}match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003Cli style={{!!custom-menu-styles-$size$}} class={{{ [\u003CcurrentTiddler>get[show-when]addprefix[tc-menubar-]] tc-menubar-item +[join[ ]] }}}>\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>!is-dropdown[yes]]\\\" variable=\\\"listItem\\\" emptyMessage=\\\"\\\"\\\"\\n\\t\u003C!-- Dropdown -->\\n\\t\u003C$set name=\\\"dropdown-state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/topmenu/dropdown/\\\">>>\\n\\t\u003C$set name=\\\"dropdown-state\\\" value={{{ [\u003Cdropdown-state>addsuffix\u003CcurrentTiddler>] }}}>\\n\\t\u003C$button popup=\u003C\u003Cdropdown-state>> selectedClass=\\\"tc-selected\\\">\\n\\t\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\\t\u003C$transclude field=\\\"caption\\\" mode=\\\"inline\\\"/>\\n\\t\u003C$text text=\\\" \\\"/>\\n\\t\u003Cspan class=\\\"tc-menubar-dropdown-arrow\\\">\\n\\t\u003C$transclude tiddler=\\\"$:/core/images/down-arrow\\\" mode=\\\"inline\\\"/>\\n\\t\u003C/span>\\n\\t\u003C/$set>\\n\\t\u003C/$button>\\n\\t\u003C/$set>\\n\\t\u003C/$set>\\n\\\"\\\"\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>has[custom-menu-content]]\\\" variable=\\\"listItem\\\" emptyMessage=\\\"\\\"\\\"\\n\\t\u003C!-- Link -->\\n\\t\u003C$link to={{!!target}}>\\n\\t\u003C$set name=\\\"tv-wikilinks\\\" value=\\\"no\\\">\\n\\t\u003C$transclude field=\\\"caption\\\" mode=\\\"inline\\\"/>\\n\\t\u003C/$set>\\n\\t\u003C/$link>\\n\\\"\\\"\\\">\\n\u003C!-- Custom content -->\\n\u003C$transclude field=\\\"custom-menu-content\\\" mode=\\\"inline\\\"/>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/li>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/ul>\\n\\\\end\\n\\n\u003C$list filter=\\\"[\u003Ctv-config-static>!match[yes]]\\\" variable=\\\"ignore\\\">\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\\\" variable=\\\"listItem\\\">\\n\u003Cnav class=\\\"tc-menubar tc-adjust-top-of-scroll\\\">\\n\u003Cdiv class=\\\"tc-menubar-narrow\\\">\\n\u003C\u003Cmenubar-inner narrow>>\\n\u003C/div>\\n\u003Cdiv class=\\\"tc-menubar-wide\\\">\\n\u003C\u003Cmenubar-inner wide>>\\n\u003C/div>\\n\u003Cdiv style=\\\"clear:both;\\\"/>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/MenuBar]!has[draft.of]is-dropdown[yes]]\\\">\\n\u003C$list filter=\\\"[\u003CcurrentTiddler>addprefix[$:/config/plugins/menubar/MenuItems/Visibility/]get[text]] ~show +[match[show]]\\\" variable=\\\"ignore\\\">\\n\u003C$set name=\\\"dropdown-state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/topmenu/dropdown/\\\">>>\\n\u003C$set name=\\\"dropdown-state\\\" value={{{ [\u003Cdropdown-state>addsuffix\u003CcurrentTiddler>] }}}>\\n\u003C$reveal type=\\\"popup\\\" state=\u003C\u003Cdropdown-state>> position={{{ [\u003CcurrentTiddler>get[dropdown-position]else[below]] }}} class={{{ [\u003CcurrentTiddler>get[class]] }}} tag=\\\"div\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\">\\n\u003C$transclude/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$list>\\n\u003C/nav>\\n\u003C/$list>\\n\u003C/$list>\\n\"},\"$:/core/ui/PageTemplate/topleftbar\":{\"title\":\"$:/core/ui/PageTemplate/topleftbar\",\"text\":\"\u003C!-- The menubar plugin overrides this tiddler to remove the core top left menu. The menu items that it would include are instead included in the menubar -->\"},\"$:/core/ui/PageTemplate/toprightbar\":{\"title\":\"$:/core/ui/PageTemplate/toprightbar\",\"text\":\"\u003C!-- The menubar plugin overrides this tiddler to remove the core top right menu. The menu items that it would include are instead included in the menubar -->\"},\"$:/plugins/tiddlywiki/menubar/readme\":{\"title\":\"$:/plugins/tiddlywiki/menubar/readme\",\"text\":\"!! Introduction\\n\\nThis plugin provides a menu bar with the following features:\\n\\n* Menu items take the form of simple text links, dropdowns, or entirely custom content\\n* Menu items can be individually enabled via the control panel\\n* Responds to reduced screen width by abbreviating the menu items to a \\\"hamburger\\\" dropdown\\n\\n!! Menu Item Tiddlers\\n\\nMenu items are tagged \u003C\u003Ctag $:/tags/MenuBar>>. The following fields are used by this plugin:\\n\\n|!Field Name |!Purpose |\\n|title |Each menu item must have a unique title (not shown to the user) |\\n|description |Description for use in listings |\\n|tags |Must contain `$:/tags/MenuBar` |\\n|caption |The text that is displayed for the menu item. Avoid links, using `~` to suppress CamelCase links if required |\\n|target |For simple link menu items specifies a tiddler title as the target of the link |\\n|is-dropdown |Set to `yes` to indicate a dropdown menu item |\\n|dropdown-position |Optional position for the dropdown (can be ''left'', ''above'', ''aboveleft'', ''aboveright'', ''right'', ''belowleft'', ''belowright'' or ''below'') |\\n|text |For dropdown menu items, specifies the body of the dropdown |\\n|custom-menu-content |Optional wikitext to be displayed in place of the caption |\\n|custom-menu-styles-wide |Optional string of styles to be applied to menu item when the menubar is wide |\\n|custom-menu-styles-narrow |Optional string of styles to be applied to menu item when the menubar is narrow |\\n\\nCustom menu items should make sure that the clickable link or button is an immediate child, and not wrapped in another element.\\n\\nNote that menu items can be pushed to the right of the menu bar setting the ''custom-menu-styles'' field to `float: right;`.\\n\"},\"$:/plugins/tiddlywiki/menubar/styles\":{\"title\":\"$:/plugins/tiddlywiki/menubar/styles\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define breakpoint-plus-one()\\n\u003C$text text={{{ [{$:/config/plugins/menubar/breakpoint}removesuffix[px]add[1]addsuffix[px]] ~[{$:/config/plugins/menubar/breakpoint}] }}} />\\n\\\\end\\n\\n\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}} />\\n\\\\end\\n\\n\\\\define set-sidebar-scrollable-top-if-hamburger()\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] -$:/plugins/tiddlywiki/menubar/items/hamburger +[limit[1]]\\\">\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tmargin-top: 2em;\\n\\t}\\n\\n\u003C/$list>\\n\\\\end\\n\\n\\\\define set-sidebar-scrollable-top()\\n\u003C$list filter=\\\"[all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[limit[1]]\\\">\\n\\n\\t.tc-sidebar-scrollable {\\n\\t\\tmargin-top: 2em;\\n\\t}\\n\\n\u003C/$list>\\n\u003C$reveal state=\\\"$:/state/popup/menubar/hamburger\\\" type=\\\"match\\\" text=\\\"yes\\\">\\n\\n\\t\u003C$set name=\\\"itemCount\\\" value={{{ [all[tiddlers+shadows]tag[$:/tags/MenuBar]] -[all[tiddlers+shadows]prefix[$:/config/plugins/menubar/MenuItems/Visibility/]regexp:text[hide]removeprefix[$:/config/plugins/menubar/MenuItems/Visibility/]] -[all[tiddlers+shadows]tag[$:/tags/TopLeftBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/topleftbar]] -[all[tiddlers+shadows]tag[$:/tags/TopRightBar]limit[1]then[]else[$:/plugins/tiddlywiki/menubar/items/toprightbar]] +[count[]] }}}>\\n\\n\\t\\t.tc-sidebar-scrollable {\\n\\t\\t\\tmargin-top: calc(\u003C\u003CitemCount>> * 2em);\\n\\t\\t}\\n\\n\\t\u003C/$set>\\n\\n\u003C/$reveal>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\nnav.tc-menubar {\\n\\tposition: fixed;\\n\\tz-index: 850;\\n\\tdisplay: inline-block;\\n\\ttop: 0;\\n\\tright: 0;\\n\\tleft: 0;\\n}\\n\\nnav.tc-menubar ul.tc-menubar-list {\\n\\tposition: relative;\\n\\tlist-style-type: none;\\n\\tmargin: 0;\\n\\tpadding: 0 0 0 42px;\\n\\tbackground: \u003C\u003Ccolour background>>;\\n\\tbackground: \u003C\u003Ccolour menubar-background>>;\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\thtml nav.tc-menubar ul.tc-menubar-list {\\n\\t\\tpadding: 0 0 0 8px;\\n\\t}\\n\\n}\\n\\nnav.tc-menubar li.tc-menubar-item {\\n\\tdisplay: inline-block;\\n\\tmargin: 0;\\n\\tpadding: 0;\\n}\\n\\nnav.tc-menubar .tc-menubar-narrow li.tc-menubar-item {\\n\\tdisplay: block;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a,\\nnav.tc-menubar li.tc-menubar-item > button {\\n\\tdisplay: inline-block;\\n/*\\ttext-transform: uppercase; */\\n\\tline-height: 1;\\n\\tfont-weight: 700;\\n\\tcolor: \u003C\u003Ccolour foreground>>;\\n\\tcolor: \u003C\u003Ccolour menubar-foreground>>;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour menubar-foreground>>;\\n\\ttext-decoration: none;\\n\\tpadding: 0.5em;\\n\\tmargin: 0;\\n\\tbackground: none;\\n\\tborder: none;\\n\\tcursor: pointer;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a.tc-selected,\\nnav.tc-menubar li.tc-menubar-item > button.tc-selected {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item svg {\\n\\ttransition: none;\\n\\twidth: 1em;\\n\\theight: 1em;\\n\\tfill: \u003C\u003Ccolour foreground>>;\\n\\tfill: \u003C\u003Ccolour menubar-foreground>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item .tc-menubar-dropdown-arrow svg {\\n\\twidth: 0.5em;\\n\\theight: 0.5em;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a.tc-selected svg,\\nnav.tc-menubar li.tc-menubar-item > button.tc-selected svg {\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a:hover,\\nnav.tc-menubar li.tc-menubar-item > button:hover svg,\\nnav.tc-menubar li.tc-menubar-item > button:hover {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar li.tc-menubar-item > a:active,\\nnav.tc-menubar li.tc-menubar-item > button:active svg,\\nnav.tc-menubar li.tc-menubar-item > button:active {\\n\\tbackground: \u003C\u003Ccolour foreground>>;\\n\\tbackground: \u003C\u003Ccolour menubar-foreground>>;\\n\\tcolor: \u003C\u003Ccolour background>>;\\n\\tcolor: \u003C\u003Ccolour menubar-background>>;\\n\\tfill: \u003C\u003Ccolour background>>;\\n\\tfill: \u003C\u003Ccolour menubar-background>>;\\n\\tborder-radius: 0;\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar .tc-drop-down,\\nnav.tc-menubar .tc-block-dropdown {\\n\\tmax-width: 70vw;\\n\\tmax-height: 70vh;\\n\\toverflow: auto;\\n}\\n\\nnav.tc-menubar .tc-drop-down a {\\n\\ttext-decoration: none;\\n}\\n\\nnav.tc-menubar .tc-drop-down .tc-table-of-contents button {\\n\\tdisplay: inline-block;\\n\\twidth: auto;\\n}\\n\\nnav.tc-menubar .tc-drop-down ol {\\n\\tmargin: 0;\\n}\\n\\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar a,\\nnav.tc-menubar .tc-drop-down .tc-menubar-dropdown-sidebar button {\\n\\tdisplay: inline;\\n\\twidth: auto;\\n}\\n\\nnav.tc-menubar .tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\tdisplay: block;\\n\\twidth: 100%;\\n}\\n\\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\\n\\n\\t.tc-menubar-wide {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\\n@media (min-width: \u003C\u003Cbreakpoint-plus-one>>) {\\n\\n\\tnav.tc-menubar li.tc-menubar-item.tc-menubar-narrow,\\n\\t.tc-menubar-narrow {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\n\\t\u003C\u003Cset-sidebar-scrollable-top-if-hamburger>>\\n\\n}\\n\\n@media (max-width: {{$:/config/plugins/menubar/breakpoint}}) {\\n\\n\\t\u003C\u003Cset-sidebar-scrollable-top>>\\n\\n}\\n@media print {\\n\\n\\tnav.tc-menubar {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n}\\n\"},\"$:/tags/MenuBar\":{\"title\":\"$:/tags/MenuBar\",\"list\":\"$:/plugins/tiddlywiki/menubar/items/hamburger $:/plugins/tiddlywiki/menubar/items/topleftbar $:/plugins/tiddlywiki/menubar/items/contents $:/plugins/tiddlywiki/menubar/items/search $:/plugins/tiddlywiki/menubar/items/pagecontrols $:/plugins/tiddlywiki/menubar/items/server $:/plugins/tiddlywiki/menubar/items/toprightbar\"}}}"}, {"created":"20230928091243648","text":"\n","title":"$:/plugins/tiddlywiki/menubar/items/about","caption":"About","description":"Table of Proyectos","is-dropdown":"yes","tags":"$:/tags/MenuBar","modified":"20230928091329047"}, {"created":"20230928091359995","text":"\u003Cdiv class=\"tc-table-of-contents\">\n\n\u003C\u003Ctoc-selective-expandable 'Actividades'>>\n\n\u003C/div>\n","title":"$:/plugins/tiddlywiki/menubar/items/actividades","caption":"Actividades","description":"Table of Proyectos","is-dropdown":"yes","tags":"$:/tags/MenuBar","modified":"20230928091829374"}, @@ -507,8 +504,8 @@ Error message and password prompt {"created":"20230928081806500","title":"$:/state/toc/TableOfContents-Proyectos-1684905998","text":"open","modified":"20230928081806500"}, {"created":"20230928082306069","title":"$:/state/toc/TableOfContents-Servicios--944721818","text":"open","modified":"20230928082306069"}, {"created":"20230928082231303","title":"$:/state/toc/TableOfContents-Talleres--944721818","text":"open","modified":"20230928083015283"}, -{"title":"$:/status/RequireReloadDueToPluginChange","text":"no"}, -{"title":"$:/StoryList","text":"","list":"[[New Tiddler 1]] copinchapedia"}, +{"title":"$:/status/RequireReloadDueToPluginChange","text":"yes"}, +{"title":"$:/StoryList","created":"20230929180941714","text":"","list":"copinchapedia","modified":"20230929180952134"}, {"created":"20230928034438840","title":"$:/theme","text":"$:/themes/tiddlywiki/centralised","modified":"20230928062438120"}, {"title":"$:/themes/tiddlywiki/centralised","name":"Centralised","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Centralises the story river","dependents":"$:/themes/tiddlywiki/snowwhite","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/centralised/styles.tid\":{\"title\":\"$:/themes/tiddlywiki/centralised/styles.tid\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\\n\\n\\thtml .tc-page-container {\\n\\t\\ttext-align: center;\\n\\t}\\n\\n\\thtml .tc-story-river {\\n\\t\\tposition: relative;\\n\\t\\twidth: 770px;\\n\\t\\tpadding: 42px;\\n\\t\\tmargin: 0 auto;\\n\\t\\ttext-align: left;\\n\\t}\\n\\n\\thtml .tc-sidebar-scrollable {\\n\\t\\ttext-align: left;\\n\\t\\tleft: 50%;\\n\\t\\tright: 0;\\n\\t\\tmargin-left: 343px;\\n\\t}\\n}\\n\"}}}"}, {"title":"$:/themes/tiddlywiki/snowwhite","name":"Snow White","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Emphasises individual tiddlers","dependents":"$:/themes/tiddlywiki/vanilla","plugin-priority":"0","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/snowwhite/base\":{\"title\":\"$:/themes/tiddlywiki/snowwhite/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n.tc-sidebar-header {\\n\\ttext-shadow: 0 1px 0 \u003C\u003Ccolour sidebar-foreground-shadow>>;\\n}\\n\\n.tc-tiddler-info {\\n\\t\u003C\u003Cbox-shadow \\\"inset 1px 2px 3px rgba(0,0,0,0.1)\\\">>\\n}\\n\\n@media screen {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n\\t}\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow none>>\\n\\t}\\n}\\n\\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\\n\\t\u003C\u003Ctransition \\\"fill 150ms ease-in-out\\\">>\\n}\\n\\n.tc-tiddler-controls button.tc-selected,\\n.tc-page-controls button.tc-selected {\\n\\t\u003C\u003Cfilter \\\"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\\\">>\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-edit-tags {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"none\\\">>\\n\\tborder: none;\\n\\toutline: none;\\n}\\n\\ntextarea.tc-edit-texteditor {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 5px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-drop-down {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-block-dropdown {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-modal {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n}\\n\\n.tc-modal-footer {\\n\\tborder-radius: 0 0 6px 6px;\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 0 #fff\\\">>;\\n}\\n\\n\\n.tc-alert {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.6)\\\">>\\n}\\n\\n.tc-notification {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n\\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\\n}\\n\\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\\n\\tborder-top: none;\\n\\theight: 1px;\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\\\">>\\n}\\n\\n.tc-message-box img {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\\n.tc-plugin-info {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\"}}}"},