{"tiddlers":{"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js","text":"/*\\\ncreated: 20141003161333154\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js\nmodified: 20141003161445164\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// Because sometimes you need to style the cursor's line.\n//\n// Adds an option 'styleActiveLine' which, when enabled, gives the\n// active line's wrapping <div> the CSS class \"CodeMirror-activeline\",\n// and gives its background <div> the class \"CodeMirror-activeline-background\".\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n var WRAP_CLASS = \"CodeMirror-activeline\";\n var BACK_CLASS = \"CodeMirror-activeline-background\";\n\n CodeMirror.defineOption(\"styleActiveLine\", false, function(cm, val, old) {\n var prev = old && old != CodeMirror.Init;\n if (val && !prev) {\n cm.state.activeLines = [];\n updateActiveLines(cm, cm.listSelections());\n cm.on(\"beforeSelectionChange\", selectionChange);\n } else if (!val && prev) {\n cm.off(\"beforeSelectionChange\", selectionChange);\n clearActiveLines(cm);\n delete cm.state.activeLines;\n }\n });\n\n function clearActiveLines(cm) {\n for (var i = 0; i < cm.state.activeLines.length; i++) {\n cm.removeLineClass(cm.state.activeLines[i], \"wrap\", WRAP_CLASS);\n cm.removeLineClass(cm.state.activeLines[i], \"background\", BACK_CLASS);\n }\n }\n\n function sameArray(a, b) {\n if (a.length != b.length) return false;\n for (var i = 0; i < a.length; i++)\n if (a[i] != b[i]) return false;\n return true;\n }\n\n function updateActiveLines(cm, ranges) {\n var active = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) continue;\n var line = cm.getLineHandleVisualStart(range.head.line);\n if (active[active.length - 1] != line) active.push(line);\n }\n if (sameArray(cm.state.activeLines, active)) return;\n cm.operation(function() {\n clearActiveLines(cm);\n for (var i = 0; i < active.length; i++) {\n cm.addLineClass(active[i], \"wrap\", WRAP_CLASS);\n cm.addLineClass(active[i], \"background\", BACK_CLASS);\n }\n cm.state.activeLines = active;\n });\n }\n\n function selectionChange(cm, sel) {\n updateActiveLines(cm, sel.ranges);\n }\n});\n","created":"20141003161333154","modified":"20141003161445164","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js","text":"/*\\\ncreated: 20141003162651180\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js\nmodified: 20141003162818850\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n var indentUnit = config.indentUnit,\n tokenHooks = parserConfig.tokenHooks,\n mediaTypes = parserConfig.mediaTypes || {},\n mediaFeatures = parserConfig.mediaFeatures || {},\n propertyKeywords = parserConfig.propertyKeywords || {},\n nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n colorKeywords = parserConfig.colorKeywords || {},\n valueKeywords = parserConfig.valueKeywords || {},\n fontProperties = parserConfig.fontProperties || {},\n allowNested = parserConfig.allowNested;\n\n var type, override;\n function ret(style, tp) { type = tp; return style; }\n\n // Tokenizers\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (tokenHooks[ch]) {\n var result = tokenHooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == \"@\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"def\", stream.current());\n } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n return ret(null, \"compare\");\n } else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \"#\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"atom\", \"hash\");\n } else if (ch == \"!\") {\n stream.match(/^\\s*\\w*/);\n return ret(\"keyword\", \"important\");\n } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (ch === \"-\") {\n if (/[\\d.]/.test(stream.peek())) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (stream.match(/^\\w+-/)) {\n return ret(\"meta\", \"meta\");\n }\n } else if (/[,+>*\\/]/.test(ch)) {\n return ret(null, \"select-op\");\n } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n return ret(\"qualifier\", \"qualifier\");\n } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n return ret(null, ch);\n } else if (ch == \"u\" && stream.match(\"rl(\")) {\n stream.backUp(1);\n state.tokenize = tokenParenthesized;\n return ret(\"property\", \"word\");\n } else if (/[\\w\\\\\\-]/.test(ch)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"property\", \"word\");\n } else {\n return ret(null, null);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n if (quote == \")\") stream.backUp(1);\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenParenthesized(stream, state) {\n stream.next(); // Must be '('\n if (!stream.match(/\\s*[\\\"\\')]/, false))\n state.tokenize = tokenString(\")\");\n else\n state.tokenize = null;\n return ret(null, \"(\");\n }\n\n // Context management\n\n function Context(type, indent, prev) {\n this.type = type;\n this.indent = indent;\n this.prev = prev;\n }\n\n function pushContext(state, stream, type) {\n state.context = new Context(type, stream.indentation() + indentUnit, state.context);\n return type;\n }\n\n function popContext(state) {\n state.context = state.context.prev;\n return state.context.type;\n }\n\n function pass(type, stream, state) {\n return states[state.context.type](type, stream, state);\n }\n function popAndPass(type, stream, state, n) {\n for (var i = n || 1; i > 0; i--)\n state.context = state.context.prev;\n return pass(type, stream, state);\n }\n\n // Parser\n\n function wordAsValue(stream) {\n var word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"variable\";\n }\n\n var states = {};\n\n states.top = function(type, stream, state) {\n if (type == \"{\") {\n return pushContext(state, stream, \"block\");\n } else if (type == \"}\" && state.context.prev) {\n return popContext(state);\n } else if (type == \"@media\") {\n return pushContext(state, stream, \"media\");\n } else if (type == \"@font-face\") {\n return \"font_face_before\";\n } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {\n return \"keyframes\";\n } else if (type && type.charAt(0) == \"@\") {\n return pushContext(state, stream, \"at\");\n } else if (type == \"hash\") {\n override = \"builtin\";\n } else if (type == \"word\") {\n override = \"tag\";\n } else if (type == \"variable-definition\") {\n return \"maybeprop\";\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n } else if (type == \":\") {\n return \"pseudo\";\n } else if (allowNested && type == \"(\") {\n return pushContext(state, stream, \"parens\");\n }\n return state.context.type;\n };\n\n states.block = function(type, stream, state) {\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (propertyKeywords.hasOwnProperty(word)) {\n override = \"property\";\n return \"maybeprop\";\n } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n override = \"string-2\";\n return \"maybeprop\";\n } else if (allowNested) {\n override = stream.match(/^\\s*:/, false) ? \"property\" : \"tag\";\n return \"block\";\n } else {\n override += \" error\";\n return \"maybeprop\";\n }\n } else if (type == \"meta\") {\n return \"block\";\n } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n override = \"error\";\n return \"block\";\n } else {\n return states.top(type, stream, state);\n }\n };\n\n states.maybeprop = function(type, stream, state) {\n if (type == \":\") return pushContext(state, stream, \"prop\");\n return pass(type, stream, state);\n };\n\n states.prop = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n if (type == \"hash\" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {\n override += \" error\";\n } else if (type == \"word\") {\n wordAsValue(stream);\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n }\n return \"prop\";\n };\n\n states.propBlock = function(type, _stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n return state.context.type;\n };\n\n states.parens = function(type, stream, state) {\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \")\") return popContext(state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n if (type == \"word\") wordAsValue(stream);\n return \"parens\";\n };\n\n states.pseudo = function(type, stream, state) {\n if (type == \"word\") {\n override = \"variable-3\";\n return state.context.type;\n }\n return pass(type, stream, state);\n };\n\n states.media = function(type, stream, state) {\n if (type == \"(\") return pushContext(state, stream, \"media_parens\");\n if (type == \"}\") return popAndPass(type, stream, state);\n if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (word == \"only\" || word == \"not\" || word == \"and\")\n override = \"keyword\";\n else if (mediaTypes.hasOwnProperty(word))\n override = \"attribute\";\n else if (mediaFeatures.hasOwnProperty(word))\n override = \"property\";\n else\n override = \"error\";\n }\n return state.context.type;\n };\n\n states.media_parens = function(type, stream, state) {\n if (type == \")\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n return states.media(type, stream, state);\n };\n\n states.font_face_before = function(type, stream, state) {\n if (type == \"{\")\n return pushContext(state, stream, \"font_face\");\n return pass(type, stream, state);\n };\n\n states.font_face = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") {\n if (!fontProperties.hasOwnProperty(stream.current().toLowerCase()))\n override = \"error\";\n else\n override = \"property\";\n return \"maybeprop\";\n }\n return \"font_face\";\n };\n\n states.keyframes = function(type, stream, state) {\n if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n if (type == \"{\") return pushContext(state, stream, \"top\");\n return pass(type, stream, state);\n };\n\n states.at = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"tag\";\n else if (type == \"hash\") override = \"builtin\";\n return \"at\";\n };\n\n states.interpolation = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n if (type != \"variable\") override = \"error\";\n return \"interpolation\";\n };\n\n return {\n startState: function(base) {\n return {tokenize: null,\n state: \"top\",\n context: new Context(\"top\", base || 0, null)};\n },\n\n token: function(stream, state) {\n if (!state.tokenize && stream.eatSpace()) return null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style && typeof style == \"object\") {\n type = style[1];\n style = style[0];\n }\n override = style;\n state.state = states[state.state](type, stream, state);\n return override;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context, ch = textAfter && textAfter.charAt(0);\n var indent = cx.indent;\n if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n if (cx.prev &&\n (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" || cx.type == \"interpolation\" || cx.type == \"font_face\") ||\n ch == \")\" && (cx.type == \"parens\" || cx.type == \"media_parens\") ||\n ch == \"{\" && (cx.type == \"at\" || cx.type == \"media\"))) {\n indent = cx.indent - indentUnit;\n cx = cx.prev;\n }\n return indent;\n },\n\n electricChars: \"}\",\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n fold: \"brace\"\n };\n});\n\n function keySet(array) {\n var keys = {};\n for (var i = 0; i < array.length; ++i) {\n keys[array[i]] = true;\n }\n return keys;\n }\n\n var mediaTypes_ = [\n \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n \"tty\", \"tv\", \"embossed\"\n ], mediaTypes = keySet(mediaTypes_);\n\n var mediaFeatures_ = [\n \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n \"min-resolution\", \"max-resolution\", \"scan\", \"grid\"\n ], mediaFeatures = keySet(mediaFeatures_);\n\n var propertyKeywords_ = [\n \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n \"alignment-baseline\", \"anchor-point\", \"animation\", \"animation-delay\",\n \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n \"animation-timing-function\", \"appearance\", \"azimuth\", \"backface-visibility\",\n \"background\", \"background-attachment\", \"background-clip\", \"background-color\",\n \"background-image\", \"background-origin\", \"background-position\",\n \"background-repeat\", \"background-size\", \"baseline-shift\", \"binding\",\n \"bleed\", \"bookmark-label\", \"bookmark-level\", \"bookmark-state\",\n \"bookmark-target\", \"border\", \"border-bottom\", \"border-bottom-color\",\n \"border-bottom-left-radius\", \"border-bottom-right-radius\",\n \"border-bottom-style\", \"border-bottom-width\", \"border-collapse\",\n \"border-color\", \"border-image\", \"border-image-outset\",\n \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n \"border-image-width\", \"border-left\", \"border-left-color\",\n \"border-left-style\", \"border-left-width\", \"border-radius\", \"border-right\",\n \"border-right-color\", \"border-right-style\", \"border-right-width\",\n \"border-spacing\", \"border-style\", \"border-top\", \"border-top-color\",\n \"border-top-left-radius\", \"border-top-right-radius\", \"border-top-style\",\n \"border-top-width\", \"border-width\", \"bottom\", \"box-decoration-break\",\n \"box-shadow\", \"box-sizing\", \"break-after\", \"break-before\", \"break-inside\",\n \"caption-side\", \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\",\n \"column-fill\", \"column-gap\", \"column-rule\", \"column-rule-color\",\n \"column-rule-style\", \"column-rule-width\", \"column-span\", \"column-width\",\n \"columns\", \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\",\n \"cue-after\", \"cue-before\", \"cursor\", \"direction\", \"display\",\n \"dominant-baseline\", \"drop-initial-after-adjust\",\n \"drop-initial-after-align\", \"drop-initial-before-adjust\",\n \"drop-initial-before-align\", \"drop-initial-size\", \"drop-initial-value\",\n \"elevation\", \"empty-cells\", \"fit\", \"fit-position\", \"flex\", \"flex-basis\",\n \"flex-direction\", \"flex-flow\", \"flex-grow\", \"flex-shrink\", \"flex-wrap\",\n \"float\", \"float-offset\", \"flow-from\", \"flow-into\", \"font\", \"font-feature-settings\",\n \"font-family\", \"font-kerning\", \"font-language-override\", \"font-size\", \"font-size-adjust\",\n \"font-stretch\", \"font-style\", \"font-synthesis\", \"font-variant\",\n \"font-variant-alternates\", \"font-variant-caps\", \"font-variant-east-asian\",\n \"font-variant-ligatures\", \"font-variant-numeric\", \"font-variant-position\",\n \"font-weight\", \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\",\n \"grid-auto-position\", \"grid-auto-rows\", \"grid-column\", \"grid-column-end\",\n \"grid-column-start\", \"grid-row\", \"grid-row-end\", \"grid-row-start\",\n \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\",\n \"icon\", \"image-orientation\", \"image-rendering\", \"image-resolution\",\n \"inline-box-align\", \"justify-content\", \"left\", \"letter-spacing\",\n \"line-break\", \"line-height\", \"line-stacking\", \"line-stacking-ruby\",\n \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\",\n \"marker-offset\", \"marks\", \"marquee-direction\", \"marquee-loop\",\n \"marquee-play-count\", \"marquee-speed\", \"marquee-style\", \"max-height\",\n \"max-width\", \"min-height\", \"min-width\", \"move-to\", \"nav-down\", \"nav-index\",\n \"nav-left\", \"nav-right\", \"nav-up\", \"object-fit\", \"object-position\",\n \"opacity\", \"order\", \"orphans\", \"outline\",\n \"outline-color\", \"outline-offset\", \"outline-style\", \"outline-width\",\n \"overflow\", \"overflow-style\", \"overflow-wrap\", \"overflow-x\", \"overflow-y\",\n \"padding\", \"padding-bottom\", \"padding-left\", \"padding-right\", \"padding-top\",\n \"page\", \"page-break-after\", \"page-break-before\", \"page-break-inside\",\n \"page-policy\", \"pause\", \"pause-after\", \"pause-before\", \"perspective\",\n \"perspective-origin\", \"pitch\", \"pitch-range\", \"play-during\", \"position\",\n \"presentation-level\", \"punctuation-trim\", \"quotes\", \"region-break-after\",\n \"region-break-before\", \"region-break-inside\", \"region-fragment\",\n \"rendering-intent\", \"resize\", \"rest\", \"rest-after\", \"rest-before\", \"richness\",\n \"right\", \"rotation\", \"rotation-point\", \"ruby-align\", \"ruby-overhang\",\n \"ruby-position\", \"ruby-span\", \"shape-image-threshold\", \"shape-inside\", \"shape-margin\",\n \"shape-outside\", \"size\", \"speak\", \"speak-as\", \"speak-header\",\n \"speak-numeral\", \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\",\n \"tab-size\", \"table-layout\", \"target\", \"target-name\", \"target-new\",\n \"target-position\", \"text-align\", \"text-align-last\", \"text-decoration\",\n \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n \"text-decoration-style\", \"text-emphasis\", \"text-emphasis-color\",\n \"text-emphasis-position\", \"text-emphasis-style\", \"text-height\",\n \"text-indent\", \"text-justify\", \"text-outline\", \"text-overflow\", \"text-shadow\",\n \"text-size-adjust\", \"text-space-collapse\", \"text-transform\", \"text-underline-position\",\n \"text-wrap\", \"top\", \"transform\", \"transform-origin\", \"transform-style\",\n \"transition\", \"transition-delay\", \"transition-duration\",\n \"transition-property\", \"transition-timing-function\", \"unicode-bidi\",\n \"vertical-align\", \"visibility\", \"voice-balance\", \"voice-duration\",\n \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\", \"voice-stress\",\n \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\", \"word-break\",\n \"word-spacing\", \"word-wrap\", \"z-index\",\n // SVG-specific\n \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n \"color-interpolation\", \"color-interpolation-filters\",\n \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"shape-rendering\", \"stroke\",\n \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\"\n ], propertyKeywords = keySet(propertyKeywords_);\n\n var nonStandardPropertyKeywords_ = [\n \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n \"scrollbar-3d-light-color\", \"scrollbar-track-color\", \"shape-inside\",\n \"searchfield-cancel-button\", \"searchfield-decoration\", \"searchfield-results-button\",\n \"searchfield-results-decoration\", \"zoom\"\n ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n var colorKeywords_ = [\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n \"whitesmoke\", \"yellow\", \"yellowgreen\"\n ], colorKeywords = keySet(colorKeywords_);\n\n var valueKeywords_ = [\n \"above\", \"absolute\", \"activeborder\", \"activecaption\", \"afar\",\n \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alternate\",\n \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n \"arabic-indic\", \"armenian\", \"asterisks\", \"auto\", \"avoid\", \"avoid-column\", \"avoid-page\",\n \"avoid-region\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"button\", \"button-bevel\",\n \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"cambodian\",\n \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-earthly-branch\",\n \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n \"col-resize\", \"collapse\", \"column\", \"compact\", \"condensed\", \"contain\", \"content\",\n \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"cover\", \"crop\",\n \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"dashed\", \"decimal\",\n \"decimal-leading-zero\", \"default\", \"default-button\", \"destination-atop\",\n \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\",\n \"disc\", \"discard\", \"document\", \"dot-dash\", \"dot-dot-dash\", \"dotted\",\n \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\",\n \"ethiopic-halehame-tig\", \"ew-resize\", \"expanded\", \"extra-condensed\",\n \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fixed\", \"flat\", \"footnotes\",\n \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"groove\",\n \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hebrew\",\n \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"icon\", \"ignore\",\n \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n \"inline-block\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n \"italic\", \"justify\", \"kannada\", \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\",\n \"line-through\", \"linear\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n \"lower-roman\", \"lowercase\", \"ltr\", \"malayalam\", \"match\",\n \"media-controls-background\", \"media-current-time-display\",\n \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n \"media-return-to-realtime-button\", \"media-rewind-button\",\n \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"myanmar\", \"n-resize\",\n \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n \"ns-resize\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"open-quote\",\n \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n \"painted\", \"page\", \"paused\", \"persian\", \"plus-darker\", \"plus-lighter\", \"pointer\",\n \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\", \"progress\", \"push-button\",\n \"radio\", \"read-only\", \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n \"relative\", \"repeat\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\", \"rgb\", \"rgba\",\n \"ridge\", \"right\", \"round\", \"row-resize\", \"rtl\", \"run-in\", \"running\",\n \"s-resize\", \"sans-serif\", \"scroll\", \"scrollbar\", \"se-resize\", \"searchfield\",\n \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\",\n \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n \"single\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"solid\", \"somali\",\n \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"square\",\n \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\",\n \"sub\", \"subpixel-antialiased\", \"super\", \"sw-resize\", \"table\",\n \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"up\",\n \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n \"vertical\", \"vertical-text\", \"visible\", \"visibleFill\", \"visiblePainted\",\n \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n \"window\", \"windowframe\", \"windowtext\", \"x-large\", \"x-small\", \"xor\",\n \"xx-large\", \"xx-small\"\n ], valueKeywords = keySet(valueKeywords_);\n\n var fontProperties_ = [\n \"font-family\", \"src\", \"unicode-range\", \"font-variant\", \"font-feature-settings\",\n \"font-stretch\", \"font-weight\", \"font-style\"\n ], fontProperties = keySet(fontProperties_);\n\n var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_)\n .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);\n CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n function tokenCComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (maybeEnd && ch == \"/\") {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return [\"comment\", \"comment\"];\n }\n\n function tokenSGMLComment(stream, state) {\n if (stream.skipTo(\"-->\")) {\n stream.match(\"-->\");\n state.tokenize = null;\n } else {\n stream.skipToEnd();\n }\n return [\"comment\", \"comment\"];\n }\n\n CodeMirror.defineMIME(\"text/css\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n tokenHooks: {\n \"<\": function(stream, state) {\n if (!stream.match(\"!--\")) return false;\n state.tokenize = tokenSGMLComment;\n return tokenSGMLComment(stream, state);\n },\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\"\n });\n\n CodeMirror.defineMIME(\"text/x-scss\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \":\": function(stream) {\n if (stream.match(/\\s*\\{/))\n return [null, \"{\"];\n return false;\n },\n \"$\": function(stream) {\n stream.match(/^[\\w-]+/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"#\": function(stream) {\n if (!stream.eat(\"{\")) return false;\n return [null, \"interpolation\"];\n }\n },\n name: \"css\",\n helperType: \"scss\"\n });\n\n CodeMirror.defineMIME(\"text/x-less\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \"@\": function(stream) {\n if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/, false)) return false;\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"&\": function() {\n return [\"atom\", \"atom\"];\n }\n },\n name: \"css\",\n helperType: \"less\"\n });\n\n});\n","created":"20141003162651180","modified":"20141003162818850","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js","text":"/*\\\ncreated: 20140927171850335\nmodified: 20141003155657361\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js\ntype: application/javascript\nmodule-type: command\n\nThe packplugin command packages source tiddlers (ordinary\ntiddlers) into a plugin tiddler:\n--packplugin <plugin title>\n\nPlease note that the plugin tiddler must be correctly set\nup in that it is of type \"application/json\" and also\nthe plugin-type is set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"packplugin\",\n\tsynchronous: true\n};\n\n\nvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\n\nvar Command = function(params, commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 1) {\n\t\treturn \"Missing plugin title\";\n\t}\n\tvar pluginTitle = this.params[0];\n\tvar filter = this.params[1];\n\n\t// Get the plug-in self-description tiddler. If it doesn't exist,\n\t// bail out as the plugin developer needs to provide a plugin tiddler\n\t// with the required self-description.\n\tthis.logger.log(\"making plugin:\", pluginTitle);\n\tthis.logger.log(\"using filter for packing:\", filter);\n\treturn thirdflow.packagePlugin($tw.wiki, pluginTitle, filter);\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927171850335","modified":"20141003155657361","type":"application/javascript","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js","text":"/*\\\ncreated: 20180217143029574\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js\ntags:\nmodified: 20180217143211351\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n name: \"releasedemowiki\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLER = \"$:/config/ThirdFlow/demowiki\";\nvar DEFAULT_DEMOWIKI_TEMPLATE = \"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources\";\n\n\n/* Creates a new command instance to release a demo wiki. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Releases this wiki as a plugin-demo wiki. */\nCommand.prototype.execute = function() {\n var self = this;\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var path = require(\"path\");\n var fs = require(\"fs\");\n\n var config = $tw.wiki.getTiddler(RELEASE_CONFIG_TIDDLER);\n if (!config) {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_DEMOWIKI_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing demowiki to:\", filename);\n var content = $tw.wiki.renderTiddler(\"text/plain\", template);\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n self.logger.alert(\"cannot create file directories\");\n return err;\n }\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n }\n }\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180217143029574","type":"application/javascript","tags":"","modified":"20180217143211351","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js","text":"/*\\\ncreated: 20180212171824929\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js\ntags:\nmodified: 20180212172043868\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Exports our --releaseplugins command, which packages all plugins marked for\n * release in this wiki, and then writes them to the local filesystem.\n */\nexports.info = {\n name: \"releaseplugins\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLERS_PREFIX = \"$:/config/ThirdFlow/plugins\";\nvar RELEASE_CONFIG_FILTER = \"[prefix[\" + RELEASE_CONFIG_TIDDLERS_PREFIX + \"/]]\";\nvar DEFAULT_TID_TEMPLATE = \"$:/core/templates/tid-tiddler\";\n\n\n/* Creates a new command instance. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Executes our command. */\nCommand.prototype.execute = function() {\n var self = this;\n /* check your command parameters, which you will find in this.params */\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n var path = require(\"path\");\n\n // Retrieve the release configuration tiddlers, then iterate over them\n // and package and render those plugins for which release is enabled.\n // Plugin-release config tiddler fields:\n // release: must be \"yes\" to trigger release, otherwise the release config\n // data gets ignored.\n // text: mandatory name of plugin file name.\n // template: optional title of a tempplate tiddler to be used for rendering\n // the plugin output file.\n var releaseConfigs = $tw.wiki.filterTiddlers(RELEASE_CONFIG_FILTER);\n self.logger.log(\"release config tiddlers found:\", releaseConfigs.length);\n $tw.utils.each(releaseConfigs, function(title) {\n var pluginTitle = title.substr(RELEASE_CONFIG_TIDDLERS_PREFIX.length + 1);\n var config = $tw.wiki.getTiddler(title);\n if (config) {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_TID_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping:\", pluginTitle);\n } else {\n // (1) pack the plugin tiddler\n self.logger.log(\"packaging:\", pluginTitle);\n var err = thirdflow.packagePlugin($tw.wiki, pluginTitle);\n if (!err) {\n // (2) write the plugin tiddler\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing to:\", filename);\n err = thirdflow.renderTiddlerWithTemplate(\n self.commander.wiki, pluginTitle, template, filename\n );\n if (err) {\n self.logger.alert(\"writing failed:\", err);\n return err;\n }\n } else {\n self.logger.alert(\"packaging failed:\", err);\n return err;\n }\n }\n }\n });\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180212171824929","type":"application/javascript","tags":"","modified":"20180212172043868","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js","text":"/*\\\ncreated: 20140927173011680\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js\ntype: application/javascript\nmodified: 20140927173032181\nmodule-type: command\n\nCommand to render a single tiddler using a template.\n--rendertemplatedtiddler <title> <template> <file>\n\nCommand to render a single tiddler using a template to a specific file.\nIn comparism to --rendertiddler this command variant accepts a template\nbut only works on a single tiddler. This allows us to avoid having specific\ntemplate tiddlers including the filter set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"rendertemplatedtiddler\",\n\tsynchronous: true\n};\n\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 3) {\n\t\treturn \"Missing template or filename\";\n\t}\n\tvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\tvar path = require(\"path\");\n\tvar title = this.params[0];\n\tvar template = this.params[1];\n\tvar filename = path.resolve(this.commander.outputPath, this.params[2]);\n\t// Save the tiddler as a self contained templated file\n thirdflow.renderTiddlerWithTemplate(\n\t\tthis.commander.wiki,\n\t\ttitle,\n\t\ttemplate,\n\t\tfilename\n\t);\n this.logger.log(\"rendered tiddler\", title, \"to\", filename);\n\treturn null; // done fine\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927173011680","type":"application/javascript","modified":"20140927173032181","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix","created":"20180203172801606","modified":"20180203172814315","tags":"","type":"text/vnd.tiddlywiki","text":"filters/all"},"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix","created":"20180203170629108","modified":"20180203170648166","tags":"","type":"text/vnd.tiddlywiki","text":"commands"},"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix","created":"20180203172725023","modified":"20180203172738692","tags":"","type":"text/vnd.tiddlywiki","text":"filters"},"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix","created":"20180203172744547","modified":"20180203172757212","tags":"","type":"text/vnd.tiddlywiki","text":"filters/is"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix","created":"20180203173603786","modified":"20180203173625412","tags":"","type":"text/vnd.tiddlywiki","text":"libs"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix","created":"20180203172945642","modified":"20180203172956320","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix","created":"20180203172818867","modified":"20180203172921843","tags":"","type":"text/vnd.tiddlywiki","text":"parsers"},"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix","created":"20180203173103664","modified":"20180203173117022","tags":"","type":"text/vnd.tiddlywiki","text":"startups"},"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix","created":"20180203173153198","modified":"20180203173208873","tags":"","type":"text/vnd.tiddlywiki","text":"styles"},"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix","created":"20180203173215242","modified":"20180203173234383","tags":"","type":"text/vnd.tiddlywiki","text":"templates"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix","created":"20180207102757523","modified":"20180211155919528","tags":"","type":"text/vnd.tiddlywiki","text":"config"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix","created":"20180207102840528","modified":"20180207102855322","tags":"","type":"text/vnd.tiddlywiki","text":"globals"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix","created":"20180203172853288","modified":"20180203172905835","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix","created":"20180207102731921","modified":"20180207103054605","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix","created":"20180207102537150","modified":"20180207102719509","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix","created":"20180203173239752","modified":"20180203173248899","tags":"","type":"text/vnd.tiddlywiki","text":"ui"},"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix","created":"20180203173311648","modified":"20180203173326083","tags":"","type":"text/vnd.tiddlywiki","text":"widgets"},"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix","created":"20180203173001192","modified":"20180205162648345","tags":"","type":"text/vnd.tiddlywiki","text":"parsers/wikiparser/rules"},"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js","text":"/*\\\ncreated: 20140927173349128\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js\ntype: application/javascript\nmodified: 20140927173409192\nmodule-type: isfilteroperator\n\nFilter function for [is[shadowinsync]]\n a tiddler is shadowsynced when an ordinary tiddler also has\n a shadow tiddler *AND* the shadow tiddler is the same as the\n real tiddler. This is decided on the basis of type, and the\n creation and modification dates.\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.shadowinsync = function(source,prefix,options) {\n\tvar results = [];\n\tvar invert = prefix === \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar match = invert;\n\t\tvar pluginTitle = options.wiki.getShadowSource(title);\n\t\tif(pluginTitle) {\n\t\t\tvar pluginInfo = options.wiki.getPluginInfo(pluginTitle),\n\t\t\t\tshadow = pluginInfo.tiddlers[title];\n\t\t\tif ( (tiddler.fields.type == shadow.type)\n\t\t\t && (tiddler.getFieldString(\"created\") === shadow.created)\n\t\t\t\t && (tiddler.getFieldString(\"modified\") === shadow.modified) ) {\n\t\t\t\tmatch = !match;\n\t\t\t}\n\t\t}\n\t\tif ( match ) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","created":"20140927173349128","type":"application/javascript","modified":"20140927173409192","module-type":"isfilteroperator"},"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js","text":"/*\\\ncreated: 20141117182000659\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js\nmodified: 20180217161013611\nmodule-type: filteroperator\n\nFilter operator for splitting a title containing slashes as separators\ninto its components.\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.titlecomponents = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n var components = title.split(\"/\");\n var idx;\n var l = components.length;\n for ( idx = 0; idx < l; idx++ ) {\n results.push(components[idx]);\n }\n\t});\n\treturn results;\n};\n\n})();\n","created":"20141117182000659","type":"application/javascript","modified":"20180217161013611","module-type":"filteroperator"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js\ntype: application/javascript\npriority: 0\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/enableautomaticsubfolders\";\nvar automaticSubfoldersEnabled;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tautomaticSubfoldersEnabled = $tw.wiki.getTiddlerText(configTiddler, \"yes\") === \"yes\";\n\tthis.logger.log(\"folder policy config: default: hierarchical subfolders are \" + (automaticSubfoldersEnabled ? \"enabled\" : \"disabled\"));\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(!options.draft && automaticSubfoldersEnabled) {\n\t\toptions.subfolder = this.subfoldersFromTitle(title);\n\t\toptions.name = this.leafFromTitle(title);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"0"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js\ntype: application/javascript\npriority: 200\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/draftfoldername\";\nvar draftFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tdraftFolderName = $tw.wiki.getTiddlerText(configTiddler, \"drafts\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: draft: draft subfolder is: \" + draftFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(options.draft) {\n\t\toptions.subfolder = draftFolderName;\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"200"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js\ntype: application/javascript\npriority: 100\n\nThis folder usher handles system tiddlers and places them into their\nown separate system folder and then into hierarchical subfolders according\nto their title. The exact name of the system folder is configurable.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/systemfoldername\";\nvar systemFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tsystemFolderName = $tw.wiki.getTiddlerText(configTiddler, \"system\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: system: system subfolder is: \" + systemFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft && title.substr(0, 3) === \"$:/\") {\n\t\tvar posTitle = title.lastIndexOf(\"/\");\n\t\toptions.subfolder = systemFolderName + title.substr(2, posTitle - 2);\n\t\toptions.name = title.substr(posTitle + 1);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"100"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js\ntype: application/javascript\npriority: 50\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddlerBase = \"$:/config/FileStorage/tagfolders\";\nvar tagFolders;\nvar tagList;\n\n// The configuration tiddlers to monitor for changes\nexports.watch = \"[field:title[\" + configTiddlerBase + \"]] [prefix[\" + configTiddlerBase + \"/]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tvar self = this;\n \n var cfgTiddler = $tw.wiki.getTiddler(configTiddlerBase);\n tagList = $tw.utils.parseStringArray((cfgTiddler && cfgTiddler.fields.list) || \"\");\n var cfgTags = $tw.wiki.filterTiddlers(\"[prefix[\" + configTiddlerBase + \"/]]\");\n tagFolders = {};\n \n $tw.utils.each(tagList, function(tag) {\n tagFolders[tag] = {folderName: \"\", folderMode: \"flat\"};\n });\n $tw.utils.each(cfgTags, function(tagCfg) {\n var tiddler = $tw.wiki.getTiddler(tagCfg);\n var tag = tiddler.fields[\"tag-name\"];\n var folderName = tiddler.fields[\"folder-name\"] || \"\";\n var folderMode = tiddler.fields[\"folder-mode\"] || \"flat\";\n self.logger.log(\"folder policy config: tag: for:\", \"\\\"\" + tag + \"\\\"\", \"folder:\", \"\\\"\" + folderName + \"\\\"\", \"mode:\", folderMode);\n if(tag && tagFolders[tag]) {\n tagFolders[tag].folderName = folderName;\n tagFolders[tag].folderMode = folderMode;\n }\n });\n};\n\n// We are asked to apply our folder policy...\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft ) {\n\t\tvar tags = options.tiddler.fields.tags;\n\t\tif ($tw.utils.isArray(tags)) {\n\t\t\tthis.logger.log(\"Tags: \"+tags.toString());\n for (var t=0; t<tagList.length; ++t) {\n if (tags.indexOf(tagList[t]) >= 0) {\n var info = tagFolders[tagList[t]];\n var subfolder = info.folderName;\n if(info.folderMode !== \"flat\") {\n options.subfolder = subfolder + \"/\" + this.subfoldersFromTitle(title);\n options.name = this.leafFromTitle(title);\n } else {\n options.subfolder = subfolder;\n options.title = title;\n }\n return true;\n }\n }\n\t\t}\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"50"},"$:/plugins/TheDiveO/ThirdFlow/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/history","created":"20140902083720188","modified":"20180218200526556","type":"text/vnd.tiddlywiki","text":"* ''1.2.1''\n** fixes new plugin template so its text content is of (mime) type `application/json`.\n** fixes error reporting in `--releaseplugins` and `--releasedemowiki`.\n\n* ''1.2.0''\n** brings a new automated release mechanism for plugins and plugin-demo wikis that simplifies maintaining what is to be released. The new system especially makes releasing multiple different plugins from the same development wiki much easier -- because there is no more need to tweak the release `tiddlywiki.info` configuration (however, this old release mechanism is still available).\n*** new \"''Release''\" tab in control panel, which configures which plugin(s) to release under which name, as well as whether to additionally release a plugin-demo wiki.\n*** new commands `--releaseplugins` and `--releasedemowiki` which use the configuration set from the control panel to package your plugins, write them to files, as well as writing the plugin-demo wiki (when enabled in configuration).\n*** upgrades `release/tiddlywiki.info` to use the new automated release mechanism, so plugin developers don't need to edit this file anymore in the future. To upgrade an existing plugin development wiki, simply upgrade your local `release/tiddlywiki.info` with this new one: [[editions/release/tiddlywiki.info]].\n*** upgrades skeleton `release/tiddlywiki.info` to also use the new automated release mechanism.\n*** refactors internal Javascript code.\n** removes released(!) plugins from the \"Plugin Sources\" view, as well as from the \"Releases\" tab in the Control Panel. This keeps the display cleaner, avoiding confusion.\n\n* ''1.1.1''\n** fixes plugin tiddler templates incorrectly setting `moduleType` instead of `module-type`.\n\n* ''1.1.0''\n** fixes //Plugin Sources// sidebar tab previously not sorting plugins alphabetically.\n** now shows number of tiddlers inside a plugin next to the plugin publisher/name.\n** adds a new <$button class=<<tv-config-toolbar-class>> >{{$:/core/images/down-arrow}}</$button> popup menu to each plugin listed in the //Plugin Sources// sidebar tab. This menu offers to create new tiddlers inside a plugin, from an assortion of type-specific templates. Templates included cover new Javascript macro modules, filter modules, and many more.\n** shows \"add plugin boilerplate tiddlers\" for empty plugins; clicking it opens the standard `readme`, `license` and `history` tiddlers ready for editing. Additionally, these three tiddlers get added to the plugin tiddlers `list` field.\n** adds a new //~ThirdFlow// tab to the control panel. This tab allows developers to configure the places inside plugins where they want to add new tiddlers of a certain type (such as macro modules, filter modules, et cetera).\n** now shows more plugin meta data than before when //viewing// a plugin tiddler:\n*** `core-version` dependency field,\n*** `plugin-priority` field controlling the order of unpacking (where plugin tiddlers \"explode\" into their shadow tiddlers).\n** adds a new //edit// template to edit plugin meta data:\n*** the edit template shows the same plugin meta data as the plugin //view// template, but additionally allows //editing// most fields.\n*** two plugin meta data elements cannot be edited: the plugin publisher and plugin name elements, as these are derived from the plugin title.\n** removes (annoying) wikilink-ification when displaying or editing plugin meta data.\n\n* ''1.0.14''\n** adds npm package and (development) script support.\n** after cloning the ThirdFlow repository, first run `npm install tiddlywiki` inside the project directory.\n*** `npm run develop` starts the development TiddlyWiki server. Use Ctrl-C to stop the server.\n*** `npm run release` creates the release files.\n*** `nmp start` starts the development TiddlyWiki server. Use `npm stop` to stop it.\n\n* ''1.0.13''\n** fixes a bug in the hierarchical filesystem sync adapter related to evaluation of the `disable-hfs` configuration option.\n\n* ''1.0.12''\n** minor internal optimization: in filter expressions use `[all[current]]` instead of `[is[current]]`.\n\n* ''1.0.11''\n** fixes the import tiddler activating the plugin view template when it shouldn't.\n\n* ''1.0.10''\n** the <<tf>> plugin is not dead yet.\n** fixes `HierarchicalFileSystemAdaptor` to make it work with recent TW5 releases: adds missing `isReady()` method that was introduced some time ago to TW sync adaptors.\n** fixes `editions/develop/tiddlywiki.info` to load the -- now required -- `tiddlywiki/filesystem` plugin.\n** supports node-webkit; thanks to Eucaly for this fix.\n** fixes handling of filetypes not defined in `$tw.config.typeTemplates`; again, thanks to Eucaly for this fix.\n** updated documentation to properly reflect the correct configuration required with recent TiddlyWiki 5 releases.\n** minor textual tweaks.\n\n* ''1.0.9''\n** upgraded the tag-based folder storage user interface to use the new core tag-pill template ([[$:/core/ui/TagTemplate]]).\n\n* ''1.0.8'' -- fixes and usability improvements.\n** fixed broken handling of Javascript tiddlers when creating them: they are now correctly created as .js files. Also corrected file name handling to avoid duplicated file endings in case the title already contains the extension (as it is custom for Javascript tiddlers).\n** added \"new plugin source tiddler here\" to the \"plugin sources\" sidebar tab.\n** added new plugin view template part: it shows the meta information associated with the plugin and is shown before the core's stock plugin view template that (only) lists the contents of a plugin.\n\n* ''1.0.7'' -- minor fix release and core upgrade.\n** fixed the add tag button not working.\n** upgraded the release demo wiki core to 5.1.3.\n\n* ''1.0.6'' -- improved tag-based folders release.\n** the tags configured for organizing tiddler storage into folders now have a well-defined natural order. Tags earlier in the tag list take precedence over later ones. The new UI makes setting precedence easy, please see the next item.\n** revamped UI for configuring tag-based folders. The new UI allows tags to be sorted earlier in the list so that those earlier tags take precedence over latter tags.\n\n* ''1.0.5'' -- lots of new stuff release.\n** a new \"Plugin Sources\" UI in the sidebar under the \"More\" tab. Lists only plugins and their original source code tiddlers.\n** an enhanced file system sync adaptor that is now configurable through its own control panel UI extension, under the new tab [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]].\n*** configure the folder names for system tiddlers and drafts.\n*** organize your tiddlers neatly into their own subfolders based on tags. Unfortunately, tag priority cannot be controlled at this time.\n** more editing and highlight support.\n*** towards a (mostly) unified syntax highlighting in both static rendering as well as when editing tiddlers.\n*** added more codemirror features: current line highlighting, CSS syntax support.\n*** added support for TW5's native ~JavaScript storage format when creating ~JavaScript tiddlers directly inside ~TiddlyWiki 5. Tiddler meta-data gets correctly inserted into a (special) comment section.\n* ''1.0.4'' -- fix and more documentation.\n** fixed a typo in the (empty) source plugin tiddler itself which caused hiccups in ~TiddlyWiki's control panel plugin tab.\n** added more background information about plugins, modules, and the crazy stuff the <<tf>> plugin is made of.\n\n* ''1.0.3'' -- upgraded to work with the final ~TiddlyWiki 5.1.x releases.\n** fixed using deprecated regular expression when packing plugin tiddlers.\n\n* ''1.0.2'' -- fix and polishing release.\n** fixes a problem in the hierarchical filesystem sync adaptor that previously caused server aborts when adding JPEG tiddlers. The sync adaptor now defaults to the \"~~binary~~base64\" encoding whenever a meta file is required.\n** added two illustrations to the demo documentation showing the develop and release phases.\n** further minor documentation fixes and improvements.\n\n* ''1.0.1'' -- fix and polishing release.\n** fixes an issue where the user plugin demonstration wikis contained still the plugin source in addition to the plugin itself.\n** included polishing documentation from pmario (thanks!).\n\n* ''1.0.0'' -- this marks the first public release of the <<tf>> plugin. Of course, the <<tf>> eats its own dog food: this plugin has been developed with itself. Sweet, isn't it?\n** the ``--makeplugin`` command for creating plugins in headless TW5 instances running under Node.js.\n** the ``hierarchicalfilesystemadaptor`` sync adapter that stores tiddlers according to their hierarchical names into folders and subfolders.\n"},"$:/plugins/TheDiveO/ThirdFlow/icon":{"title":"$:/plugins/TheDiveO/ThirdFlow/icon","created":"20140902083115519","modified":"20140902083155746","type":"text/vnd.tiddlywiki","text":"<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path\n d=\"M 13.6875,0.21875 1.96875,7 l 0,13.53125 11.71875,6.78125 11.75,-6.78125 0,-13.53125 -11.75,-6.78125 z m -0.21875,2.9375 -0.21875,0.3125 -0.1875,0.21875 0.1875,0.25 0.15625,0.25 C 8.2238491,4.3516565 4.0625,8.5897663 4.0625,13.8125 c 0,1.53048 0.3643003,2.966927 1,4.25 l -0.25,0.53125 -0.625,-0.0625 C 3.4739437,17.106473 3.0625,15.512243 3.0625,13.8125 3.0625,8.028588 7.716283,3.2895221 13.46875,3.15625 z M 14.4375,3.1875 c 5.534617,0.369785 9.90625,4.9983374 9.90625,10.625 0,1.833581 -0.463357,3.557017 -1.28125,5.0625 l -0.125,-0.25 -0.125,-0.28125 -0.28125,0.03125 -0.34375,0.03125 c 0.739688,-1.363949 1.15625,-2.929057 1.15625,-4.59375 0,-5.0803341 -3.922604,-9.2511654 -8.90625,-9.625 l -0.375,-0.5 0.375,-0.5 z M 10.25,7.5 c 1.425042,0 2.639576,0.7576324 3.8125,1.40625 1.172923,0.6486176 2.283798,1.21875 3.09375,1.21875 C 19.100721,10.125 20,9.09375 20,9.09375 L 21.25,10.25 c 0,0 -1.500142,1.5625 -4.09375,1.5625 -1.459089,0 -2.728987,-0.755233 -3.90625,-1.40625 -1.177263,-0.6510172 -2.253123,-1.1875 -3,-1.1875 -1.8328368,0 -2.875,1.03125 -2.875,1.03125 L 6.1875,9.0625 c 0,0 1.5514984,-1.5625 4.0625,-1.5625 z m 0.0625,4.6875 c 1.28542,0 2.513683,0.725888 3.6875,1.375 1.173817,0.649112 2.306403,1.21875 3.25,1.21875 2.078117,0 3.09375,-1.125 3.09375,-1.125 l 0.71875,0.65625 c 0,0 -1.352537,1.46875 -3.8125,1.46875 -1.325443,0 -2.573631,-0.724477 -3.75,-1.375 -1.176369,-0.650523 -2.301,-1.21875 -3.1875,-1.21875 -1.9724586,0 -3.09375,1.15625 -3.09375,1.15625 L 6.5,13.625 c 0,0 1.4411209,-1.4375 3.8125,-1.4375 z m 0,3.84375 c 1.28542,0 2.482432,0.694638 3.65625,1.34375 1.173817,0.649112 2.306403,1.25 3.25,1.25 2.078118,0 3.09375,-1.15625 3.09375,-1.15625 l 0.75,0.6875 c 0,0 -1.383787,1.46875 -3.84375,1.46875 -1.325443,0 -2.54238,-0.724477 -3.71875,-1.375 -1.176369,-0.650523 -2.301001,-1.21875 -3.1875,-1.21875 -1.9724586,0 -3.125,1.125 -3.125,1.125 L 6.5,17.46875 c 0,0 1.4411209,-1.4375 3.8125,-1.4375 z M 5.53125,18.875 c 1.7052086,2.730869 4.727356,4.5625 8.1875,4.5625 3.288587,0 6.171115,-1.649342 7.90625,-4.15625 l 0.6875,-0.09375 0.25,0.53125 c -1.906345,2.846287 -5.161209,4.71875 -8.84375,4.71875 -3.8226661,0 -7.1815039,-2.032459 -9.0625,-5.0625 L 5,19.40625 5.3125,19.4375 5.40625,19.15625 5.53125,18.875 z\"\n transform=\"scale(4.6545455,4.6545455)\"\n id=\"path4245\"\n style=\"fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate\" />\n </g>\n</svg>"},"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled","created":"20141018212934861","modified":"20141018213600106","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-down-arrow-filled tc-image-button\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\"><path d=\"M 19.518782,6.1964562 1.9928658,6.2499507 c -0.5997449,0 -1.18824709,0.3502163 -1.4652964,0.8821413 -0.2770493,0.5319251 -0.2299991,1.2172585 0.117149,1.7063017 L 9.4346393,21.160505 c 0.6037607,0.846248 2.0655717,0.846248 2.6693317,0 L 20.839966,8.7844678 C 21.529101,7.8136291 20.709281,6.2075002 19.518782,6.1960248 z\"/></svg>\n"},"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled","created":"20141018213823637","modified":"20141018213933115","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-down-arrow-filled tc-image-button\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\"><path d=\"m 19.615415,16.125653 -17.5259167,-0.0535 c -0.5997449,0 -1.18824709,-0.350216 -1.4652964,-0.882141 C 0.3471526,14.658087 0.3942028,13.972753 0.7413509,13.48371 L 9.5312718,1.1616039 c 0.6037612,-0.84624798 2.0655722,-0.84624798 2.6693322,0 l 8.735995,12.3760371 c 0.689135,0.970839 -0.130685,2.576968 -1.321184,2.588443 z\"/></svg>\n"},"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js","text":"/*\\\ncreated: 20180212163414709\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\nmodified: 20180212163710081\ntags:\nmodule-type: library\n\nA library of (reusable) ThirdFlow plugin tiddler functions. These\nfunctions can be used, for instance, through TW server commands.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Good Stuff(tm) we need */\nif ($tw.node) {\n var fs = require(\"fs\");\n var path = require(\"path\");\n}\n\n\n/* Packages a plugin tiddler from its constituent individual tiddlers that exist\n * inside the title sub-namespace of the plugin tiddler.\n *\n * Parameters:\n * wiki: TW instance.\n * pluginTitle: the plugin tiddler to be packed; this must be a valid\n * plugin tiddler which has its plugin-type correctly set, as well\n * as a type of \"application/json\".\n * filterExpression: optional TW filter expression to be used to decide\n * which tiddlers need to be packed into the plugin. If left unspecified,\n * it defaults to all sub-tiddlers of the plugin title.\n *\n * Result:\n * returns undefined when the plugin tiddler specified in pluginTitle has\n * been packed without issues. Otherwise, an error string is returned,\n * detailing what went wrong.\n */\nexports.packagePlugin = function(wiki, pluginTitle, filterExpression) {\n // Prepare input parameters...\n if (pluginTitle.substr(-1) === \"/\") {\n pluginTitle = pluginTitle.substr(0, pluginTitle.length - 1);\n }\n filterExpression = filterExpression\n || \"[all[tiddlers]prefix[\" + pluginTitle + \"/]]\";\n // Plugin tiddler sanity checks...\n var pluginTiddler = wiki.getTiddler(pluginTitle);\n\tif (!pluginTiddler) {\n\t\treturn \"missing plugin tiddler: \" + pluginTitle;\n\t}\n\tif (pluginTiddler.fields.type !== \"application/json\"\n || !pluginTiddler.hasField(\"plugin-type\")) {\n\t\treturn \"not a plugin (skeleton) tiddler: \" + pluginTitle;\n\t}\n\t// Update the plugin content to contain all the tiddlers that match\n\t// the filter expression.\n\tvar filteredTiddlers = wiki.filterTiddlers(filterExpression);\n\tvar pluginTiddlers = {};\n\t$tw.utils.each(filteredTiddlers, function(title) {\n\t\tvar tiddler = wiki.getTiddler(title);\n\t\tvar fields = {};\n\t\t$tw.utils.each(tiddler.fields, function(value, fieldname) {\n\t\t\tfields[fieldname] = tiddler.getFieldString(fieldname);\n\t\t});\n\t\tpluginTiddlers[title] = fields;\n\t});\n\tvar plugin = new $tw.Tiddler(\n pluginTiddler,\n {\n \"text\": JSON.stringify({ \"tiddlers\": pluginTiddlers })\n });\n\twiki.addTiddler(plugin);\n\t// We need to update the plugin info that TW had built up during boot...\n\twiki.readPluginInfo();\n\t// ...and we need to re-unpack the plugins into their shadow tiddlers in\n\t// order to make [is[shadow]] work correctly. Yes, that causes the plugin\n // tiddlers to exist two times: the original source tiddler, as well as\n // a corresponding shadow tiddler. However, this is just during release,\n // but never in a development wiki nor in a user wiki deploying this plugin.\n\twiki.unpackPluginTiddlers();\n return;\n};\n\n\n/* Renders a single tiddler using a template to a file. Please note that\n * this function automatically creates the required subdirectories needed\n * to contain the output file.\n *\n * Parameters:\n * wiki: TW instance.\n * title: the tiddler to be rendered.\n * template: the title of the template to be used for rendering.\n * filename: the output filename to which the tiddler gets rendered.\n *\n * Result:\n * returns undefined when the rendering and writing process finished\n * successfully. Otherwise, an error string is returned, detailing what\n * went wrong.\n */\nexports.renderTiddlerWithTemplate = function(wiki, title, template, filename) {\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n return err;\n }\n var content = wiki.renderTiddler(\n \"text/plain\", template, { variables: { currentTiddler: title } });\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n return;\n};\n\n\n})();\n","created":"20180212163414709","type":"application/javascript","modified":"20180212163710081","tags":"","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/license","created":"20140902084022063","modified":"20140902090843205","type":"text/vnd.tiddlywiki","text":"The //Third Flow// plugin is covered by the following licenses:\n\n* The ''Third Flow plugin'' is licensed under the [[MIT license|http://opensource.org/licenses/MIT]].\n* The ''hierarchical file system adapter'' is licensed under the [[TiddlyWiki 5 license|https://raw.githubusercontent.com/Jermolene/TiddlyWiki5/master/licenses/copyright.md]] (links to ~GitHub TW5 repository). It bases on ``plugins/tiddlywiki/filesystem/filesystemadaptor.js`` and brings in storing tiddlers into hierarchical folder structures according to their titles.\n* Other content of this ~TiddlyWiki which is not part of the plugin or ~TiddlyWiki 5 is covered by the [[CC BY 3.0|http://creativecommons.org/licenses/by/3.0/]] license."},"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations","created":"20180203171654847","modified":"20180205195031010","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define tf-config-base() $:/config/ThirdFlow/\n\n\\define tf-config-base-default() $:/plugins/TheDiveO/ThirdFlow/defaults/\n"},"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js","text":"/*\\\ncreated: 20141020111828333\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/hashify.js\ntype: application/javascript\nmodified: 20141020111837899\nmodule-type: macro\n\nMacro to hash a tiddler title into a (mostly) unique number.\nThis avoids problems when using titles (from tags, et cetera)\nas path elements of a system tiddler title.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"hashify\";\n\nexports.params = [\n\t{name: \"title\"},\n {name: \"prefix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title,prefix) {\n\treturn (prefix || \"\") + $tw.utils.hashString(title);\n};\n\n})();\n","created":"20141020111828333","type":"application/javascript","modified":"20141020111837899","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js","text":"/*\\\ncreated: 20141020111845057\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js\ntype: application/javascript\nmodified: 20141020111852925\nmodule-type: macro\n\nMacro to sanitize a tiddler title for use as, e.g. a folder name.\nAlso converts the title to lowercase.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"sanitizedfoldername\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title.replace(/\\<|\\>|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\").toLowerCase();\n};\n\n})();\n","created":"20141020111845057","type":"application/javascript","modified":"20141020111852925","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js","text":"/*\\\ncreated: 20180203193341374\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js\nmodified: 20180205195741652\nmodule-type: macro\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"typedplugintiddlertitle\";\n\nexports.params = [\n { name: \"pluginroot\" }, /* such as: \"$:/plugins/publisher/plugin\" */\n { name: \"configtiddler\" }, /* title of config infix tiddler (may be missing) */\n { name: \"defaulttiddler\" }, /* title of default infix tiddler (may be missing too, but should not ;) */\n { name: \"title\" } /* title (suffix) */\n];\n\nexports.run = function(pluginroot, configtiddler, defaulttiddler, title) {\n /* Start with the plugin root part, and add a trailing slash, if not already given */\n var t = pluginroot;\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* Either add a configured infix, or a default infix; handle \"\" config correctly. */\n var cfgtiddler = this.wiki.getTiddler(configtiddler);\n if (cfgtiddler) {\n t += cfgtiddler.fields.text; /* \"\" will be just fine! */\n } else {\n var deftiddler = this.wiki.getTiddler(defaulttiddler);\n if (deftiddler) {\n t += deftiddler.fields.text;\n }\n }\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* End with the (suffix) title element. */\n t += title;\n \n /* Grmpf: ensure that the full title returned is unique. */\n return this.wiki.generateNewTitle(t);\n};\n\n})();","created":"20180203193341374","type":"application/javascript","modified":"20180205195741652","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/readme","created":"20140902083641711","modified":"20141020083728826","type":"text/vnd.tiddlywiki","text":"Use the //Third Flow// plugin in your Node.js-based ~TiddlyWikis to develop your customization plugins inside ~TiddlyWiki but with support for well-structured source code repository layouts.\n\nThe //Third Flow// plugin supports your plugin development in that it organizes all your tiddler source files into a clear hierarchical folder structure based on tiddler titles. An additional plugin creation command module makes it easy to create the package plugin itself as well as a demonstration ~TiddlyWiki without the hassle of having to maintain separate and even multiple ``tiddlers/`` and ``plugin/`` folders. Also, the //Third Flow// relieves you from shuffling tiddler source code files around in your source code repository.\n\nThere's only a ''single'' tiddler source code tree and it is synchronized to your tiddler's title-based structure. Thus, no more need for external editing sessions and source file shuffling.\n\nSimply install this plugin into your ~TiddlyWiki in which you are developing your customizations. For more information, please go to the [[Third Flow project website|http://thediveo.github.io/ThirdFlow]].\n\nYou can use the new [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]] control panel tab to configure how your tiddlers get organized into folders and subfolders in your source code repository.\n\nEnjoy the //Third Flow//!"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel","created":"20180203155550006","modified":"20180203163400275","tags":"$:/tags/Stylesheet","type":"text/css","text":".tfc-infix-setting {\n width: 100%;\n display: flex;\n align-items: center;\n}\n\n.tfc-infix-setting-prefix {\n opacity: 0.5;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView","created":"20180202130047517","modified":"20180217165529786","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"td.tfc-plugin-edit-element-value {\n text-align: left;\n vertical-align: baseline;\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input {\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input[type=checkbox] {\n width: auto;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView","created":"20141025152245526","modified":"20180205183442633","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"tr.tfc-plugin-info-element td {\n padding-top: 0.4ex;\n padding-bottom: 0.4ex;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\ntd.tfc-plugin-info-element-name {\n text-align: right;\n vertical-align: baseline;\n background-color: <<colour table-header-background>>;\n font-weight: bold;\n}\n\ntd.tfc-plugin-info-element-value {\n text-align: left;\n vertical-align: top;\n}\n\nspan.tfc-plugin-info-unspecified {\n font-style: italic;\n color: <<colour very-muted-foreground>>;\n}\n\nspan.tfc-plugin-info-unspecified:before {\n font-style: normal;\n content: \"(\";\n}\n\nspan.tfc-plugin-info-unspecified:after {\n font-style: normal;\n content: \")\";\n padding-left: 0.15em;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5","created":"20141003153100991","modified":"20141003164807749","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* This CodeMirror stylesheet implements a TW5-compatible syntax coloring theme */\n\n.cm-s-tw5 span.cm-meta {color: #FF1717;}\n.cm-s-tw5 span.cm-keyword { line-height: 1em; font-weight: bold; color: #333; }\n.cm-s-tw5 span.cm-atom {color: #219;}\n.cm-s-tw5 span.cm-number {color: #008080;}\n.cm-s-tw5 span.cm-def {color: #00f;}\n.cm-s-tw5 span.cm-variable {color: black;}\n.cm-s-tw5 span.cm-variable-2 {color: #0000C0;}\n.cm-s-tw5 span.cm-variable-3 {color: #0000C0;}\n.cm-s-tw5 span.cm-property {color: #065252;}\n.cm-s-tw5 span.cm-operator {color: black;}\n.cm-s-tw5 span.cm-comment {color: #998;}\n.cm-s-tw5 span.cm-string {color: #2A00FF;}\n.cm-s-tw5 span.cm-string-2 {color: #f50;}\n.cm-s-tw5 span.cm-qualifier {color: #555;}\n.cm-s-tw5 span.cm-builtin {color: #30a;}\n.cm-s-tw5 span.cm-bracket {color: #cc7;}\n.cm-s-tw5 span.cm-tag {color: #000080; font-weight: bold;}\n.cm-s-tw5 span.cm-attribute {color: #00c;}\n.cm-s-tw5 span.cm-link {color: #219;}\n.cm-s-tw5 span.cm-error {color: #f00;}\n\n.cm-s-tw5 span.cm-underlined { text-decoration: underline; }\n.cm-s-tw5 span.cm-strikethrough { text-decoration: line-through; }\n.cm-s-tw5 span.cm-brace { color: #170; font-weight: bold; }\n.cm-s-tw5 span.cm-table { color: blue; font-weight: bold; }\n\n.cm-s-tw5 .CodeMirror-activeline-background {background: #F0F3F7 !important;}\n.cm-s-tw5 .CodeMirror-matchingbracket {outline:1px solid #c00; color:black !important;}\n"},"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5","created":"20141003155429576","modified":"20141003164730907","tags":"$:/tags/Stylesheet","type":"text/css","text":"/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #333;\n background: #f8f8f8;\n -webkit-text-size-adjust: none;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n color: #998;\n font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n color: #333;\n font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n color: #008080;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.hljs-dartdoc,\n.tex .hljs-formula {\n color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.scss .hljs-preprocessor {\n color: #900;\n font-weight: bold;\n}\n\n.javascript .hljs-title,\n.hljs-list .hljs-keyword,\n.hljs-subst {\n font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n color: #458;\n font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n color: #000080;\n font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n color: #065252;\n}\n\n.hljs-regexp {\n color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.clojure .hljs-keyword,\n.scheme .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n color: #990073;\n}\n\n.hljs-built_in {\n color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n color: #999;\n font-weight: bold;\n}\n\n.hljs-deletion {\n background: #fdd;\n}\n\n.hljs-addition {\n background: #dfd;\n}\n\n.diff .hljs-change {\n background: #0086b3;\n}\n\n.hljs-chunk {\n color: #aaa;\n}\n"},"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js","text":"/*\\\ncreated: 20141015190317579\ntitle: $:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js\ntype: application/javascript\nmodified: 20141015190324904\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with the local filesystem via node.js APIs\n...in contrast to filesystemadaptor.js this variant understands forward slashes \"/\"\nin tiddler titles and stores tiddlers appropriately in the file system by mapping\nthe hierarchy in the title to a (sub) directory structure.\n\nIn addition, this sync adaptor understands the concept of system tiddlers (starting\ntheir titles with \"$:/\") and stores them inside a \"special\" system branch.\n\nMoreover, this sync adaptor also understands the concept of draft tiddlers (based\non the presence of the \"draft.of\" field) and stores all draft tiddlers in a flat\nsingle \"drafts\" folder. The makes cleanup and (git) repository syncing easier to do.\n\nIn order to realize good modularity and to allow this sync adaptor to be enhanced\nat any time later in an easy manner, it supports so-called folder policy modules.\nThese are module tiddlers with a module-type of \"folderpolicy\". Folder policy modules\nneed to export a method named \"folderpolicy\". In addition, folder policy modules\ncan be assigned a priority value. Normally, the priority of a folder policy should\nbe between 199 and 1, inclusively. Priority 200 is currently used for the draft\ntiddler policy. Priority 0 is assigned to the default policy.\n\nThe code for this sync adaptor comes from filesystemadaptor.js and has been enhanced\nto support hierarchical tiddler storage as well as folder policies.\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 and path tools;\n// support node.js and nodejs-webkit\nvar fs = $tw.node ? require(\"fs\") : null,\n\tpath = $tw.node ? require(\"path\") : null;\n\nfunction HierarchicalFileSystemAdaptor(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.logger = new $tw.utils.Logger(\"HierarchicalFileSystem\");\n\t// Create the <wiki>/tiddlers folder if it doesn't exist\n\t$tw.utils.createDirectory($tw.boot.wikiTiddlersPath);\n\t\n\tthis.config = {\n\t\tdisabled: false\n\t};\n\t\n\t// retrieve all folder policy modules and sort them according\n\t// to their priority, with higher priority values sorted towards\n\t// the beginning of our folder policy modules list. Policy modules\n\t// more to the beginning are getting an earlier chance of applying\n\t// their policy.\n\tvar fpModules = [];\n\tvar fpcWatching = [];\n\t$tw.modules.forEachModuleOfType(\"folderpolicy\", function(title, exports) {\n\t\t// prepare folder policy information for later sorting and calling\n\t\tfpModules.push({\n\t\t\ttitle: title, // just for logging\n\t\t\tpriority: options.wiki.getTiddler(title).fields.priority || 100,\n\t\t\tpolicy: exports.folderpolicy || function() { return false; }\n\t\t});\n\t\t// get the information to monitor for configuration changes\n\t\tif ( exports.watch && exports.reconfig ) {\n\t\t\tfpcWatching.push({\n\t\t\t\tfilter: self.wiki.compileFilter(exports.watch),\n\t\t\t\treconfig: exports.reconfig\n\t\t\t});\n\t\t}\n\t\t// initial configuration call\n\t\tif ( exports.reconfig ) {\n\t\t\texports.reconfig.call(self);\n\t\t}\n\t});\n\tthis.fpcWatching = fpcWatching;\n\tfpModules.sort(function(policyA, policyB) {\n\t\treturn policyB.priority - policyA.priority;\n\t});\n\tthis.logger.log(fpModules.length + \" folder policies active\");\n\tthis.policyModules = fpModules;\n\t\n\tif($tw.boot.wikiInfo.config && $tw.boot.wikiInfo.config[\"disable-hfs\"]) {\n\t\tthis.config.disabled = true;\n\t\tthis.logger.log(\"plugin disabled; no saving and deleting\");\n\t}\n}\n \nHierarchicalFileSystemAdaptor.prototype.isReady = \"hfs\";\n\n// Are we ready? Are we ready?? We're always ready!\nHierarchicalFileSystemAdaptor.prototype.isReady = function() {\n\treturn true;\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerInfo = function(tiddler) {\n\treturn {};\n};\n\n//\n// file type-specific templates\n//\n$tw.config.typeTemplates = {\n\t\"application/x-tiddler\": \"$:/core/templates/tid-tiddler\",\n\t\"application/javascript\": \"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler\"\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) {\n\t// See if we've already got information about this file\n\tvar self = this,\n\t\ttitle = tiddler.fields.title,\n\t\tfileInfo = $tw.boot.files[title],\n\t\tdraftOf = tiddler.fields[\"draft.of\"];\n\t// Get information about how to save tiddlers of this type\n\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\ttypeInfo = $tw.config.contentTypeInfo[type];\n\tif(!typeInfo) {\n typeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n\t}\n if (!($tw.config.typeTemplates[typeInfo.fileType || tiddler.fields.type])) {\n \ttypeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n \t\ttypeInfo.fileType = \"application/x-tiddler\";\n\t}\n\tvar extension = typeInfo.extension || \"\";\n\tif(!fileInfo) {\n\t\t// If not, we'll need to generate it\n // Handle case where the title already ends in the file extension:\n // in this case we remove the extension from the suggested title.\n var suggestedName = title;\n if(suggestedName.substr(-extension.length) === extension) {\n suggestedName = suggestedName.substr(0,suggestedName.length - extension.length);\n }\n\t\tvar paf = self.generateTiddlerPathAndFilename(tiddler, suggestedName, draftOf);\n\t\tvar folder = $tw.boot.wikiTiddlersPath+path.sep+paf.subfolder;\n\t\t$tw.utils.createDirectory(folder);\n\t\t// Start by getting a list of the existing files in the directory\n\t\tfs.readdir(folder,function(err,files) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Assemble the new fileInfo\n\t\t\tfileInfo = {};\n\t\t\t\n\t\t\tfileInfo.filepath = folder + path.sep + self.generateUniqueTiddlerFilename(paf.name,draftOf,extension,files);\n\t\t\tfileInfo.type = typeInfo.fileType || tiddler.fields.type;\n\t\t\tfileInfo.hasMetaFile = typeInfo.hasMetaFile;\n\t\t\t// Save the newly created fileInfo\n\t\t\t$tw.boot.files[title] = fileInfo;\n\t\t\t// Pass it to the callback\n\t\t\tcallback(null,fileInfo);\n\t\t});\n\t} else {\n\t\t// Otherwise just invoke the callback\n\t\tcallback(null,fileInfo);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.subfoldersFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<=0) {\n\t\treturn \"\";\n\t} else {\n\t\treturn title.substr(0,lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.leafFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<0) {\n\t\treturn title;\n\t} else {\n\t\treturn title.substr(lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.generateTiddlerPathAndFilename = function(tiddler, suggestedTitle, draftOf) {\n\t// set up the policy method options such that if in a rare circumstance no policy\n\t// should fire, then we fall back to plain old flat storage in the main wiki folder.\n\tvar options = {\n\t\ttiddler: tiddler, // in: tiddler object we're trying a policy to find for\n\t\tdraft: !!draftOf, // in: is this a draft tiddler?\n\t\tsubfolder: \"\", // in/out: folder into which to place the tiddler file\n\t\tname: suggestedTitle // in/out: name of tiddler file\n\t};\n\t\n\t// run through our ordered list of folder policies and wait for one of them\n\t// to return true because its folder policy should be applied.\n\tfor (var i=0; i<this.policyModules.length; ++i) {\n\t\tif (this.policyModules[i].policy.call(this, suggestedTitle, options)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\t// Sanitize the filename as well as the subfolder(s) name(s)...\n\t// This more or less comes down to removing those characters that are illegal in\n\t// Windows file names. Oh, and we also hammer out any hierarchy slashes inside\n\t// the filename, thereby flattening it.\n\toptions.name = options.name.replace(/\\<|\\>|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\");\n\t// For the subfolder path we are converting hierarchy slashes into the proper\n\t// platform-specific separators.\n\toptions.subfolder = options.subfolder.replace(/\\<|\\>|\\:|\\\"|\\\\|\\||\\?|\\*|\\^/g,\"_\").replace(/\\//g, path.sep);\n\n\treturn options;\n};\n\n/*\nGiven a tiddler title and an array of existing filenames, generate a new legal filename for the title, case insensitively avoiding the array of existing filenames\n*/\nHierarchicalFileSystemAdaptor.prototype.generateUniqueTiddlerFilename = function(baseFilename,draftOf,extension,existingFilenames) {\n\t// Truncate the filename if it is too long\n\tif(baseFilename.length > 200) {\n\t\tbaseFilename = baseFilename.substr(0,200);\n\t}\n\t// Start with the base filename plus the extension\n\tvar filename = baseFilename + extension,\n\t\tcount = 1;\n\t// Add a discriminator if we're clashing with an existing filename\n\twhile(existingFilenames.indexOf(filename) !== -1) {\n\t\tfilename = baseFilename + \" \" + (count++) + extension;\n\t}\n\treturn filename;\n};\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nHierarchicalFileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tvar self = this;\n\n\t// Monitor for configuration changes and then trigger the folder\n\t// policy modules affected from configuration changes.\n\t$tw.utils.each(this.fpcWatching, function(watch, title, obj) {\n\t\tvar changes = watch.filter.call(self.wiki, function(filterCallback) {\n\t\t\tfilterCallback(tiddler, tiddler.fields.title);\n\t\t});\n\t\tif ( changes.length > 0 ) {\n\t\t\twatch.reconfig.call(self, tiddler.fields.title);\n\t\t}\n\t});\n\t\n\t// Proceed with saving the tiddler\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"saving disabled\");\n\t\treturn callback(null, {}, 0);\n\t}\n\t\n\tthis.getTiddlerFileInfo(tiddler,function(err,fileInfo) {\n\t\tvar template, content, encoding;\n\t\tfunction _finish() {\n\t\t\tcallback(null, {}, 0);\n\t\t}\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(fileInfo.hasMetaFile) {\n\t\t\t// Save the tiddler as a separate body and meta file\n\t\t\tvar typeInfo = $tw.config.contentTypeInfo[fileInfo.type],\n\t\t\t\tencoding = typeInfo.encoding || \"base64\"; // makes sense for TW\n\t\t\tself.logger.log(\"saving type\", fileInfo.type, \"with meta file and encoding\", encoding);\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,{encoding: encoding},function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",\"$:/core/templates/tiddler-metadata\",{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",content,{encoding: \"utf8\"},function (err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t\t_finish();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\t// Save the tiddler as a self contained templated file\n\t\t\ttemplate = $tw.config.typeTemplates[fileInfo.type];\n\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",template,{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\tfs.writeFile(fileInfo.filepath,content,{encoding: \"utf8\"},function (err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t_finish();\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*/\nHierarchicalFileSystemAdaptor.prototype.loadTiddler = function(title,callback) {\n\tcallback(null,null);\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\n*/\nHierarchicalFileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"deleting disabled\");\n\t\treturn callback(null);\n\t}\n\n\tvar self = this,\n\t\tfileInfo = $tw.boot.files[title];\n\t// Only delete the tiddler if we have writable information for the file\n\tif(fileInfo) {\n\t\t// Delete the file\n\t\tfs.unlink(fileInfo.filepath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.logger.log(\"Deleted file\",fileInfo.filepath);\n\t\t\t// Delete the metafile if present\n\t\t\tif(fileInfo.hasMetaFile) {\n\t\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\t\tcallback(null);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\tcallback(null);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null);\n\t}\n};\n\nif(fs) {\n\texports.adaptorClass = HierarchicalFileSystemAdaptor;\n}\n\n})();\n","created":"20141015190317579","type":"application/javascript","modified":"20141015190324904","module-type":"syncadaptor"},"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction":{"title":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","created":"20180204194231803","list":"","modified":"20180204194242455","tags":"","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler","created":"20140927173431490","modified":"20140927173434365","type":"text/vnd.tiddlywiki","text":"<$metafy/>"},"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources","created":"20140902113827798","modified":"20140927173615299","type":"text/vnd.tiddlywiki","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/temp/]] -[is[shadowinsync]] -[[$:/plugins/TheDiveO/ThirdFlow/readme]is[shadow]!is[tiddler]removesuffix[/readme]] -[prefix[$:/plugins/TheDiveO/BrokenPlugin]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic","caption":"Basic","created":"20141013144648552","modified":"20141013190842095","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"|Folder for system tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/systemfoldername\" default=\"system\" tag=\"input\"/>|\n|Folder for draft tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/draftfoldername\" default=\"drafts\" tag=\"input\"/>|\n\n!! How to store ordinary tiddlers into (sub) folders\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"yes\"> Organize ordinary tiddlers into hierarchical subfolders.</$radio>\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"no\"> Store ordinary tiddlers ''flat'' in the top-level wiki folder.</$radio>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags","caption":"Tag-based Folders","created":"20141013152809952","modified":"20141203202326182","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"\\define config-tiddler() $:/config/FileStorage/tagfolders\n\n\\define config-tiddler-list() [list[$(config-tiddler)$]]\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n\n\\define config-defaults() {\"tag-name\": \"$(currentListElement)$\", \"folder-name\": \"$(folder)$\", \"folder-mode\": \"flat\"}\n\n\\define tag-folder-editor()\n <$set name=\"tagConfigTiddler\" value=<<hashify title:\"$(currentListElement)$\" prefix:\"$(config-tiddler)$/config-\">>>\n <$set name=\"folder\" value=<<sanitizedfoldername \"$(currentListElement)$\">>>\n <$list filter=\"[<tagConfigTiddler>is[missing]]\">\n <$ensuretiddler title=<<tagConfigTiddler>> default=<<config-defaults>>/>\n <$link title=<<currentTiddler>> format=\"text\"><$text text=<<currentTiddler>>/></$link>\n </$list>\n <tr class=\"tc-edit-field\">\n <td class=\"tc-edit-tag-name\">\n <$tiddler tiddler=<<currentListElement>> >\n <$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n </$tiddler>\n </td>\n\n <td class=\"tc-edit-tag-folder\">\n <$edit-text tiddler=<<tagConfigTiddler>> field=\"folder-name\" placeholder=\"enter a folder name\"/>\n </td>\n\n <td class=\"tc-edit-tag-flat\">\n <$select tiddler=<<tagConfigTiddler>> field=\"folder-mode\">\n <option value=\"flat\">flat</option>\n <option value=\"subfolders\">subfolders</option>\n </$select>\n </td>\n\n <td class=\"tc-edit-tag-ops\">\n <$button message=\"tm-shift-back-list-element\" param=<<currentListElement>> class=\"tc-btn-invisible\">{{$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled}}</$button>\n \n <$button message=\"tm-shift-forward-list-element\" param=<<currentListElement>> class=\"tc-btn-invisible\">{{$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled}}</$button>\n \n <$button message=\"tm-remove-list-element\" param=<<currentListElement>> class=\"tc-btn-invisible\">{{$:/core/images/delete-button}}</$button>\n </td>\n </tr>\n </$set>\n </$set>\n\\end\n\nTags towards the beginning of the list take priority over tags more down the list.\n\n<$listmangler tiddler=<<config-tiddler>>>\n\n<div class=\"tc-edit-fields\">\n <table class=\"tc-edit-fields\">\n \t<thead>\n <tr>\n <td>tag</td>\n <td>folder</td>\n <td>storage</td>\n <td>priority</td>\n </tr>\n </thead>\n <tbody>\n <$list filter=<<config-tiddler-list>> variable=\"currentListElement\">\n <<tag-folder-editor>>\n </$list>\n </tbody>\n </table>\n</div>\n\n<div class=\"tc-edit-field-add\">\n <em class=\"tc-edit\">Add a new tag folder:</em>\n\n <div class=\"tc-edit-add-tag\">\n <span class=\"tc-add-tag-name\">\n <$edit-text tiddler=\"$:/temp/NewTagName\" tag=\"input\" default=\"\" placeholder=\"tag name\" focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor\"/>\n </span>\n \n <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\">\n {{$:/core/images/down-arrow}}\n </$button>\n \n <span class=\"tc-add-tag-button\">\n <$button message=\"tm-add-list-element\" param={{$:/temp/NewTagName}} set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n add\n </$button>\n </span>\n </div>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n <$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n <div class=\"tc-block-dropdown\">\n <$linkcatcher set=\"$:/temp/NewTagName\" setTo=\"\" message=\"tm-add-list-element\">\n <$list filter=\"[!is[shadow]tags[]search{$:/temp/NewTagName}sort[title]]\">\n <$link>\n <$set name=\"backgroundColor\" value={{!!color}}>\n <span style=<<tag-styles>> class=\"tc-tag-label\">\n <$view field=\"title\" format=\"text\"/>\n </span>\n </$set>\n </$link>\n </$list>\n </$linkcatcher>\n </div>\n </$reveal>\n</div>\n\n</$listmangler>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage","caption":"File Storage","created":"20141013143730660","modified":"20170222203526611","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"Control how a Node.js-server TiddlyWiki organizes your tiddlers into hierarchical folders and subfolders inside your file system. Any configuration changes you make here will immediately become live, even on your TiddlyWiki server.\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/HFS/ControlPanel]!has[draft.of]]\" \"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic\">>\n</div>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations","caption":"Default Locations","created":"20180217145204420","modified":"20180217150355438","type":"text/vnd.tiddlywiki","text":"\\define template-path(t) $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/$t$\n\n\\define infix(setting)\n<div class=\"tfc-infix-setting\">\n <div class=\"tfc-infix-setting-prefix\">plugin/ </div>\n <$edit-text tiddler=\"$:/config/ThirdFlow/$setting$\" default={{$(tf-config-base-default)$$setting$}} tag=\"input\"/>\n \n <$button class=\"tc-btn-invisible\" aria-label=\"reset to default\" tooltip=\"reset to default\">\n <$action-deletetiddler $tiddler=\"$:/config/ThirdFlow/$setting$\" />\n {{$:/core/images/refresh-button}}\n </$button>\n</div>\n\\end\n\n\\define template-link(t, ttype)\n<$button class=\"tc-btn-invisible\" aria-label=\"open $ttype$ template\" tooltip=\"open $ttype$ template\" to=<<template-path \"$t$\">>>\n {{$:/core/images/file}}\n</$button>\n\\end\n\n\\define infixsetting(description, infix, templatetitle, templatetype)\n<tr class=\"tc-edit-field\">\n <td style=\"white-space: nowrap;\">$description$</td>\n <td><<infix \"$infix$\">></td>\n <td><<template-link \"$templatetitle$\" \"$templatetype$\">></td>\n</tr>\n\\end\n\nSettings to customize //your// ''plugin development'' in TiddlyWiki.\n\nConfigure the places where you want to add new tiddlers of a certain type when developing your plugins. These settings only apply when adding new tiddlers to a plugin, never afterwards.\n\n* Simply leave a place empty when you don't want tiddlers of a specific type to be organized into their own sub title-namespace, but instead \"//flat//\" directly within the plugin.\n* Press <span class=\"tc-icon-wrapper\">{{$:/core/images/refresh-button}}</span> in order to reset a place for a specific type of plugin tiddler to its default setting.\n* Press <span class=\"tc-icon-wrapper\">{{$:/core/images/file}}</span> to see -- and optionally edit -- the template for a specific plugin tiddler type.\n\n<div class=\"tc-edit-fields\">\n <table class=\"tc-edit-fields\">\n <tbody>\n <<infixsetting \"command modules\" \"commandinfix\" \"command.js\" \"command module\">>\n <<infixsetting \"general filter operators `foo[]`\" \"filterinfix\" \"filter.js\" \"filter module\">>\n <<infixsetting \" … `all[...]` filters\" \"allfilterinfix\" \"allfilter.js\" \"all[...] filter module\">>\n <<infixsetting \" … `is[...]` filters\" \"isfilterinfix\" \"isfilter.js\" \"is[...] filter module\">>\n <<infixsetting \"Javascript macro modules\" \"jsmacroinfix\" \"jsmacro.js\" \"Javascript macro module\">>\n <<infixsetting \"~TiddlyWiki-markup macros\" \"twmacroinfix\" \"twmacro\" \"TiddlyWiki-markup macro\">>\n <<infixsetting \"library modules\" \"jslibinfix\" \"library.js\" \"Javascript library module\">>\n <<infixsetting \"parser modules\" \"parserinfix\" \"parser.js\" \"parser module\">>\n <<infixsetting \" … wikiparser rule modules\" \"wikiparserruleinfix\" \"wikirule.js\" \"wikiparser rule module\">>\n <<infixsetting \"startup modules\" \"startupinfix\" \"startup.js\" \"startup module\">>\n <<infixsetting \"CSS tiddlers\" \"styleinfix\" \"cssstyle.css\" \"CSS\">>\n <<infixsetting \"template tiddlers\" \"templateinfix\" \"template\" \"TiddlyWiki template tiddler\">>\n <<infixsetting \"UI tiddlers\" \"uiinfix\" \"ui\" \"UI tiddler\">>\n <<infixsetting \"widget modules\" \"widgetinfix\" \"widget.js\" \"widget module\">>\n <<infixsetting \"`$tw` global modules\" \"twglobalinfix\" \"twglobal.js\" \"$tw global module\">>\n <<infixsetting \"`$tw.config` modules\" \"twconfiginfix\" \"twconfig.js\" \"$tw.config module\">>\n <<infixsetting \"`$tw.utils` modules\" \"twutilinfix\" \"twutil.js\" \"$tw.utils module\">>\n <<infixsetting \"`$tw.utils` Node.js-only modules\" \"twutilnodeinfix\" \"twutilnode.js\" \"$tw.utils Node.js-only configuration module\">>\n </tbody>\n </table>\n</div>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Release":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Release","caption":"Release","created":"20180217150231019","modified":"20180217202317855","tags":"","type":"text/vnd.tiddlywiki","text":"\\define plain(text)\n$text$\n\\end\n\n\\define release-item(itemdesc, itemconfig, defaultfilename, templateplaceholder)\n<div class=\"tc-edit-fields\">\n <table class=\"tc-edit-fields\">\n <tbody>\n <tr class=\"tc-edit-field\">\n <td>release:</td>\n <td class=\"tfc-plugin-edit-element-value\" style=\"white-space: nowrap;\">\n <$checkbox tiddler=\"$itemconfig$\" field=\"release\" checked=\"yes\" unchecked=\"no\">\n\t $itemdesc$\n </$checkbox>\n </td>\n </tr>\n <tr class=\"tc-edit-field\">\n <td>as:</td>\n <td class=\"tfc-plugin-edit-element-value\" style=\"white-space: nowrap;\">\n <$edit-text tiddler=\"$itemconfig$\" field=\"text\" default=\"$defaultfilename$\" tag=\"input\" />\n </td>\n </tr>\n <tr class=\"tc-edit-field\">\n <td>template:</td>\n <td class=\"tfc-plugin-edit-element-value\" style=\"white-space: nowrap;\">\n <$edit-text tiddler=\"$itemconfig$\" field=\"template\" default=\"\" placeholder=\"$templateplaceholder$\" tag=\"input\" />\n </td>\n </tr>\n\t</tbody>\n </table>\n</div>\n\\end\n\n\\define release-plugin-item(itemdesc, itemconfig, defaultfilename, templateplaceholder)\n<<release-item '<$link to=\"$:/plugins/$(plugin-name)$\"><$macrocall $name=\"plain\" text=\"$itemdesc$\" $output=\"text/plain\"/></$link>' \"$itemconfig$\" \"$defaultfilename$\" \"$templateplaceholder$\">>\n\\end\n\nSettings to customize your ''plugin(s) release'', including an optional plugin-demo wiki.\n\n> ''Note:'' To ''create'' the release files, run `npm run release` on your development ~TiddlyWiki in a terminal session.\n\n!! Plugins\n\n<$list filter=\"[prefix[$:/plugins/]has[plugin-type]removeprefix[$:/plugins/]!prefix[tiddlywiki/]!regexp:title[^.+/.+/]sort[]] -[all[shadows]prefix[$:/plugins/]shadowsource[]removeprefix[$:/plugins/]]\" variable=\"plugin-name\">\n <$set name=\"plugin-config\" filter=\"[<plugin-name>addprefix[$:/config/ThirdFlow/plugins/$:/plugins/]]\">\n <$set name=\"plugin-filename\" filter=\"[<plugin-name>titlecomponents[]last[]addsuffix[.tid]]\">\n <$macrocall $name=\"release-plugin-item\" itemdesc=<<plugin-name>> itemconfig=<<plugin-config>> defaultfilename=<<plugin-filename>> templateplaceholder=\"$:/core/templates/tid-tiddler\" />\n </$set>\n </$set>\n</$list>\n\n\n!! Plugin-Demo Wiki\n\n<<release-item \"demo wiki\" \"$:/config/ThirdFlow/demowiki\" \"plugin-demo.html\" \"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow","caption":"ThirdFlow","created":"20180203154413491","list":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations","modified":"20180217150140183","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"<<tabs \"[all[shadows+tiddlers]prefix[$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/]]\" \"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations\" \"$:/state/tabs/cp3f\" >>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData","created":"20180202124221987","list-before":"$:/core/ui/EditTemplate/body","modified":"20180205194150923","tags":"$:/tags/EditTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-info-row(name, value, output:\"html\")\n\\rules except wikilink\n <tr class=\"tfc-plugin-info-element\">\n <td class=\"tfc-plugin-info-element-name\">\n $name$:\n </td>\n <td class=\"tfc-plugin-edit-element-value\">\n\t $value$\n </td>\n </tr>\n\\end\n\n\\define plugin-edit-row(name, field, placeholder)\n <tr class=\"tfc-plugin-info-element\">\n <td class=\"tfc-plugin-info-element-name\">\n $name$:\n </td>\n <td class=\"tfc-plugin-edit-element-value\">\n <$edit-text field=\"$field$\" placeholder=\"$placeholder$\"/>\n </td>\n </tr>\n\\end\n\n<$list filter=\"[all[current]has:field[plugin-type]!field:plugin-type[import]]\">\n\n<h1>Plugin Meta Data</h1>\n\n<div class=\"tfc-plugin-info\">\n <table class=\"tfc-plugin-info\">\n <$set name=\"publisher\" filter=\"[all[current]get[draft.title]removeprefix[$:/plugins/]splitbefore[/]removesuffix[/]]\">\n <<plugin-info-row name:\"Plugin publisher\" value:\"$(publisher)$\" output:\"text\">>\n <$set name=\"plugin-name\" filter=\"[all[current]get[draft.title]removeprefix[$:/plugins/]removeprefix<publisher>removeprefix[/]splitbefore[/]]\">\n <<plugin-info-row name:\"Plugin name\" value:\"$(plugin-name)$\" output:\"text\">>\n </$set>\n </$set>\n\n\t<<plugin-edit-row \"Version\" \"version\" \"0.0.1\">>\n\t<<plugin-edit-row \"Plugin type\" \"plugin-type\" \"plugin\">>\n\t<<plugin-edit-row \"Description\" \"description\" \"Tell TiddlyWiki users about what your plugin does\">>\n\t<<plugin-edit-row \"Author\" \"author\" \"U. K. Known\">>\n\t<<plugin-edit-row \"Source\" \"source\" \"https://example.org/foo\">>\n\t<<plugin-edit-row \"Plugin priority\" \"plugin-priority\" \"\">>\n\t<<plugin-edit-row \"Required TW Core version\" \"core-version\" \">=5.0.0\">>\n</table>\n</div>\n\n</$list>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/PluginSources":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/PluginSources","caption":"Plugin Sources","created":"20141003192047443","modified":"20180217202921185","tags":"$:/tags/MoreSideBar","type":"text/vnd.tiddlywiki","text":"\\whitespace trim\n\n\\define qualify-plugin() $(q)$/$(plugin-name)$\">>\n\n\\define plugin-full-path() $:/plugins/$(plugin-name)$\n\n\\define action-new-with-template(actiontext, infixtype, title, template, fields)\n<$set name=\"newtitle\" value=<<typedplugintiddlertitle pluginroot:\"$:/plugins/$(plugin-name)$\" configtiddler:\"$(tf-config-base)$$infixtype$\" defaulttiddler:\"$(tf-config-base-default)$$infixtype$\" title:\"$title$\">> >\n<$button class=<<tv-config-toolbar-class>> >\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<newtitle>> $param=\"$template$\" $fields$ />\n$actiontext$\n</$button>\n</$set>\n\\end\n\n\\define new-source-tiddler-name() $(plugin-full-path)$/new source tiddler\n\n\\define plugin-icon() $(plugin-full-path)$/icon\n\n\\define plugin-type-filter() [{$(plugin-full-path)$!!plugin-type}]\n\n\\define plugin-default-icon() $:/core/images/plugin-generic-$(plugin-type)$\n\n\\define plugin-contents-filter() [prefix[$(plugin-full-path)$/]!is[shadow]sort[]]\n\n\\define plugin-item-relname() [all[current]removeprefix[$(plugin-full-path)$/]!prefix[tiddlywiki/]]\n\n\\define plugin-item()\n<div class=\"tc-menu-list-subitem\">\n <$link to={{!!title}}>\n <$list filter=<<plugin-item-relname>> >\n ...<$view field=\"title\" format=\"text\" />\n </$list>\n </$link>\n</div>\n\\end\n\n\\define empty-plugin()\n<$set name=\"plugin-boilerplate-icon\" value=\"{{$:/core/images/list-bullet}} \">\n <div class=\"tc-menu-list-subitem\">\n {{$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate}}\n </div>\n</$set>\n\\end\n\n<$set name=\"q\" value=<<qualify \"$:/state/popup/thirdflow/pluginactions\">>>\n<div class=\"tc-timeline\">\n <div class=\"tc-menu-list-item tc-sidebar-header\">\n <div class=\"tc-plugin-info-chunk\">{{$:/core/images/plugin-generic-plugin}}</div>\n \n <$button tooltip=\"create new plugin\" class=<<tv-config-toolbar-class>> >\n <$action-sendmessage $message=\"tm-new-tiddler\" title=\"$:/plugins/PublisherName/PluginName\" $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin\" />\n {{$:/core/images/new-button}}\n </$button>\n \n new plugin\n </div>\n\n <$list filter=\"[prefix[$:/plugins/]has[plugin-type]removeprefix[$:/plugins/]!prefix[tiddlywiki/]!prefix[TheDiveO/ThirdFlow/]sort[]] -[all[shadows]prefix[$:/plugins/]shadowsource[]removeprefix[$:/plugins/]]\" variable=\"plugin-name\">\n <div class=\"tc-menu-list-item tc-sidebar-header\">\n \n <!-- plugin icon or default icon -->\n <div class=\"tc-plugin-info-chunk\">\n <$transclude tiddler=<<plugin-icon>> >\n <$list filter=<<plugin-type-filter>> variable=\"plugin-type\">\n <$transclude tiddler=<<plugin-default-icon>> />\n </$list>\n </$transclude>\n </div>\n \n <!-- plugin actions -->\n <$set name=\"qp\" value=<<qualify-plugin>> >\n <$button popup=<<qp>> class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n <$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n {{$:/core/images/down-arrow}}\n </$list>\n <$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n <span class=\"tc-btn-text\">plugin actions</span>\n </$list>\n </$button>\n <$reveal state=<<qp>> type=\"popup\" position=\"below\" animate=\"yes\">\n <div class=\"tc-drop-down\">\n <$list filter=\"[all[shadows+tiddlers]tag[$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction]!has[draft.of]sort[caption]]\">\n <$transclude mode=\"inline\"/>\n </$list>\n </div>\n </$reveal>\n </$set>\n \n <!-- plugin author/name w. link -->\n <$link to=<<plugin-full-path>>>\n <$macrocall $name=\"plugin-name\" $output=\"text/plain\" />\n </$link>\n (<$count filter=<<plugin-contents-filter>> />)\n \n <!-- list of plugin contents -->\n <$list filter=<<plugin-contents-filter>> emptyMessage=<<empty-plugin>> >\n <<plugin-item>>\n </$list>\n \n </div>\n </$list>\n</div>\n</$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js\ntags: \nmodified: 20180207103459780\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [all[XXX]] filter operator function. Such\n * all-filter operators return all tiddlers of a certain \"category\". The parameters\n * to this all-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step. Not of much use here, ignore it for most usecases.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foos = function(source, prefix, options) {\n return [\"foo\", \"bar\", \"baz\"];\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207103459780"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js\ntags: \nmodified: 20180207092452733\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our command and tells TiddlyWiki whether to run it\n * synchronously or asynchronously. The latter use a callback to signal\n * finish or failure (see below).\n */\nexports.info = {\n name: \"foobarbaz\",\n synchronous: true\n};\n\n/* Creates a new command instance. Please note that asynchronous commands will\n * receive a third \"callback\" parameter, which we should store for later use;\n * see below how to use it.\n */\nvar Command = function(params, commander /*, callback */) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n /* this.callback = callback; */\n};\n\n/* Executes our command. For synchronous commands return either null (success)\n * or an error string. For asynchronous commands use the callback instead which\n * we'd receive in the constructor call.\n */\nCommand.prototype.execute = function() {\n /* check your command parameters, which you will find in this.params */\n if (this.params.length < 1) {\n return \"Missing foo parameter\";\n }\n\n /* ... */\n\n return null; /* no error. */\n /* this.callback(); // for async commands */\n};\n\nexports.Command = Command;\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207092452733"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css","created":"20180205162715434","modified":"20180207092942425","type":"text/css","text":"/* add your CSS rules here */\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js\nmodified: 20180207103213628\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and and exports our filter operator function. The parameters\n * to operator functions are as follows:\n *\n * source: a tiddler iterator that represents the resoluts of the previous\n * filter step.\n * operator: the arguments to this filter operator...\n * .operator: name of the filter operator.\n * .operand: the operand as a string; text references and variable names\n * have already been resolved at this point.\n * .prefix: an optional \"!\" if the filter is to be negated.\n * .suffix: an optional string containing an additional filter argument.\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's allowed to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.dofoo = function(source, operator, options) {\n\tvar results = [];\n\tsource(function(tiddler, title) {\n\t\tresults.push(\"foo\" + title);\n\t});\n\treturn results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103213628"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history","created":"20180202212229406","modified":"20180202212958716","tags":"","type":"text/vnd.tiddlywiki","text":"* ''0.0.1'' -- my first plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js\nmodified: 20180207103529498\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [is[XXX]] filter operator function. Such\n * is-filter operators filter tiddlers by a certain \"category\". The parameters\n * to this is-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step, which we now need to filter.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foo = function(source, prefix, options) {\n var results = [];\n\n if (prefix !== \"!\") {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) >= 0) {\n results.push(title);\n }\n });\n } else {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) < 0) {\n results.push(title);\n }\n });\n }\n\n return results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103529498"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js\nmodified: 20180207100549039\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Tells TiddlyWiki the name of our macro through the export mechanism. */\nexports.name = \"foObAr\";\n\n/* Lists of macro parameters; leave this array empty if you need none, or\n * want all supplied macro call parameters to be passed to the run() method.\n */\nexports.params = [\n { name: \"foo\" }, /* 1st parameter name */\n { name: \"bar\", default: \"bar\" }\n];\n\n/* Executes (runs) our macro when it requires evaluation; returns a string\n * value.\n */\nexports.run = function(foo, bar) {\n return foo + bar;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207100549039"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js\nmodified: 20180207095013968\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports/exposes symbols that users of this library can later use\n * after require()'ing a reference to this library.\n */\nexports.dofoo = function () {\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207095013968"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license","created":"20180202222709213","modified":"20180202222730979","tags":"","type":"text/vnd.tiddlywiki","text":"This plugin is licensed under the ..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js\nmodule-type: parser\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Parses blocks of source text into a parse tree. The parameters to the\n * constructor are as follows:\n *\n * type: the (mime type) of the text to parse.\n * text: the text to parse.\n * options:\n * .wiki: TiddlyWiki object reference.\n * ._canonical_uri: ...\n */\nvar Parser = function(type, text, options) {\n this.tree = [{\n \"type\": \"element\", \"tag\": \"code\", \"children\": [{\n \"type\": \"text\", \"text\": text\n }]\n }];\n};\n\n/* Declares the (document) mime types this parser is able to handle; multiple\n * export declarations are supported.\n */\nexports[\"application/x-foo-ducument\"] = Parser;\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"parser"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin","created":"20180202203909068","modified":"20180218193839795","plugin-type":"plugin","tags":"","type":"application/json","text":"{\"tiddlers\": {}}"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme","created":"20180202222539879","modified":"20180202222703851","tags":"","type":"text/vnd.tiddlywiki","text":"Tell your users about your plugin: what is it good for? How can it be used? And so on..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js","text":"/*\\\ncreated: 20180205163726933\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js\nmodified: 20180205164120901\ntype: application/javascript\nmodule-type: startup\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Names this startup module and tells TiddlyWiki to run it either\n * synchronously or asynchronously.\n */\nexports.name = \"foostartup\";\nexports.synchronous = true;\n\n/* Optionally set the order of startup execution */\n/* exports.after = [\"story\"]; */\n/* Optionally set the platforms on which to be executed */\n/* exports.platforms = [\"browser\"]; */\n\n/* Runs this function during startup */\nexports.startup = function() {\n /* do something here... */\n};\n \n})();","created":"20180205163726933","modified":"20180205164120901","type":"application/javascript","module-type":"startup"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template","created":"20180205164155065","modified":"20180205164212763","type":"text/vnd.tiddlywiki","text":"<!-- throw in your TiddlyWiki markup here -->"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js","text":"/*\\\ncreated: 20180211152629856\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js\nmodified: 20180211155735719\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to $tw.config */\nexports.foofoo = 42;\nexports.foobar = {};\n \n})();","created":"20180211152629856","type":"application/javascript","modified":"20180211155735719","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js","text":"/*\\\ncreated: 20180211153224637\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js\nmodified: 20180211153304692\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to the global $tw */\nexports.foofoo = 42;\n \n})();","created":"20180211153224637","type":"application/javascript","modified":"20180211153304692","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro","created":"20180205162715434","modified":"20180207101427201","type":"text/vnd.tiddlywiki","text":"\\define fOObARbAZ()\nfOObARBaZong!\n\\end"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui","created":"20180205164236165","modified":"20180205164237226","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js","text":"/*\\\ncreated: 20180205164319473\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js\nmodified: 20180211153602323\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180205164319473","type":"application/javascript","modified":"20180211153602323"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js","text":"/*\\\ncreated: 20180211153526427\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js\nmodified: 20180211153817740\ntags: \n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Only when running inside a Node.js-based TiddlyWiki server,\n * this creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180211153526427","type":"application/javascript","modified":"20180211153817740","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js","text":"/*\\\ncreated: 20180211154125055\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js\nmodified: 20180211154857371\ntags: \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\n/* Creates a new <$foo> widget. */\nvar FooWidget = function(parseTreeNode, options) {\n this.initialise(parseTreeNode, options);\n};\n \n/* \"Inherits\" from the Widget base \"class\" in order to get all\n * the basic widget functionality.\n */\nFooWidget.prototype = new Widget();\n\n/* Renders this widget into the DOM. */\nFooWidget.prototype.render = function(parent,nextSibling) {\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n /* ... */\n};\n\n/* Computes the internal state of this widget. */\nFooWidget.prototype.execute = function() {\n /* ... */\n this.makeChildWidgets();\n}; \n \n/* Selectively refreshes this widget if needed and returns\n * true if either this widget itself or one of its children\n * needs to be re-rendered.\n */\nFooWidget.prototype.refresh = function(changedTiddlers) {\n var changedAttributes = this.computeAttributes(),\n hasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n if (hasChangedAttributes) {\n /* ... */\n }\n return this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\n/* Finally exports the widget constructor. */\nexports.foo = FooWidget;\n\n})();","created":"20180211154125055","type":"application/javascript","modified":"20180211154857371","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js\ntype: application/javascript\nmodule-type: wikirule\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our wikiparser rule and exports it */\nexports.name = \"dash\";\n/* Export the type(s) of rule, can be \"inline: true\" or/and \"block: true\" */\nexports.types = { inline: true };\n\n/* Initializes the rule and tells the parser when to match */\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /fOO!/mg;\n};\n\n/* Parses markup after the parser has matched out rule. It then returns\n * a parse tree.\n */\nexports.parse = function() {\n\t/* Move past this match */\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: \"foo\"\n\t}];\n};\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"wikirule"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator","caption":"new [all[...]] filter operator","created":"20180207103416636","modified":"20180207103625598","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"allfilterinfix\" title:\"filter.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js\" fields:\"module-type='allfilteroperator'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate","caption":"add plugin boilerplate tiddlers","created":"20180202210615976","modified":"20180211162427574","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"\\define plugin-tiddler-within(title) $:/plugins/$(plugin-name)$/$title$\n\n<$set name=\"old-list\" tiddler=<<plugin-full-path>> field=\"list\">\n<$set name=\"list\" filter=\"[enlist<old-list>] -[[readme]] -[[license]] -[[history]]\">\n<$set name=\"new-list\" filter=\"readme license history [enlist<list>]\">\n<$button class=<<tv-config-toolbar-class>> >\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<plugin-tiddler-within \"history\">> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<plugin-tiddler-within \"license\">> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<plugin-tiddler-within \"readme\">> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme\" />\n<$action-setfield $tiddler=<<plugin-full-path>> list=<<new-list>> />\n<<plugin-boilerplate-icon>>{{!!caption}}\n</$button>\n</$set>\n</$set>\n</$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command","caption":"new command module","created":"20180202223504033","modified":"20180207100039540","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"commandinfix\" title:\"command.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js\" fields:\"module-type='command'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config","caption":"new $tw.config module","created":"20180211155634174","modified":"20180211155728819","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twconfiginfix\" title:\"twconfig.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js\" fields:\"module-type='config'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle","caption":"new CSS tiddler","created":"20180202223710863","modified":"20180207100321397","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"styleinfix\" title:\"style.css\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css\" fields:\"tags='$:/tags/Stylesheet'\">>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator","caption":"new [...[]] filter operator","created":"20180207103225047","modified":"20180207103715611","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"filterinfix\" title:\"filter.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js\" fields:\"module-type='filteroperator'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator","caption":"new [is[...]] filter operator","created":"20180207103539461","modified":"20180207103611302","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"isfilterinfix\" title:\"filter.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js\" fields:\"module-type='isfilteroperator'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro","caption":"new Javascript macro","created":"20180204191504018","modified":"20180207100731291","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"commandinfix\" title:\"macro.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js\" fields:\"module-type='macro'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library","caption":"new Javascript library","created":"20180202223038045","modified":"20180207100520908","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"jslibinfix\" title:\"library.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js\" fields:\"module-type='library'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler","caption":"new wikitext tiddler","created":"20180202224303945","modified":"20180207100850748","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"\" title:\"New Tiddler\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/Tiddler\">>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal","caption":"new $tw globals module","created":"20180211155502716","modified":"20180211155620374","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twglobalinfix\" title:\"twglobal.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js\" fields:\"module-type='global'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro","caption":"new wikitext macro","created":"20180202223619732","modified":"20180207101828276","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twmacroinfix\" title:\"macro\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro\" fields:\"tags='$:/tags/Macro'\">>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util","caption":"new $tw.utils module","created":"20180211155355001","modified":"20180211155426871","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twutilinfix\" title:\"util.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js\" fields:\"module-type='utils'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode","caption":"new Nodejs-only $tw.utils module","created":"20180211155116031","modified":"20180211155445679","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twutilnodeinfix\" title:\"utilnode.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js\" fields:\"module-type='utils-node'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget","caption":"new widget module","created":"20180202223929415","modified":"20180211155035989","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"widgetinfix\" title:\"widget.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js\" fields:\"module-type='widget'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData","created":"20141025150024301","list-before":"$:/core/ui/ViewTemplate/plugin","modified":"20180205194450156","tags":"$:/tags/ViewTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-type-infotiddler(tiddler)\n <$transclude tiddler=\"$tiddler$\">\n <$transclude tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined\"/>\n </$transclude>\n\\end\n\n\\define plugin-type-info(type)\n <$macrocall $name=\"plugin-type-infotiddler\" tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/$type$\"/>\n\\end\n\n\\define plugin-info-row(name, value)\n\\rules except wikilink\n <tr class=\"tfc-plugin-info-element\">\n <td class=\"tfc-plugin-info-element-name\">\n $name$:\n </td>\n <td class=\"tfc-plugin-info-element-value\">\n $value$\n </td>\n </tr>\n\\end\n\n\\define plugin-info-field-unspecified()\n <span class='tfc-plugin-info-unspecified'>unspecified</span>\n\\end\n\n\\define plugin-info-field(name, field)\n <<plugin-info-row \"$name$\" \"<$view field='$field$' format='text'><$macrocall $name='plugin-info-field-unspecified' /></$view>\">>\n\\end\n\n\\define plugin-info-field-plugin-type-int(name, type)\n <$set name=\"desc\" value=<<plugin-type-info \"$type$\" >> >\n <$macrocall $name=\"plugin-info-row\" name=\"$name$\" value=<<desc>> />\n </$set>\n\\end\n\n\\define plugin-info-field-plugin-type(name)\n <$macrocall $name=\"plugin-info-field-plugin-type-int\" name=\"$name$\" type={{!!plugin-type}} />\n\\end\n\n\\define plugin-info-field-link(name, field)\n <$list filter=\"[all[current]!field:$field$[]]\" emptyMessage=\"\"\"<<plugin-info-row \"$name$\" \"<$macrocall $name='plugin-info-field-unspecified'/>\" >>\"\"\">\n <$macrocall $name=\"plugin-info-row\" name=\"$name$\" value={{!!$field$}} />\n </$list>\n\\end\n\n\\define plugin-info-filter(name, filter)\n <$list filter=\"$filter$\" emptyMessage=\"\"\"<<plugin-info-row \"$name$\" \"<$macrocall $name='plugin-info-field-unspecified'/>\" >>\"\"\">\n <$macrocall $name=\"plugin-info-row\" name=\"$name$\" value={{!!title}} />\n </$list>\n\\end\n\n<$list filter=\"[all[current]has[plugin-type]!field:plugin-type[import]]\">\n\n! Plugin Meta Data\n\n<div class=\"tfc-plugin-info\">\n <table class=\"tfc-plugin-info\">\n <$list filter=\"[all[current]removeprefix[$:/plugins/]]\">\n \t<<plugin-info-filter \"Plugin publisher\" \"[all[current]titlecomponents[]first[]]\">>\n \t<<plugin-info-filter \"Plugin name\" \"[all[current]titlecomponents[]nth[2]]\">>\n </$list>\n <$list filter=\"[all[current]removeprefix[$:/themes/]]\">\n \t<<plugin-info-filter \"Theme publisher\" \"[all[current]titlecomponents[]first[]]\">>\n \t<<plugin-info-filter \"Theme name\" \"[all[current]titlecomponents[]nth[2]]\">>\n </$list>\n <$list filter=\"[all[current]prefix[$:/core]]\">\n \t<<plugin-info-row \"Plugin publisher\" \"TiddlyWiki\">>\n <<plugin-info-row \"Plugin name\" \"core\">>\n </$list>\n <<plugin-info-field \"Version\" \"version\">>\n <$macrocall $name=\"plugin-info-field-plugin-type\" name=\"Plugin type\" />\n <<plugin-info-field \"Description\" \"description\">>\n <<plugin-info-field \"Author\" \"author\">>\n <$macrocall $name=\"plugin-info-field-link\" name=\"Source\" field=\"source\" />\n <<plugin-info-field \"Plugin priority\" \"plugin-priority\">>\n <<plugin-info-field \"Required TW Core version\" \"core-version\">>\n </table>\n</div>\n\n</$list>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import","created":"20141025175537027","modified":"20180205194514922","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`import` -- is a special plugin type only used internally by the TiddlyWiki 5 core when importing tiddlers. No ordinary plugin should ever use a plugin type of `import`."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language","created":"20141025180244406","modified":"20141025180805600","type":"text/vnd.tiddlywiki","text":"`language` -- this plugin is a language package for the language \"{{!!name}}\". This language plugin will automatically be used when you select this language in the [[basic settings|$:/core/ui/ControlPanel/Basics]] of the [[control panel|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin","created":"20141025155451829","modified":"20180205194504314","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`plugin` -- this is the most general form of a TiddlyWiki 5 plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme","created":"20141025174630240","modified":"20180205194533069","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`theme` -- contains a TiddlyWiki 5 theme. You can select this theme through the [[theme switcher|$:/core/ui/ControlPanel/Theme]] in the [[control pane|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined","created":"20141025155725392","modified":"20141117190958706","type":"text/vnd.tiddlywiki","text":"<code><$view field=\"plugin-type\"/></code> -- is an ''unknown plugin type''."},"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js","text":"/*\\\ncreated: 20141020111918405\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js\ntype: application/javascript\nmodified: 20141020111927394\nmodule-type: widget\n\nDefault widget: if a particular tiddler is not present,\nthen it gets created using the default values specified.\nIn contrast to the new tiddler creation message, we don't\nuse a static template but instead accept the default values\nin form of a JSON string that may be the result of some\nmacro invokation.\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 EnsureTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEnsureTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEnsureTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEnsureTiddlerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.ensureTitle = this.getAttribute(\"title\",\"currentTiddler\");\n\tthis.ensureDefault = this.getAttribute(\"default\");\n\n var tiddler = this.wiki.getTiddler(this.ensureTitle);\n if(!tiddler) {\n var defaults;\n try {\n defaults = JSON.parse(this.ensureDefault);\n } catch(ex) {\n defaults = {};\n }\n defaults[\"title\"] = this.ensureTitle;\n var mods = this.wiki.getModificationFields();\n this.wiki.addTiddler(new $tw.Tiddler(defaults,mods));\n }\n \n // Construct the 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*/\nEnsureTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.title || changedAttributes.default) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.ensuretiddler = EnsureTiddlerWidget;\n\n})();\n","created":"20141020111918405","type":"application/javascript","modified":"20141020111927394","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js","text":"/*\\\ncreated: 20141015190230115\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js\ntype: application/javascript\nmodified: 20141015190236275\nmodule-type: widget\n\nThe JSON mangler widget -- similar to the fieldmangler widget,\nbut for mangling JSON data in a data tiddler instead of\nmangling the fields of a tiddler.\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\n// The JSON mangler widget understands the following events:\n// * tm-add-json-index: add a new index to a JSON data tiddler, the\n// index name to add is in the event param parameter.\n// * tm-remove-json-index: remove an existing index from a JSON data\n// tiddler, as specified in the event param parameter.\nvar JsonManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-json-index\", handler: \"handleAddJsonIndexEvent\"},\n\t\t{type: \"tm-remove-json-index\", handler: \"handleRemoveJsonIndexEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nJsonManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nJsonManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nJsonManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nJsonManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Add a new index (as specified in the event param parameter) to a JSON\n// data tiddler (specified in the widget title parameter). It is also possible\n// to specify a default value; the event param parameter then needs to be a hashmap\n// with the elements \"index\" (name of index) and \"default\" (default value).\nJsonManglerWidget.prototype.handleAddJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tvar def = (typeof event.param === \"string\") ? \"\" : event.param[\"default\"];\n\tif ( index ) {\n\t\tvar data = tiddler ? this.wiki.getTiddlerData(tiddler, {}) : {};\n\t\tdata[index] = \"\";\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\n// Remove an existing index (as specified in the event param parameter) from a JSON\n// data tiddler (specified in the widget title parameter).\nJsonManglerWidget.prototype.handleRemoveJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tif ( tiddler && index ) {\n\t\tvar data = this.wiki.getTiddlerData(tiddler, {});\n\t\tdelete data[index];\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\nexports.jsonmangler = JsonManglerWidget;\n\n})();\n","created":"20141015190230115","type":"application/javascript","modified":"20141015190236275","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js","text":"/*\\\ncreated: 20141020111936183\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js\ntype: application/javascript\nmodified: 20141020111942403\nmodule-type: widget\n\nThe list mangler widget -- mangles the list field of a\ntiddler. It supports the following parameters:\n* tiddler: the tiddler to work on, default is currentTiddler.\n* field: the field to mangle as a list, default is the list field.\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\n// The list mangler widget understands the following events:\n// * tm-add-list-element\n// * tm-remove-list-element\n// * tm-back-list-element\n// * tm-forward-list-element\nvar ListManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-list-element\", handler: \"handleAddListElementEvent\"},\n\t\t{type: \"tm-remove-list-element\", handler: \"handleRemoveListElementEvent\"},\n\t\t{type: \"tm-shift-forward-list-element\", handler: \"handleShiftForwardListElementEvent\"},\n\t\t{type: \"tm-shift-back-list-element\", handler: \"handleShiftBackListElementEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nListManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nListManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nListManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n this.mangleField = this.getAttribute(\"field\",\"list\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nListManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Appends a new element to the list field (or other anspecified field) of\n// the given tiddler. Ensures that the same element never gets added twice.\n// If the tiddler doesn't exist yet, it will be created.\nListManglerWidget.prototype.handleAddListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle) || new $tw.Tiddler({title: this.mangleTitle});\n var addElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(addElement);\n if(where<0) {\n list.push(addElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n return true;\n};\n\n// Removes an existing element from the list field (or another specified field)\n// of the given tiddler.\nListManglerWidget.prototype.handleRemoveListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var remElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(remElement);\n if(where>=0) {\n list.splice(where,1);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\n// Moves an existing element from the list field (or another specified field)\n// one position forward towards the end of the list of the given tiddler.\nListManglerWidget.prototype.handleShiftForwardListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var shiftElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(shiftElement);\n if((where>=0) && (where<list.length-1)) {\n var swapElement = list[where+1];\n list.splice(where,2,swapElement,shiftElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\n// Moves an existing element from the list field (or another specified field)\n// one position backwards towards the beginning of the list of the given tiddler.\nListManglerWidget.prototype.handleShiftBackListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var shiftElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(shiftElement);\n if(where>=1) {\n var swapElement = list[where-1];\n list.splice(where-1,2,shiftElement,swapElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\nexports.listmangler = ListManglerWidget;\n\n})();\n","created":"20141020111936183","type":"application/javascript","modified":"20141020111942403","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js","text":"/*\\\ncreated: 20140927173129833\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js\ntype: application/javascript\nmodified: 20140927173153432\nmodule-type: widget\n\nmetafy widget\n\nUsed to dump javascript tiddlers correctly as .js files as opposed to .js.tid\nfiles.\n\nwidget attributes:\n* tiddler: defaults to the widget variable currentTiddler.\n* detect: regular expression detecting a meta data section (which may be\n empty). Its parameter #2 indicates where to replace/insert meta data\n when such a section is present. Otherwise, the template parameter will\n be used instead. For instance, the following regular expression composed\n of these elements:\n \"(^\\/\\*\\\\(?:\\r?\\n))\"\n -- the special comment marker at the section beginning on its own line.\n \"((?:^[^\\r\\n]+(?:\\r?\\n))*)\"\n -- matches all meta data field lines.\n \"(?:(?:^[^\\r\\n]*(?:\\r?\\n))*)\"\n -- matches a trailing normal comment text.\n \"(?:^\\\\\\*\\/(?:\\r?\\n)?)\"\n -- the special comment marker at the section end on its own line.\n* exclude: the fields to exclude; defaults to \"text bag revision\".\n* template: template to use to establish meta data section if not yet present.\n $fields$ is used to indicate where to insert the fields (meta) data section of\n \"field: value\\n\" pairs. For instance, \"/*\\\\\\n$fields$\\\\*\"+\"/\\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\n/*\nConstructor\n */\nvar MetafyWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n\n/*\nInherit from the base widget class\n*/\nMetafyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMetafyWidget.prototype.render = function(parent, nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode, nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMetafyWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.metafyTitle = this.getAttribute(\"tiddler\", this.getVariable(\"currentTiddler\"));\n\tthis.metafyDetect = this.getAttribute(\"match\",\n\t\t \"(^\\\\/\\\\*\\\\\\\\(?:\\\\r?\\\\n))\" // special comment marker beginning\n\t\t+ \"((?:^[^\\\\r\\\\n]+(?:\\\\r?\\\\n))*)\" // field name-value pairs\n\t\t+ \"(?:(?:^[^\\\\r\\\\n]*(?:\\\\r?\\\\n))*)\" // remaining comment section\n\t\t+ \"(?:^\\\\\\\\\\\\*\\\\/(?:\\\\r?\\\\n)?)\" // special comment marker end\n\t);\n\tvar exclude = this.getAttribute(\"exclude\", \"text bag revision\");\n\texclude = exclude.split(\" \");\n\tthis.metafyExclude = exclude;\n\tthis.metafyTemplate = this.getAttribute(\"template\", \"/*\\\\\\n$fields$\\\\*/\\n\");\n\t\n\tvar tiddler = this.wiki.getTiddler(this.metafyTitle);\n\tvar text = \"\";\n\tif (tiddler) {\n\t\ttext = this.wiki.getTiddlerText(this.metafyTitle);\n\t}\n\t\n\tvar fields = \"\";\n\tfor(var field in tiddler.fields) {\n\t\tif (exclude.indexOf(field) === -1) {\n\t\t\tfields += field + \": \" + tiddler.getFieldString(field) + \"\\n\";\n\t\t}\n\t}\n\t\n\tvar match = new RegExp(this.metafyDetect, \"mg\").exec(text);\n\tif (match) {\n\t\tvar start = match.index + match[1].length;\n\t\ttext = text.substr(0, start) + fields + text.substr(start + match[2].length);\n\t} else {\n\t\tconsole.log(\"no match\");\n\t\ttext = this.metafyTemplate.replace(\"$fields$\", fields) + text;\n\t}\n\t\n\tthis.text = text;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMetafyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.detect || changedAttributes.exclude || changedAttributes.template || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nExport the metafy widget\n */\nexports.metafy = MetafyWidget;\n\n})();\n","created":"20140927173129833","type":"application/javascript","modified":"20140927173153432","module-type":"widget"}}}
+
+
Default More Sidebar Tab
+
+
+
Specify which More sidebar tab is displayed by default
+
+
+
{"tiddlers":{"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js","text":"/*\\\ncreated: 20141003161333154\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js\nmodified: 20141003161445164\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// Because sometimes you need to style the cursor's line.\n//\n// Adds an option 'styleActiveLine' which, when enabled, gives the\n// active line's wrapping <div> the CSS class \"CodeMirror-activeline\",\n// and gives its background <div> the class \"CodeMirror-activeline-background\".\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n var WRAP_CLASS = \"CodeMirror-activeline\";\n var BACK_CLASS = \"CodeMirror-activeline-background\";\n\n CodeMirror.defineOption(\"styleActiveLine\", false, function(cm, val, old) {\n var prev = old && old != CodeMirror.Init;\n if (val && !prev) {\n cm.state.activeLines = [];\n updateActiveLines(cm, cm.listSelections());\n cm.on(\"beforeSelectionChange\", selectionChange);\n } else if (!val && prev) {\n cm.off(\"beforeSelectionChange\", selectionChange);\n clearActiveLines(cm);\n delete cm.state.activeLines;\n }\n });\n\n function clearActiveLines(cm) {\n for (var i = 0; i < cm.state.activeLines.length; i++) {\n cm.removeLineClass(cm.state.activeLines[i], \"wrap\", WRAP_CLASS);\n cm.removeLineClass(cm.state.activeLines[i], \"background\", BACK_CLASS);\n }\n }\n\n function sameArray(a, b) {\n if (a.length != b.length) return false;\n for (var i = 0; i < a.length; i++)\n if (a[i] != b[i]) return false;\n return true;\n }\n\n function updateActiveLines(cm, ranges) {\n var active = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) continue;\n var line = cm.getLineHandleVisualStart(range.head.line);\n if (active[active.length - 1] != line) active.push(line);\n }\n if (sameArray(cm.state.activeLines, active)) return;\n cm.operation(function() {\n clearActiveLines(cm);\n for (var i = 0; i < active.length; i++) {\n cm.addLineClass(active[i], \"wrap\", WRAP_CLASS);\n cm.addLineClass(active[i], \"background\", BACK_CLASS);\n }\n cm.state.activeLines = active;\n });\n }\n\n function selectionChange(cm, sel) {\n updateActiveLines(cm, sel.ranges);\n }\n});\n","created":"20141003161333154","modified":"20141003161445164","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js","text":"/*\\\ncreated: 20141003162651180\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js\nmodified: 20141003162818850\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n var indentUnit = config.indentUnit,\n tokenHooks = parserConfig.tokenHooks,\n mediaTypes = parserConfig.mediaTypes || {},\n mediaFeatures = parserConfig.mediaFeatures || {},\n propertyKeywords = parserConfig.propertyKeywords || {},\n nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n colorKeywords = parserConfig.colorKeywords || {},\n valueKeywords = parserConfig.valueKeywords || {},\n fontProperties = parserConfig.fontProperties || {},\n allowNested = parserConfig.allowNested;\n\n var type, override;\n function ret(style, tp) { type = tp; return style; }\n\n // Tokenizers\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (tokenHooks[ch]) {\n var result = tokenHooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == \"@\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"def\", stream.current());\n } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n return ret(null, \"compare\");\n } else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \"#\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"atom\", \"hash\");\n } else if (ch == \"!\") {\n stream.match(/^\\s*\\w*/);\n return ret(\"keyword\", \"important\");\n } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (ch === \"-\") {\n if (/[\\d.]/.test(stream.peek())) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (stream.match(/^\\w+-/)) {\n return ret(\"meta\", \"meta\");\n }\n } else if (/[,+>*\\/]/.test(ch)) {\n return ret(null, \"select-op\");\n } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n return ret(\"qualifier\", \"qualifier\");\n } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n return ret(null, ch);\n } else if (ch == \"u\" && stream.match(\"rl(\")) {\n stream.backUp(1);\n state.tokenize = tokenParenthesized;\n return ret(\"property\", \"word\");\n } else if (/[\\w\\\\\\-]/.test(ch)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"property\", \"word\");\n } else {\n return ret(null, null);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n if (quote == \")\") stream.backUp(1);\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenParenthesized(stream, state) {\n stream.next(); // Must be '('\n if (!stream.match(/\\s*[\\\"\\')]/, false))\n state.tokenize = tokenString(\")\");\n else\n state.tokenize = null;\n return ret(null, \"(\");\n }\n\n // Context management\n\n function Context(type, indent, prev) {\n this.type = type;\n this.indent = indent;\n this.prev = prev;\n }\n\n function pushContext(state, stream, type) {\n state.context = new Context(type, stream.indentation() + indentUnit, state.context);\n return type;\n }\n\n function popContext(state) {\n state.context = state.context.prev;\n return state.context.type;\n }\n\n function pass(type, stream, state) {\n return states[state.context.type](type, stream, state);\n }\n function popAndPass(type, stream, state, n) {\n for (var i = n || 1; i > 0; i--)\n state.context = state.context.prev;\n return pass(type, stream, state);\n }\n\n // Parser\n\n function wordAsValue(stream) {\n var word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"variable\";\n }\n\n var states = {};\n\n states.top = function(type, stream, state) {\n if (type == \"{\") {\n return pushContext(state, stream, \"block\");\n } else if (type == \"}\" && state.context.prev) {\n return popContext(state);\n } else if (type == \"@media\") {\n return pushContext(state, stream, \"media\");\n } else if (type == \"@font-face\") {\n return \"font_face_before\";\n } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {\n return \"keyframes\";\n } else if (type && type.charAt(0) == \"@\") {\n return pushContext(state, stream, \"at\");\n } else if (type == \"hash\") {\n override = \"builtin\";\n } else if (type == \"word\") {\n override = \"tag\";\n } else if (type == \"variable-definition\") {\n return \"maybeprop\";\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n } else if (type == \":\") {\n return \"pseudo\";\n } else if (allowNested && type == \"(\") {\n return pushContext(state, stream, \"parens\");\n }\n return state.context.type;\n };\n\n states.block = function(type, stream, state) {\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (propertyKeywords.hasOwnProperty(word)) {\n override = \"property\";\n return \"maybeprop\";\n } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n override = \"string-2\";\n return \"maybeprop\";\n } else if (allowNested) {\n override = stream.match(/^\\s*:/, false) ? \"property\" : \"tag\";\n return \"block\";\n } else {\n override += \" error\";\n return \"maybeprop\";\n }\n } else if (type == \"meta\") {\n return \"block\";\n } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n override = \"error\";\n return \"block\";\n } else {\n return states.top(type, stream, state);\n }\n };\n\n states.maybeprop = function(type, stream, state) {\n if (type == \":\") return pushContext(state, stream, \"prop\");\n return pass(type, stream, state);\n };\n\n states.prop = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n if (type == \"hash\" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {\n override += \" error\";\n } else if (type == \"word\") {\n wordAsValue(stream);\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n }\n return \"prop\";\n };\n\n states.propBlock = function(type, _stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n return state.context.type;\n };\n\n states.parens = function(type, stream, state) {\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \")\") return popContext(state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n if (type == \"word\") wordAsValue(stream);\n return \"parens\";\n };\n\n states.pseudo = function(type, stream, state) {\n if (type == \"word\") {\n override = \"variable-3\";\n return state.context.type;\n }\n return pass(type, stream, state);\n };\n\n states.media = function(type, stream, state) {\n if (type == \"(\") return pushContext(state, stream, \"media_parens\");\n if (type == \"}\") return popAndPass(type, stream, state);\n if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (word == \"only\" || word == \"not\" || word == \"and\")\n override = \"keyword\";\n else if (mediaTypes.hasOwnProperty(word))\n override = \"attribute\";\n else if (mediaFeatures.hasOwnProperty(word))\n override = \"property\";\n else\n override = \"error\";\n }\n return state.context.type;\n };\n\n states.media_parens = function(type, stream, state) {\n if (type == \")\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n return states.media(type, stream, state);\n };\n\n states.font_face_before = function(type, stream, state) {\n if (type == \"{\")\n return pushContext(state, stream, \"font_face\");\n return pass(type, stream, state);\n };\n\n states.font_face = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") {\n if (!fontProperties.hasOwnProperty(stream.current().toLowerCase()))\n override = \"error\";\n else\n override = \"property\";\n return \"maybeprop\";\n }\n return \"font_face\";\n };\n\n states.keyframes = function(type, stream, state) {\n if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n if (type == \"{\") return pushContext(state, stream, \"top\");\n return pass(type, stream, state);\n };\n\n states.at = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"tag\";\n else if (type == \"hash\") override = \"builtin\";\n return \"at\";\n };\n\n states.interpolation = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n if (type != \"variable\") override = \"error\";\n return \"interpolation\";\n };\n\n return {\n startState: function(base) {\n return {tokenize: null,\n state: \"top\",\n context: new Context(\"top\", base || 0, null)};\n },\n\n token: function(stream, state) {\n if (!state.tokenize && stream.eatSpace()) return null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style && typeof style == \"object\") {\n type = style[1];\n style = style[0];\n }\n override = style;\n state.state = states[state.state](type, stream, state);\n return override;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context, ch = textAfter && textAfter.charAt(0);\n var indent = cx.indent;\n if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n if (cx.prev &&\n (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" || cx.type == \"interpolation\" || cx.type == \"font_face\") ||\n ch == \")\" && (cx.type == \"parens\" || cx.type == \"media_parens\") ||\n ch == \"{\" && (cx.type == \"at\" || cx.type == \"media\"))) {\n indent = cx.indent - indentUnit;\n cx = cx.prev;\n }\n return indent;\n },\n\n electricChars: \"}\",\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n fold: \"brace\"\n };\n});\n\n function keySet(array) {\n var keys = {};\n for (var i = 0; i < array.length; ++i) {\n keys[array[i]] = true;\n }\n return keys;\n }\n\n var mediaTypes_ = [\n \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n \"tty\", \"tv\", \"embossed\"\n ], mediaTypes = keySet(mediaTypes_);\n\n var mediaFeatures_ = [\n \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n \"min-resolution\", \"max-resolution\", \"scan\", \"grid\"\n ], mediaFeatures = keySet(mediaFeatures_);\n\n var propertyKeywords_ = [\n \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n \"alignment-baseline\", \"anchor-point\", \"animation\", \"animation-delay\",\n \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n \"animation-timing-function\", \"appearance\", \"azimuth\", \"backface-visibility\",\n \"background\", \"background-attachment\", \"background-clip\", \"background-color\",\n \"background-image\", \"background-origin\", \"background-position\",\n \"background-repeat\", \"background-size\", \"baseline-shift\", \"binding\",\n \"bleed\", \"bookmark-label\", \"bookmark-level\", \"bookmark-state\",\n \"bookmark-target\", \"border\", \"border-bottom\", \"border-bottom-color\",\n \"border-bottom-left-radius\", \"border-bottom-right-radius\",\n \"border-bottom-style\", \"border-bottom-width\", \"border-collapse\",\n \"border-color\", \"border-image\", \"border-image-outset\",\n \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n \"border-image-width\", \"border-left\", \"border-left-color\",\n \"border-left-style\", \"border-left-width\", \"border-radius\", \"border-right\",\n \"border-right-color\", \"border-right-style\", \"border-right-width\",\n \"border-spacing\", \"border-style\", \"border-top\", \"border-top-color\",\n \"border-top-left-radius\", \"border-top-right-radius\", \"border-top-style\",\n \"border-top-width\", \"border-width\", \"bottom\", \"box-decoration-break\",\n \"box-shadow\", \"box-sizing\", \"break-after\", \"break-before\", \"break-inside\",\n \"caption-side\", \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\",\n \"column-fill\", \"column-gap\", \"column-rule\", \"column-rule-color\",\n \"column-rule-style\", \"column-rule-width\", \"column-span\", \"column-width\",\n \"columns\", \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\",\n \"cue-after\", \"cue-before\", \"cursor\", \"direction\", \"display\",\n \"dominant-baseline\", \"drop-initial-after-adjust\",\n \"drop-initial-after-align\", \"drop-initial-before-adjust\",\n \"drop-initial-before-align\", \"drop-initial-size\", \"drop-initial-value\",\n \"elevation\", \"empty-cells\", \"fit\", \"fit-position\", \"flex\", \"flex-basis\",\n \"flex-direction\", \"flex-flow\", \"flex-grow\", \"flex-shrink\", \"flex-wrap\",\n \"float\", \"float-offset\", \"flow-from\", \"flow-into\", \"font\", \"font-feature-settings\",\n \"font-family\", \"font-kerning\", \"font-language-override\", \"font-size\", \"font-size-adjust\",\n \"font-stretch\", \"font-style\", \"font-synthesis\", \"font-variant\",\n \"font-variant-alternates\", \"font-variant-caps\", \"font-variant-east-asian\",\n \"font-variant-ligatures\", \"font-variant-numeric\", \"font-variant-position\",\n \"font-weight\", \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\",\n \"grid-auto-position\", \"grid-auto-rows\", \"grid-column\", \"grid-column-end\",\n \"grid-column-start\", \"grid-row\", \"grid-row-end\", \"grid-row-start\",\n \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\",\n \"icon\", \"image-orientation\", \"image-rendering\", \"image-resolution\",\n \"inline-box-align\", \"justify-content\", \"left\", \"letter-spacing\",\n \"line-break\", \"line-height\", \"line-stacking\", \"line-stacking-ruby\",\n \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\",\n \"marker-offset\", \"marks\", \"marquee-direction\", \"marquee-loop\",\n \"marquee-play-count\", \"marquee-speed\", \"marquee-style\", \"max-height\",\n \"max-width\", \"min-height\", \"min-width\", \"move-to\", \"nav-down\", \"nav-index\",\n \"nav-left\", \"nav-right\", \"nav-up\", \"object-fit\", \"object-position\",\n \"opacity\", \"order\", \"orphans\", \"outline\",\n \"outline-color\", \"outline-offset\", \"outline-style\", \"outline-width\",\n \"overflow\", \"overflow-style\", \"overflow-wrap\", \"overflow-x\", \"overflow-y\",\n \"padding\", \"padding-bottom\", \"padding-left\", \"padding-right\", \"padding-top\",\n \"page\", \"page-break-after\", \"page-break-before\", \"page-break-inside\",\n \"page-policy\", \"pause\", \"pause-after\", \"pause-before\", \"perspective\",\n \"perspective-origin\", \"pitch\", \"pitch-range\", \"play-during\", \"position\",\n \"presentation-level\", \"punctuation-trim\", \"quotes\", \"region-break-after\",\n \"region-break-before\", \"region-break-inside\", \"region-fragment\",\n \"rendering-intent\", \"resize\", \"rest\", \"rest-after\", \"rest-before\", \"richness\",\n \"right\", \"rotation\", \"rotation-point\", \"ruby-align\", \"ruby-overhang\",\n \"ruby-position\", \"ruby-span\", \"shape-image-threshold\", \"shape-inside\", \"shape-margin\",\n \"shape-outside\", \"size\", \"speak\", \"speak-as\", \"speak-header\",\n \"speak-numeral\", \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\",\n \"tab-size\", \"table-layout\", \"target\", \"target-name\", \"target-new\",\n \"target-position\", \"text-align\", \"text-align-last\", \"text-decoration\",\n \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n \"text-decoration-style\", \"text-emphasis\", \"text-emphasis-color\",\n \"text-emphasis-position\", \"text-emphasis-style\", \"text-height\",\n \"text-indent\", \"text-justify\", \"text-outline\", \"text-overflow\", \"text-shadow\",\n \"text-size-adjust\", \"text-space-collapse\", \"text-transform\", \"text-underline-position\",\n \"text-wrap\", \"top\", \"transform\", \"transform-origin\", \"transform-style\",\n \"transition\", \"transition-delay\", \"transition-duration\",\n \"transition-property\", \"transition-timing-function\", \"unicode-bidi\",\n \"vertical-align\", \"visibility\", \"voice-balance\", \"voice-duration\",\n \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\", \"voice-stress\",\n \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\", \"word-break\",\n \"word-spacing\", \"word-wrap\", \"z-index\",\n // SVG-specific\n \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n \"color-interpolation\", \"color-interpolation-filters\",\n \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"shape-rendering\", \"stroke\",\n \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\"\n ], propertyKeywords = keySet(propertyKeywords_);\n\n var nonStandardPropertyKeywords_ = [\n \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n \"scrollbar-3d-light-color\", \"scrollbar-track-color\", \"shape-inside\",\n \"searchfield-cancel-button\", \"searchfield-decoration\", \"searchfield-results-button\",\n \"searchfield-results-decoration\", \"zoom\"\n ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n var colorKeywords_ = [\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n \"whitesmoke\", \"yellow\", \"yellowgreen\"\n ], colorKeywords = keySet(colorKeywords_);\n\n var valueKeywords_ = [\n \"above\", \"absolute\", \"activeborder\", \"activecaption\", \"afar\",\n \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alternate\",\n \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n \"arabic-indic\", \"armenian\", \"asterisks\", \"auto\", \"avoid\", \"avoid-column\", \"avoid-page\",\n \"avoid-region\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"button\", \"button-bevel\",\n \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"cambodian\",\n \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-earthly-branch\",\n \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n \"col-resize\", \"collapse\", \"column\", \"compact\", \"condensed\", \"contain\", \"content\",\n \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"cover\", \"crop\",\n \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"dashed\", \"decimal\",\n \"decimal-leading-zero\", \"default\", \"default-button\", \"destination-atop\",\n \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\",\n \"disc\", \"discard\", \"document\", \"dot-dash\", \"dot-dot-dash\", \"dotted\",\n \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\",\n \"ethiopic-halehame-tig\", \"ew-resize\", \"expanded\", \"extra-condensed\",\n \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fixed\", \"flat\", \"footnotes\",\n \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"groove\",\n \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hebrew\",\n \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"icon\", \"ignore\",\n \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n \"inline-block\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n \"italic\", \"justify\", \"kannada\", \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\",\n \"line-through\", \"linear\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n \"lower-roman\", \"lowercase\", \"ltr\", \"malayalam\", \"match\",\n \"media-controls-background\", \"media-current-time-display\",\n \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n \"media-return-to-realtime-button\", \"media-rewind-button\",\n \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"myanmar\", \"n-resize\",\n \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n \"ns-resize\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"open-quote\",\n \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n \"painted\", \"page\", \"paused\", \"persian\", \"plus-darker\", \"plus-lighter\", \"pointer\",\n \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\", \"progress\", \"push-button\",\n \"radio\", \"read-only\", \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n \"relative\", \"repeat\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\", \"rgb\", \"rgba\",\n \"ridge\", \"right\", \"round\", \"row-resize\", \"rtl\", \"run-in\", \"running\",\n \"s-resize\", \"sans-serif\", \"scroll\", \"scrollbar\", \"se-resize\", \"searchfield\",\n \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\",\n \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n \"single\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"solid\", \"somali\",\n \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"square\",\n \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\",\n \"sub\", \"subpixel-antialiased\", \"super\", \"sw-resize\", \"table\",\n \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"up\",\n \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n \"vertical\", \"vertical-text\", \"visible\", \"visibleFill\", \"visiblePainted\",\n \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n \"window\", \"windowframe\", \"windowtext\", \"x-large\", \"x-small\", \"xor\",\n \"xx-large\", \"xx-small\"\n ], valueKeywords = keySet(valueKeywords_);\n\n var fontProperties_ = [\n \"font-family\", \"src\", \"unicode-range\", \"font-variant\", \"font-feature-settings\",\n \"font-stretch\", \"font-weight\", \"font-style\"\n ], fontProperties = keySet(fontProperties_);\n\n var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_)\n .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);\n CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n function tokenCComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (maybeEnd && ch == \"/\") {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return [\"comment\", \"comment\"];\n }\n\n function tokenSGMLComment(stream, state) {\n if (stream.skipTo(\"-->\")) {\n stream.match(\"-->\");\n state.tokenize = null;\n } else {\n stream.skipToEnd();\n }\n return [\"comment\", \"comment\"];\n }\n\n CodeMirror.defineMIME(\"text/css\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n tokenHooks: {\n \"<\": function(stream, state) {\n if (!stream.match(\"!--\")) return false;\n state.tokenize = tokenSGMLComment;\n return tokenSGMLComment(stream, state);\n },\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\"\n });\n\n CodeMirror.defineMIME(\"text/x-scss\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \":\": function(stream) {\n if (stream.match(/\\s*\\{/))\n return [null, \"{\"];\n return false;\n },\n \"$\": function(stream) {\n stream.match(/^[\\w-]+/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"#\": function(stream) {\n if (!stream.eat(\"{\")) return false;\n return [null, \"interpolation\"];\n }\n },\n name: \"css\",\n helperType: \"scss\"\n });\n\n CodeMirror.defineMIME(\"text/x-less\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \"@\": function(stream) {\n if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/, false)) return false;\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"&\": function() {\n return [\"atom\", \"atom\"];\n }\n },\n name: \"css\",\n helperType: \"less\"\n });\n\n});\n","created":"20141003162651180","modified":"20141003162818850","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js","text":"/*\\\ncreated: 20140927171850335\nmodified: 20141003155657361\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js\ntype: application/javascript\nmodule-type: command\n\nThe packplugin command packages source tiddlers (ordinary\ntiddlers) into a plugin tiddler:\n--packplugin <plugin title>\n\nPlease note that the plugin tiddler must be correctly set\nup in that it is of type \"application/json\" and also\nthe plugin-type is set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"packplugin\",\n\tsynchronous: true\n};\n\n\nvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\n\nvar Command = function(params, commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 1) {\n\t\treturn \"Missing plugin title\";\n\t}\n\tvar pluginTitle = this.params[0];\n\tvar filter = this.params[1];\n\n\t// Get the plug-in self-description tiddler. If it doesn't exist,\n\t// bail out as the plugin developer needs to provide a plugin tiddler\n\t// with the required self-description.\n\tthis.logger.log(\"making plugin:\", pluginTitle);\n\tthis.logger.log(\"using filter for packing:\", filter);\n\treturn thirdflow.packagePlugin($tw.wiki, pluginTitle, filter);\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927171850335","modified":"20141003155657361","type":"application/javascript","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js","text":"/*\\\ncreated: 20180217143029574\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js\ntags:\nmodified: 20180217143211351\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n name: \"releasedemowiki\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLER = \"$:/config/ThirdFlow/demowiki\";\nvar DEFAULT_DEMOWIKI_TEMPLATE = \"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources\";\n\n\n/* Creates a new command instance to release a demo wiki. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Releases this wiki as a plugin-demo wiki. */\nCommand.prototype.execute = function() {\n var self = this;\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var path = require(\"path\");\n var fs = require(\"fs\");\n\n var config = $tw.wiki.getTiddler(RELEASE_CONFIG_TIDDLER);\n if (!config) {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_DEMOWIKI_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing demowiki to:\", filename);\n var content = $tw.wiki.renderTiddler(\"text/plain\", template);\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n self.logger.alert(\"cannot create file directories\");\n return err;\n }\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n }\n }\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180217143029574","type":"application/javascript","tags":"","modified":"20180217143211351","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js","text":"/*\\\ncreated: 20180212171824929\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js\ntags:\nmodified: 20180212172043868\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Exports our --releaseplugins command, which packages all plugins marked for\n * release in this wiki, and then writes them to the local filesystem.\n */\nexports.info = {\n name: \"releaseplugins\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLERS_PREFIX = \"$:/config/ThirdFlow/plugins\";\nvar RELEASE_CONFIG_FILTER = \"[prefix[\" + RELEASE_CONFIG_TIDDLERS_PREFIX + \"/]]\";\nvar DEFAULT_TID_TEMPLATE = \"$:/core/templates/tid-tiddler\";\n\n\n/* Creates a new command instance. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Executes our command. */\nCommand.prototype.execute = function() {\n var self = this;\n /* check your command parameters, which you will find in this.params */\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n var path = require(\"path\");\n\n // Retrieve the release configuration tiddlers, then iterate over them\n // and package and render those plugins for which release is enabled.\n // Plugin-release config tiddler fields:\n // release: must be \"yes\" to trigger release, otherwise the release config\n // data gets ignored.\n // text: mandatory name of plugin file name.\n // template: optional title of a tempplate tiddler to be used for rendering\n // the plugin output file.\n var releaseConfigs = $tw.wiki.filterTiddlers(RELEASE_CONFIG_FILTER);\n self.logger.log(\"release config tiddlers found:\", releaseConfigs.length);\n $tw.utils.each(releaseConfigs, function(title) {\n var pluginTitle = title.substr(RELEASE_CONFIG_TIDDLERS_PREFIX.length + 1);\n var config = $tw.wiki.getTiddler(title);\n if (config) {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_TID_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping:\", pluginTitle);\n } else {\n // (1) pack the plugin tiddler\n self.logger.log(\"packaging:\", pluginTitle);\n var err = thirdflow.packagePlugin($tw.wiki, pluginTitle);\n if (!err) {\n // (2) write the plugin tiddler\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing to:\", filename);\n err = thirdflow.renderTiddlerWithTemplate(\n self.commander.wiki, pluginTitle, template, filename\n );\n if (err) {\n self.logger.alert(\"writing failed:\", err);\n return err;\n }\n } else {\n self.logger.alert(\"packaging failed:\", err);\n return err;\n }\n }\n }\n });\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180212171824929","type":"application/javascript","tags":"","modified":"20180212172043868","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js","text":"/*\\\ncreated: 20140927173011680\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js\ntype: application/javascript\nmodified: 20140927173032181\nmodule-type: command\n\nCommand to render a single tiddler using a template.\n--rendertemplatedtiddler <title> <template> <file>\n\nCommand to render a single tiddler using a template to a specific file.\nIn comparism to --rendertiddler this command variant accepts a template\nbut only works on a single tiddler. This allows us to avoid having specific\ntemplate tiddlers including the filter set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"rendertemplatedtiddler\",\n\tsynchronous: true\n};\n\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 3) {\n\t\treturn \"Missing template or filename\";\n\t}\n\tvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\tvar path = require(\"path\");\n\tvar title = this.params[0];\n\tvar template = this.params[1];\n\tvar filename = path.resolve(this.commander.outputPath, this.params[2]);\n\t// Save the tiddler as a self contained templated file\n thirdflow.renderTiddlerWithTemplate(\n\t\tthis.commander.wiki,\n\t\ttitle,\n\t\ttemplate,\n\t\tfilename\n\t);\n this.logger.log(\"rendered tiddler\", title, \"to\", filename);\n\treturn null; // done fine\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927173011680","type":"application/javascript","modified":"20140927173032181","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix","created":"20180203172801606","modified":"20180203172814315","tags":"","type":"text/vnd.tiddlywiki","text":"filters/all"},"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix","created":"20180203170629108","modified":"20180203170648166","tags":"","type":"text/vnd.tiddlywiki","text":"commands"},"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix","created":"20180203172725023","modified":"20180203172738692","tags":"","type":"text/vnd.tiddlywiki","text":"filters"},"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix","created":"20180203172744547","modified":"20180203172757212","tags":"","type":"text/vnd.tiddlywiki","text":"filters/is"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix","created":"20180203173603786","modified":"20180203173625412","tags":"","type":"text/vnd.tiddlywiki","text":"libs"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix","created":"20180203172945642","modified":"20180203172956320","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix","created":"20180203172818867","modified":"20180203172921843","tags":"","type":"text/vnd.tiddlywiki","text":"parsers"},"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix","created":"20180203173103664","modified":"20180203173117022","tags":"","type":"text/vnd.tiddlywiki","text":"startups"},"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix","created":"20180203173153198","modified":"20180203173208873","tags":"","type":"text/vnd.tiddlywiki","text":"styles"},"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix","created":"20180203173215242","modified":"20180203173234383","tags":"","type":"text/vnd.tiddlywiki","text":"templates"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix","created":"20180207102757523","modified":"20180211155919528","tags":"","type":"text/vnd.tiddlywiki","text":"config"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix","created":"20180207102840528","modified":"20180207102855322","tags":"","type":"text/vnd.tiddlywiki","text":"globals"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix","created":"20180203172853288","modified":"20180203172905835","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix","created":"20180207102731921","modified":"20180207103054605","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix","created":"20180207102537150","modified":"20180207102719509","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix","created":"20180203173239752","modified":"20180203173248899","tags":"","type":"text/vnd.tiddlywiki","text":"ui"},"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix","created":"20180203173311648","modified":"20180203173326083","tags":"","type":"text/vnd.tiddlywiki","text":"widgets"},"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix","created":"20180203173001192","modified":"20180205162648345","tags":"","type":"text/vnd.tiddlywiki","text":"parsers/wikiparser/rules"},"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js","text":"/*\\\ncreated: 20140927173349128\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js\ntype: application/javascript\nmodified: 20140927173409192\nmodule-type: isfilteroperator\n\nFilter function for [is[shadowinsync]]\n a tiddler is shadowsynced when an ordinary tiddler also has\n a shadow tiddler *AND* the shadow tiddler is the same as the\n real tiddler. This is decided on the basis of type, and the\n creation and modification dates.\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.shadowinsync = function(source,prefix,options) {\n\tvar results = [];\n\tvar invert = prefix === \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar match = invert;\n\t\tvar pluginTitle = options.wiki.getShadowSource(title);\n\t\tif(pluginTitle) {\n\t\t\tvar pluginInfo = options.wiki.getPluginInfo(pluginTitle),\n\t\t\t\tshadow = pluginInfo.tiddlers[title];\n\t\t\tif ( (tiddler.fields.type == shadow.type)\n\t\t\t && (tiddler.getFieldString(\"created\") === shadow.created)\n\t\t\t\t && (tiddler.getFieldString(\"modified\") === shadow.modified) ) {\n\t\t\t\tmatch = !match;\n\t\t\t}\n\t\t}\n\t\tif ( match ) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","created":"20140927173349128","type":"application/javascript","modified":"20140927173409192","module-type":"isfilteroperator"},"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js","text":"/*\\\ncreated: 20141117182000659\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js\nmodified: 20180217161013611\nmodule-type: filteroperator\n\nFilter operator for splitting a title containing slashes as separators\ninto its components.\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.titlecomponents = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n var components = title.split(\"/\");\n var idx;\n var l = components.length;\n for ( idx = 0; idx < l; idx++ ) {\n results.push(components[idx]);\n }\n\t});\n\treturn results;\n};\n\n})();\n","created":"20141117182000659","type":"application/javascript","modified":"20180217161013611","module-type":"filteroperator"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js\ntype: application/javascript\npriority: 0\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/enableautomaticsubfolders\";\nvar automaticSubfoldersEnabled;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tautomaticSubfoldersEnabled = $tw.wiki.getTiddlerText(configTiddler, \"yes\") === \"yes\";\n\tthis.logger.log(\"folder policy config: default: hierarchical subfolders are \" + (automaticSubfoldersEnabled ? \"enabled\" : \"disabled\"));\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(!options.draft && automaticSubfoldersEnabled) {\n\t\toptions.subfolder = this.subfoldersFromTitle(title);\n\t\toptions.name = this.leafFromTitle(title);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"0"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js\ntype: application/javascript\npriority: 200\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/draftfoldername\";\nvar draftFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tdraftFolderName = $tw.wiki.getTiddlerText(configTiddler, \"drafts\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: draft: draft subfolder is: \" + draftFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(options.draft) {\n\t\toptions.subfolder = draftFolderName;\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"200"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js\ntype: application/javascript\npriority: 100\n\nThis folder usher handles system tiddlers and places them into their\nown separate system folder and then into hierarchical subfolders according\nto their title. The exact name of the system folder is configurable.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/systemfoldername\";\nvar systemFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tsystemFolderName = $tw.wiki.getTiddlerText(configTiddler, \"system\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: system: system subfolder is: \" + systemFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft && title.substr(0, 3) === \"$:/\") {\n\t\tvar posTitle = title.lastIndexOf(\"/\");\n\t\toptions.subfolder = systemFolderName + title.substr(2, posTitle - 2);\n\t\toptions.name = title.substr(posTitle + 1);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"100"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js\ntype: application/javascript\npriority: 50\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddlerBase = \"$:/config/FileStorage/tagfolders\";\nvar tagFolders;\nvar tagList;\n\n// The configuration tiddlers to monitor for changes\nexports.watch = \"[field:title[\" + configTiddlerBase + \"]] [prefix[\" + configTiddlerBase + \"/]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tvar self = this;\n \n var cfgTiddler = $tw.wiki.getTiddler(configTiddlerBase);\n tagList = $tw.utils.parseStringArray((cfgTiddler && cfgTiddler.fields.list) || \"\");\n var cfgTags = $tw.wiki.filterTiddlers(\"[prefix[\" + configTiddlerBase + \"/]]\");\n tagFolders = {};\n \n $tw.utils.each(tagList, function(tag) {\n tagFolders[tag] = {folderName: \"\", folderMode: \"flat\"};\n });\n $tw.utils.each(cfgTags, function(tagCfg) {\n var tiddler = $tw.wiki.getTiddler(tagCfg);\n var tag = tiddler.fields[\"tag-name\"];\n var folderName = tiddler.fields[\"folder-name\"] || \"\";\n var folderMode = tiddler.fields[\"folder-mode\"] || \"flat\";\n self.logger.log(\"folder policy config: tag: for:\", \"\\\"\" + tag + \"\\\"\", \"folder:\", \"\\\"\" + folderName + \"\\\"\", \"mode:\", folderMode);\n if(tag && tagFolders[tag]) {\n tagFolders[tag].folderName = folderName;\n tagFolders[tag].folderMode = folderMode;\n }\n });\n};\n\n// We are asked to apply our folder policy...\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft ) {\n\t\tvar tags = options.tiddler.fields.tags;\n\t\tif ($tw.utils.isArray(tags)) {\n\t\t\tthis.logger.log(\"Tags: \"+tags.toString());\n for (var t=0; t<tagList.length; ++t) {\n if (tags.indexOf(tagList[t]) >= 0) {\n var info = tagFolders[tagList[t]];\n var subfolder = info.folderName;\n if(info.folderMode !== \"flat\") {\n options.subfolder = subfolder + \"/\" + this.subfoldersFromTitle(title);\n options.name = this.leafFromTitle(title);\n } else {\n options.subfolder = subfolder;\n options.title = title;\n }\n return true;\n }\n }\n\t\t}\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"50"},"$:/plugins/TheDiveO/ThirdFlow/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/history","created":"20140902083720188","modified":"20180311173125103","type":"text/vnd.tiddlywiki","text":"* ''1.2.3''\n** makes ThirdFlow plugin available as npm package `tw5-thirdflow`.\n** the development wiki now opens the \"Plugin Sources\" sidebar tab by default; this can be changed in the Control Panel \"Settings\" tab. Please note that TiddlyWiki 5.1.16+ will have this feature anyway.\n\n* ''1.2.2''\n** supports showing the \"Plugin Sources\" tab within the More sidebar tab at start for ~TiddlyWiki 5.1.16+.\n\n* ''1.2.1''\n** fixes new plugin template so its text content is of (mime) type `application/json`.\n** fixes error reporting in `--releaseplugins` and `--releasedemowiki`.\n\n* ''1.2.0''\n** brings a new automated release mechanism for plugins and plugin-demo wikis that simplifies maintaining what is to be released. The new system especially makes releasing multiple different plugins from the same development wiki much easier -- because there is no more need to tweak the release `tiddlywiki.info` configuration (however, this old release mechanism is still available).\n*** new \"''Release''\" tab in control panel, which configures which plugin(s) to release under which name, as well as whether to additionally release a plugin-demo wiki.\n*** new commands `--releaseplugins` and `--releasedemowiki` which use the configuration set from the control panel to package your plugins, write them to files, as well as writing the plugin-demo wiki (when enabled in configuration).\n*** upgrades `release/tiddlywiki.info` to use the new automated release mechanism, so plugin developers don't need to edit this file anymore in the future. To upgrade an existing plugin development wiki, simply upgrade your local `release/tiddlywiki.info` with this new one: [[editions/release/tiddlywiki.info]].\n*** upgrades skeleton `release/tiddlywiki.info` to also use the new automated release mechanism.\n*** refactors internal Javascript code.\n** removes released(!) plugins from the \"Plugin Sources\" view, as well as from the \"Releases\" tab in the Control Panel. This keeps the display cleaner, avoiding confusion.\n\n* ''1.1.1''\n** fixes plugin tiddler templates incorrectly setting `moduleType` instead of `module-type`.\n\n* ''1.1.0''\n** fixes //Plugin Sources// sidebar tab previously not sorting plugins alphabetically.\n** now shows number of tiddlers inside a plugin next to the plugin publisher/name.\n** adds a new <$button class=<<tv-config-toolbar-class>> >{{$:/core/images/down-arrow}}</$button> popup menu to each plugin listed in the //Plugin Sources// sidebar tab. This menu offers to create new tiddlers inside a plugin, from an assortion of type-specific templates. Templates included cover new Javascript macro modules, filter modules, and many more.\n** shows \"add plugin boilerplate tiddlers\" for empty plugins; clicking it opens the standard `readme`, `license` and `history` tiddlers ready for editing. Additionally, these three tiddlers get added to the plugin tiddlers `list` field.\n** adds a new //~ThirdFlow// tab to the control panel. This tab allows developers to configure the places inside plugins where they want to add new tiddlers of a certain type (such as macro modules, filter modules, et cetera).\n** now shows more plugin meta data than before when //viewing// a plugin tiddler:\n*** `core-version` dependency field,\n*** `plugin-priority` field controlling the order of unpacking (where plugin tiddlers \"explode\" into their shadow tiddlers).\n** adds a new //edit// template to edit plugin meta data:\n*** the edit template shows the same plugin meta data as the plugin //view// template, but additionally allows //editing// most fields.\n*** two plugin meta data elements cannot be edited: the plugin publisher and plugin name elements, as these are derived from the plugin title.\n** removes (annoying) wikilink-ification when displaying or editing plugin meta data.\n\n* ''1.0.14''\n** adds npm package and (development) script support.\n** after cloning the ThirdFlow repository, first run `npm install tiddlywiki` inside the project directory.\n*** `npm run develop` starts the development TiddlyWiki server. Use Ctrl-C to stop the server.\n*** `npm run release` creates the release files.\n*** `nmp start` starts the development TiddlyWiki server. Use `npm stop` to stop it.\n\n* ''1.0.13''\n** fixes a bug in the hierarchical filesystem sync adapter related to evaluation of the `disable-hfs` configuration option.\n\n* ''1.0.12''\n** minor internal optimization: in filter expressions use `[all[current]]` instead of `[is[current]]`.\n\n* ''1.0.11''\n** fixes the import tiddler activating the plugin view template when it shouldn't.\n\n* ''1.0.10''\n** the <<tf>> plugin is not dead yet.\n** fixes `HierarchicalFileSystemAdaptor` to make it work with recent TW5 releases: adds missing `isReady()` method that was introduced some time ago to TW sync adaptors.\n** fixes `editions/develop/tiddlywiki.info` to load the -- now required -- `tiddlywiki/filesystem` plugin.\n** supports node-webkit; thanks to Eucaly for this fix.\n** fixes handling of filetypes not defined in `$tw.config.typeTemplates`; again, thanks to Eucaly for this fix.\n** updated documentation to properly reflect the correct configuration required with recent TiddlyWiki 5 releases.\n** minor textual tweaks.\n\n* ''1.0.9''\n** upgraded the tag-based folder storage user interface to use the new core tag-pill template ([[$:/core/ui/TagTemplate]]).\n\n* ''1.0.8'' -- fixes and usability improvements.\n** fixed broken handling of Javascript tiddlers when creating them: they are now correctly created as .js files. Also corrected file name handling to avoid duplicated file endings in case the title already contains the extension (as it is custom for Javascript tiddlers).\n** added \"new plugin source tiddler here\" to the \"plugin sources\" sidebar tab.\n** added new plugin view template part: it shows the meta information associated with the plugin and is shown before the core's stock plugin view template that (only) lists the contents of a plugin.\n\n* ''1.0.7'' -- minor fix release and core upgrade.\n** fixed the add tag button not working.\n** upgraded the release demo wiki core to 5.1.3.\n\n* ''1.0.6'' -- improved tag-based folders release.\n** the tags configured for organizing tiddler storage into folders now have a well-defined natural order. Tags earlier in the tag list take precedence over later ones. The new UI makes setting precedence easy, please see the next item.\n** revamped UI for configuring tag-based folders. The new UI allows tags to be sorted earlier in the list so that those earlier tags take precedence over latter tags.\n\n* ''1.0.5'' -- lots of new stuff release.\n** a new \"Plugin Sources\" UI in the sidebar under the \"More\" tab. Lists only plugins and their original source code tiddlers.\n** an enhanced file system sync adaptor that is now configurable through its own control panel UI extension, under the new tab [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]].\n*** configure the folder names for system tiddlers and drafts.\n*** organize your tiddlers neatly into their own subfolders based on tags. Unfortunately, tag priority cannot be controlled at this time.\n** more editing and highlight support.\n*** towards a (mostly) unified syntax highlighting in both static rendering as well as when editing tiddlers.\n*** added more codemirror features: current line highlighting, CSS syntax support.\n*** added support for TW5's native ~JavaScript storage format when creating ~JavaScript tiddlers directly inside ~TiddlyWiki 5. Tiddler meta-data gets correctly inserted into a (special) comment section.\n* ''1.0.4'' -- fix and more documentation.\n** fixed a typo in the (empty) source plugin tiddler itself which caused hiccups in ~TiddlyWiki's control panel plugin tab.\n** added more background information about plugins, modules, and the crazy stuff the <<tf>> plugin is made of.\n\n* ''1.0.3'' -- upgraded to work with the final ~TiddlyWiki 5.1.x releases.\n** fixed using deprecated regular expression when packing plugin tiddlers.\n\n* ''1.0.2'' -- fix and polishing release.\n** fixes a problem in the hierarchical filesystem sync adaptor that previously caused server aborts when adding JPEG tiddlers. The sync adaptor now defaults to the \"~~binary~~base64\" encoding whenever a meta file is required.\n** added two illustrations to the demo documentation showing the develop and release phases.\n** further minor documentation fixes and improvements.\n\n* ''1.0.1'' -- fix and polishing release.\n** fixes an issue where the user plugin demonstration wikis contained still the plugin source in addition to the plugin itself.\n** included polishing documentation from pmario (thanks!).\n\n* ''1.0.0'' -- this marks the first public release of the <<tf>> plugin. Of course, the <<tf>> eats its own dog food: this plugin has been developed with itself. Sweet, isn't it?\n** the ``--makeplugin`` command for creating plugins in headless TW5 instances running under Node.js.\n** the ``hierarchicalfilesystemadaptor`` sync adapter that stores tiddlers according to their hierarchical names into folders and subfolders.\n"},"$:/plugins/TheDiveO/ThirdFlow/icon":{"title":"$:/plugins/TheDiveO/ThirdFlow/icon","created":"20140902083115519","modified":"20140902083155746","type":"text/vnd.tiddlywiki","text":"<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path\n d=\"M 13.6875,0.21875 1.96875,7 l 0,13.53125 11.71875,6.78125 11.75,-6.78125 0,-13.53125 -11.75,-6.78125 z m -0.21875,2.9375 -0.21875,0.3125 -0.1875,0.21875 0.1875,0.25 0.15625,0.25 C 8.2238491,4.3516565 4.0625,8.5897663 4.0625,13.8125 c 0,1.53048 0.3643003,2.966927 1,4.25 l -0.25,0.53125 -0.625,-0.0625 C 3.4739437,17.106473 3.0625,15.512243 3.0625,13.8125 3.0625,8.028588 7.716283,3.2895221 13.46875,3.15625 z M 14.4375,3.1875 c 5.534617,0.369785 9.90625,4.9983374 9.90625,10.625 0,1.833581 -0.463357,3.557017 -1.28125,5.0625 l -0.125,-0.25 -0.125,-0.28125 -0.28125,0.03125 -0.34375,0.03125 c 0.739688,-1.363949 1.15625,-2.929057 1.15625,-4.59375 0,-5.0803341 -3.922604,-9.2511654 -8.90625,-9.625 l -0.375,-0.5 0.375,-0.5 z M 10.25,7.5 c 1.425042,0 2.639576,0.7576324 3.8125,1.40625 1.172923,0.6486176 2.283798,1.21875 3.09375,1.21875 C 19.100721,10.125 20,9.09375 20,9.09375 L 21.25,10.25 c 0,0 -1.500142,1.5625 -4.09375,1.5625 -1.459089,0 -2.728987,-0.755233 -3.90625,-1.40625 -1.177263,-0.6510172 -2.253123,-1.1875 -3,-1.1875 -1.8328368,0 -2.875,1.03125 -2.875,1.03125 L 6.1875,9.0625 c 0,0 1.5514984,-1.5625 4.0625,-1.5625 z m 0.0625,4.6875 c 1.28542,0 2.513683,0.725888 3.6875,1.375 1.173817,0.649112 2.306403,1.21875 3.25,1.21875 2.078117,0 3.09375,-1.125 3.09375,-1.125 l 0.71875,0.65625 c 0,0 -1.352537,1.46875 -3.8125,1.46875 -1.325443,0 -2.573631,-0.724477 -3.75,-1.375 -1.176369,-0.650523 -2.301,-1.21875 -3.1875,-1.21875 -1.9724586,0 -3.09375,1.15625 -3.09375,1.15625 L 6.5,13.625 c 0,0 1.4411209,-1.4375 3.8125,-1.4375 z m 0,3.84375 c 1.28542,0 2.482432,0.694638 3.65625,1.34375 1.173817,0.649112 2.306403,1.25 3.25,1.25 2.078118,0 3.09375,-1.15625 3.09375,-1.15625 l 0.75,0.6875 c 0,0 -1.383787,1.46875 -3.84375,1.46875 -1.325443,0 -2.54238,-0.724477 -3.71875,-1.375 -1.176369,-0.650523 -2.301001,-1.21875 -3.1875,-1.21875 -1.9724586,0 -3.125,1.125 -3.125,1.125 L 6.5,17.46875 c 0,0 1.4411209,-1.4375 3.8125,-1.4375 z M 5.53125,18.875 c 1.7052086,2.730869 4.727356,4.5625 8.1875,4.5625 3.288587,0 6.171115,-1.649342 7.90625,-4.15625 l 0.6875,-0.09375 0.25,0.53125 c -1.906345,2.846287 -5.161209,4.71875 -8.84375,4.71875 -3.8226661,0 -7.1815039,-2.032459 -9.0625,-5.0625 L 5,19.40625 5.3125,19.4375 5.40625,19.15625 5.53125,18.875 z\"\n transform=\"scale(4.6545455,4.6545455)\"\n id=\"path4245\"\n style=\"fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate\" />\n </g>\n</svg>"},"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled","created":"20141018212934861","modified":"20141018213600106","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-down-arrow-filled tc-image-button\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\"><path d=\"M 19.518782,6.1964562 1.9928658,6.2499507 c -0.5997449,0 -1.18824709,0.3502163 -1.4652964,0.8821413 -0.2770493,0.5319251 -0.2299991,1.2172585 0.117149,1.7063017 L 9.4346393,21.160505 c 0.6037607,0.846248 2.0655717,0.846248 2.6693317,0 L 20.839966,8.7844678 C 21.529101,7.8136291 20.709281,6.2075002 19.518782,6.1960248 z\"/></svg>\n"},"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled","created":"20141018213823637","modified":"20141018213933115","type":"text/vnd.tiddlywiki","text":"<svg class=\"tc-image-down-arrow-filled tc-image-button\" viewBox=\"0 0 22 22\" width=\"22\" height=\"22\"><path d=\"m 19.615415,16.125653 -17.5259167,-0.0535 c -0.5997449,0 -1.18824709,-0.350216 -1.4652964,-0.882141 C 0.3471526,14.658087 0.3942028,13.972753 0.7413509,13.48371 L 9.5312718,1.1616039 c 0.6037612,-0.84624798 2.0655722,-0.84624798 2.6693322,0 l 8.735995,12.3760371 c 0.689135,0.970839 -0.130685,2.576968 -1.321184,2.588443 z\"/></svg>\n"},"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js","text":"/*\\\ncreated: 20180212163414709\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\nmodified: 20180212163710081\ntags:\nmodule-type: library\n\nA library of (reusable) ThirdFlow plugin tiddler functions. These\nfunctions can be used, for instance, through TW server commands.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Good Stuff(tm) we need */\nif ($tw.node) {\n var fs = require(\"fs\");\n var path = require(\"path\");\n}\n\n\n/* Packages a plugin tiddler from its constituent individual tiddlers that exist\n * inside the title sub-namespace of the plugin tiddler.\n *\n * Parameters:\n * wiki: TW instance.\n * pluginTitle: the plugin tiddler to be packed; this must be a valid\n * plugin tiddler which has its plugin-type correctly set, as well\n * as a type of \"application/json\".\n * filterExpression: optional TW filter expression to be used to decide\n * which tiddlers need to be packed into the plugin. If left unspecified,\n * it defaults to all sub-tiddlers of the plugin title.\n *\n * Result:\n * returns undefined when the plugin tiddler specified in pluginTitle has\n * been packed without issues. Otherwise, an error string is returned,\n * detailing what went wrong.\n */\nexports.packagePlugin = function(wiki, pluginTitle, filterExpression) {\n // Prepare input parameters...\n if (pluginTitle.substr(-1) === \"/\") {\n pluginTitle = pluginTitle.substr(0, pluginTitle.length - 1);\n }\n filterExpression = filterExpression\n || \"[all[tiddlers]prefix[\" + pluginTitle + \"/]]\";\n // Plugin tiddler sanity checks...\n var pluginTiddler = wiki.getTiddler(pluginTitle);\n\tif (!pluginTiddler) {\n\t\treturn \"missing plugin tiddler: \" + pluginTitle;\n\t}\n\tif (pluginTiddler.fields.type !== \"application/json\"\n || !pluginTiddler.hasField(\"plugin-type\")) {\n\t\treturn \"not a plugin (skeleton) tiddler: \" + pluginTitle;\n\t}\n\t// Update the plugin content to contain all the tiddlers that match\n\t// the filter expression.\n\tvar filteredTiddlers = wiki.filterTiddlers(filterExpression);\n\tvar pluginTiddlers = {};\n\t$tw.utils.each(filteredTiddlers, function(title) {\n\t\tvar tiddler = wiki.getTiddler(title);\n\t\tvar fields = {};\n\t\t$tw.utils.each(tiddler.fields, function(value, fieldname) {\n\t\t\tfields[fieldname] = tiddler.getFieldString(fieldname);\n\t\t});\n\t\tpluginTiddlers[title] = fields;\n\t});\n\tvar plugin = new $tw.Tiddler(\n pluginTiddler,\n {\n \"text\": JSON.stringify({ \"tiddlers\": pluginTiddlers })\n });\n\twiki.addTiddler(plugin);\n\t// We need to update the plugin info that TW had built up during boot...\n\twiki.readPluginInfo();\n\t// ...and we need to re-unpack the plugins into their shadow tiddlers in\n\t// order to make [is[shadow]] work correctly. Yes, that causes the plugin\n // tiddlers to exist two times: the original source tiddler, as well as\n // a corresponding shadow tiddler. However, this is just during release,\n // but never in a development wiki nor in a user wiki deploying this plugin.\n\twiki.unpackPluginTiddlers();\n return;\n};\n\n\n/* Renders a single tiddler using a template to a file. Please note that\n * this function automatically creates the required subdirectories needed\n * to contain the output file.\n *\n * Parameters:\n * wiki: TW instance.\n * title: the tiddler to be rendered.\n * template: the title of the template to be used for rendering.\n * filename: the output filename to which the tiddler gets rendered.\n *\n * Result:\n * returns undefined when the rendering and writing process finished\n * successfully. Otherwise, an error string is returned, detailing what\n * went wrong.\n */\nexports.renderTiddlerWithTemplate = function(wiki, title, template, filename) {\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n return err;\n }\n var content = wiki.renderTiddler(\n \"text/plain\", template, { variables: { currentTiddler: title } });\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n return;\n};\n\n\n})();\n","created":"20180212163414709","type":"application/javascript","modified":"20180212163710081","tags":"","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/license","created":"20140902084022063","modified":"20140902090843205","type":"text/vnd.tiddlywiki","text":"The //Third Flow// plugin is covered by the following licenses:\n\n* The ''Third Flow plugin'' is licensed under the [[MIT license|http://opensource.org/licenses/MIT]].\n* The ''hierarchical file system adapter'' is licensed under the [[TiddlyWiki 5 license|https://raw.githubusercontent.com/Jermolene/TiddlyWiki5/master/licenses/copyright.md]] (links to ~GitHub TW5 repository). It bases on ``plugins/tiddlywiki/filesystem/filesystemadaptor.js`` and brings in storing tiddlers into hierarchical folder structures according to their titles.\n* Other content of this ~TiddlyWiki which is not part of the plugin or ~TiddlyWiki 5 is covered by the [[CC BY 3.0|http://creativecommons.org/licenses/by/3.0/]] license."},"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations","created":"20180203171654847","modified":"20180205195031010","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define tf-config-base() $:/config/ThirdFlow/\n\n\\define tf-config-base-default() $:/plugins/TheDiveO/ThirdFlow/defaults/\n"},"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js","text":"/*\\\ncreated: 20141020111828333\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/hashify.js\ntype: application/javascript\nmodified: 20141020111837899\nmodule-type: macro\n\nMacro to hash a tiddler title into a (mostly) unique number.\nThis avoids problems when using titles (from tags, et cetera)\nas path elements of a system tiddler title.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"hashify\";\n\nexports.params = [\n\t{name: \"title\"},\n {name: \"prefix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title,prefix) {\n\treturn (prefix || \"\") + $tw.utils.hashString(title);\n};\n\n})();\n","created":"20141020111828333","type":"application/javascript","modified":"20141020111837899","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js","text":"/*\\\ncreated: 20141020111845057\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js\ntype: application/javascript\nmodified: 20141020111852925\nmodule-type: macro\n\nMacro to sanitize a tiddler title for use as, e.g. a folder name.\nAlso converts the title to lowercase.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"sanitizedfoldername\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title.replace(/\\<|\\>|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\").toLowerCase();\n};\n\n})();\n","created":"20141020111845057","type":"application/javascript","modified":"20141020111852925","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js","text":"/*\\\ncreated: 20180203193341374\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js\nmodified: 20180205195741652\nmodule-type: macro\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"typedplugintiddlertitle\";\n\nexports.params = [\n { name: \"pluginroot\" }, /* such as: \"$:/plugins/publisher/plugin\" */\n { name: \"configtiddler\" }, /* title of config infix tiddler (may be missing) */\n { name: \"defaulttiddler\" }, /* title of default infix tiddler (may be missing too, but should not ;) */\n { name: \"title\" } /* title (suffix) */\n];\n\nexports.run = function(pluginroot, configtiddler, defaulttiddler, title) {\n /* Start with the plugin root part, and add a trailing slash, if not already given */\n var t = pluginroot;\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* Either add a configured infix, or a default infix; handle \"\" config correctly. */\n var cfgtiddler = this.wiki.getTiddler(configtiddler);\n if (cfgtiddler) {\n t += cfgtiddler.fields.text; /* \"\" will be just fine! */\n } else {\n var deftiddler = this.wiki.getTiddler(defaulttiddler);\n if (deftiddler) {\n t += deftiddler.fields.text;\n }\n }\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* End with the (suffix) title element. */\n t += title;\n \n /* Grmpf: ensure that the full title returned is unique. */\n return this.wiki.generateNewTitle(t);\n};\n\n})();","created":"20180203193341374","type":"application/javascript","modified":"20180205195741652","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/readme","created":"20140902083641711","modified":"20141020083728826","type":"text/vnd.tiddlywiki","text":"Use the //Third Flow// plugin in your Node.js-based ~TiddlyWikis to develop your customization plugins inside ~TiddlyWiki but with support for well-structured source code repository layouts.\n\nThe //Third Flow// plugin supports your plugin development in that it organizes all your tiddler source files into a clear hierarchical folder structure based on tiddler titles. An additional plugin creation command module makes it easy to create the package plugin itself as well as a demonstration ~TiddlyWiki without the hassle of having to maintain separate and even multiple ``tiddlers/`` and ``plugin/`` folders. Also, the //Third Flow// relieves you from shuffling tiddler source code files around in your source code repository.\n\nThere's only a ''single'' tiddler source code tree and it is synchronized to your tiddler's title-based structure. Thus, no more need for external editing sessions and source file shuffling.\n\nSimply install this plugin into your ~TiddlyWiki in which you are developing your customizations. For more information, please go to the [[Third Flow project website|http://thediveo.github.io/ThirdFlow]].\n\nYou can use the new [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]] control panel tab to configure how your tiddlers get organized into folders and subfolders in your source code repository.\n\nEnjoy the //Third Flow//!"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel","created":"20180203155550006","modified":"20180203163400275","tags":"$:/tags/Stylesheet","type":"text/css","text":".tfc-infix-setting {\n width: 100%;\n display: flex;\n align-items: center;\n}\n\n.tfc-infix-setting-prefix {\n opacity: 0.5;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView","created":"20180202130047517","modified":"20180217165529786","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"td.tfc-plugin-edit-element-value {\n text-align: left;\n vertical-align: baseline;\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input {\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input[type=checkbox] {\n width: auto;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView","created":"20141025152245526","modified":"20180205183442633","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"tr.tfc-plugin-info-element td {\n padding-top: 0.4ex;\n padding-bottom: 0.4ex;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\ntd.tfc-plugin-info-element-name {\n text-align: right;\n vertical-align: baseline;\n background-color: <<colour table-header-background>>;\n font-weight: bold;\n}\n\ntd.tfc-plugin-info-element-value {\n text-align: left;\n vertical-align: top;\n}\n\nspan.tfc-plugin-info-unspecified {\n font-style: italic;\n color: <<colour very-muted-foreground>>;\n}\n\nspan.tfc-plugin-info-unspecified:before {\n font-style: normal;\n content: \"(\";\n}\n\nspan.tfc-plugin-info-unspecified:after {\n font-style: normal;\n content: \")\";\n padding-left: 0.15em;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5","created":"20141003153100991","modified":"20141003164807749","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* This CodeMirror stylesheet implements a TW5-compatible syntax coloring theme */\n\n.cm-s-tw5 span.cm-meta {color: #FF1717;}\n.cm-s-tw5 span.cm-keyword { line-height: 1em; font-weight: bold; color: #333; }\n.cm-s-tw5 span.cm-atom {color: #219;}\n.cm-s-tw5 span.cm-number {color: #008080;}\n.cm-s-tw5 span.cm-def {color: #00f;}\n.cm-s-tw5 span.cm-variable {color: black;}\n.cm-s-tw5 span.cm-variable-2 {color: #0000C0;}\n.cm-s-tw5 span.cm-variable-3 {color: #0000C0;}\n.cm-s-tw5 span.cm-property {color: #065252;}\n.cm-s-tw5 span.cm-operator {color: black;}\n.cm-s-tw5 span.cm-comment {color: #998;}\n.cm-s-tw5 span.cm-string {color: #2A00FF;}\n.cm-s-tw5 span.cm-string-2 {color: #f50;}\n.cm-s-tw5 span.cm-qualifier {color: #555;}\n.cm-s-tw5 span.cm-builtin {color: #30a;}\n.cm-s-tw5 span.cm-bracket {color: #cc7;}\n.cm-s-tw5 span.cm-tag {color: #000080; font-weight: bold;}\n.cm-s-tw5 span.cm-attribute {color: #00c;}\n.cm-s-tw5 span.cm-link {color: #219;}\n.cm-s-tw5 span.cm-error {color: #f00;}\n\n.cm-s-tw5 span.cm-underlined { text-decoration: underline; }\n.cm-s-tw5 span.cm-strikethrough { text-decoration: line-through; }\n.cm-s-tw5 span.cm-brace { color: #170; font-weight: bold; }\n.cm-s-tw5 span.cm-table { color: blue; font-weight: bold; }\n\n.cm-s-tw5 .CodeMirror-activeline-background {background: #F0F3F7 !important;}\n.cm-s-tw5 .CodeMirror-matchingbracket {outline:1px solid #c00; color:black !important;}\n"},"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5","created":"20141003155429576","modified":"20141003164730907","tags":"$:/tags/Stylesheet","type":"text/css","text":"/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #333;\n background: #f8f8f8;\n -webkit-text-size-adjust: none;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n color: #998;\n font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n color: #333;\n font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n color: #008080;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.hljs-dartdoc,\n.tex .hljs-formula {\n color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.scss .hljs-preprocessor {\n color: #900;\n font-weight: bold;\n}\n\n.javascript .hljs-title,\n.hljs-list .hljs-keyword,\n.hljs-subst {\n font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n color: #458;\n font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n color: #000080;\n font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n color: #065252;\n}\n\n.hljs-regexp {\n color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.clojure .hljs-keyword,\n.scheme .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n color: #990073;\n}\n\n.hljs-built_in {\n color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n color: #999;\n font-weight: bold;\n}\n\n.hljs-deletion {\n background: #fdd;\n}\n\n.hljs-addition {\n background: #dfd;\n}\n\n.diff .hljs-change {\n background: #0086b3;\n}\n\n.hljs-chunk {\n color: #aaa;\n}\n"},"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js","text":"/*\\\ncreated: 20141015190317579\ntitle: $:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js\ntype: application/javascript\nmodified: 20141015190324904\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with the local filesystem via node.js APIs\n...in contrast to filesystemadaptor.js this variant understands forward slashes \"/\"\nin tiddler titles and stores tiddlers appropriately in the file system by mapping\nthe hierarchy in the title to a (sub) directory structure.\n\nIn addition, this sync adaptor understands the concept of system tiddlers (starting\ntheir titles with \"$:/\") and stores them inside a \"special\" system branch.\n\nMoreover, this sync adaptor also understands the concept of draft tiddlers (based\non the presence of the \"draft.of\" field) and stores all draft tiddlers in a flat\nsingle \"drafts\" folder. The makes cleanup and (git) repository syncing easier to do.\n\nIn order to realize good modularity and to allow this sync adaptor to be enhanced\nat any time later in an easy manner, it supports so-called folder policy modules.\nThese are module tiddlers with a module-type of \"folderpolicy\". Folder policy modules\nneed to export a method named \"folderpolicy\". In addition, folder policy modules\ncan be assigned a priority value. Normally, the priority of a folder policy should\nbe between 199 and 1, inclusively. Priority 200 is currently used for the draft\ntiddler policy. Priority 0 is assigned to the default policy.\n\nThe code for this sync adaptor comes from filesystemadaptor.js and has been enhanced\nto support hierarchical tiddler storage as well as folder policies.\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 and path tools;\n// support node.js and nodejs-webkit\nvar fs = $tw.node ? require(\"fs\") : null,\n\tpath = $tw.node ? require(\"path\") : null;\n\nfunction HierarchicalFileSystemAdaptor(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.logger = new $tw.utils.Logger(\"HierarchicalFileSystem\");\n\t// Create the <wiki>/tiddlers folder if it doesn't exist\n\t$tw.utils.createDirectory($tw.boot.wikiTiddlersPath);\n\t\n\tthis.config = {\n\t\tdisabled: false\n\t};\n\t\n\t// retrieve all folder policy modules and sort them according\n\t// to their priority, with higher priority values sorted towards\n\t// the beginning of our folder policy modules list. Policy modules\n\t// more to the beginning are getting an earlier chance of applying\n\t// their policy.\n\tvar fpModules = [];\n\tvar fpcWatching = [];\n\t$tw.modules.forEachModuleOfType(\"folderpolicy\", function(title, exports) {\n\t\t// prepare folder policy information for later sorting and calling\n\t\tfpModules.push({\n\t\t\ttitle: title, // just for logging\n\t\t\tpriority: options.wiki.getTiddler(title).fields.priority || 100,\n\t\t\tpolicy: exports.folderpolicy || function() { return false; }\n\t\t});\n\t\t// get the information to monitor for configuration changes\n\t\tif ( exports.watch && exports.reconfig ) {\n\t\t\tfpcWatching.push({\n\t\t\t\tfilter: self.wiki.compileFilter(exports.watch),\n\t\t\t\treconfig: exports.reconfig\n\t\t\t});\n\t\t}\n\t\t// initial configuration call\n\t\tif ( exports.reconfig ) {\n\t\t\texports.reconfig.call(self);\n\t\t}\n\t});\n\tthis.fpcWatching = fpcWatching;\n\tfpModules.sort(function(policyA, policyB) {\n\t\treturn policyB.priority - policyA.priority;\n\t});\n\tthis.logger.log(fpModules.length + \" folder policies active\");\n\tthis.policyModules = fpModules;\n\t\n\tif($tw.boot.wikiInfo.config && $tw.boot.wikiInfo.config[\"disable-hfs\"]) {\n\t\tthis.config.disabled = true;\n\t\tthis.logger.log(\"plugin disabled; no saving and deleting\");\n\t}\n}\n \nHierarchicalFileSystemAdaptor.prototype.isReady = \"hfs\";\n\n// Are we ready? Are we ready?? We're always ready!\nHierarchicalFileSystemAdaptor.prototype.isReady = function() {\n\treturn true;\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerInfo = function(tiddler) {\n\treturn {};\n};\n\n//\n// file type-specific templates\n//\n$tw.config.typeTemplates = {\n\t\"application/x-tiddler\": \"$:/core/templates/tid-tiddler\",\n\t\"application/javascript\": \"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler\"\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) {\n\t// See if we've already got information about this file\n\tvar self = this,\n\t\ttitle = tiddler.fields.title,\n\t\tfileInfo = $tw.boot.files[title],\n\t\tdraftOf = tiddler.fields[\"draft.of\"];\n\t// Get information about how to save tiddlers of this type\n\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\ttypeInfo = $tw.config.contentTypeInfo[type];\n\tif(!typeInfo) {\n typeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n\t}\n if (!($tw.config.typeTemplates[typeInfo.fileType || tiddler.fields.type])) {\n \ttypeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n \t\ttypeInfo.fileType = \"application/x-tiddler\";\n\t}\n\tvar extension = typeInfo.extension || \"\";\n\tif(!fileInfo) {\n\t\t// If not, we'll need to generate it\n // Handle case where the title already ends in the file extension:\n // in this case we remove the extension from the suggested title.\n var suggestedName = title;\n if(suggestedName.substr(-extension.length) === extension) {\n suggestedName = suggestedName.substr(0,suggestedName.length - extension.length);\n }\n\t\tvar paf = self.generateTiddlerPathAndFilename(tiddler, suggestedName, draftOf);\n\t\tvar folder = $tw.boot.wikiTiddlersPath+path.sep+paf.subfolder;\n\t\t$tw.utils.createDirectory(folder);\n\t\t// Start by getting a list of the existing files in the directory\n\t\tfs.readdir(folder,function(err,files) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Assemble the new fileInfo\n\t\t\tfileInfo = {};\n\t\t\t\n\t\t\tfileInfo.filepath = folder + path.sep + self.generateUniqueTiddlerFilename(paf.name,draftOf,extension,files);\n\t\t\tfileInfo.type = typeInfo.fileType || tiddler.fields.type;\n\t\t\tfileInfo.hasMetaFile = typeInfo.hasMetaFile;\n\t\t\t// Save the newly created fileInfo\n\t\t\t$tw.boot.files[title] = fileInfo;\n\t\t\t// Pass it to the callback\n\t\t\tcallback(null,fileInfo);\n\t\t});\n\t} else {\n\t\t// Otherwise just invoke the callback\n\t\tcallback(null,fileInfo);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.subfoldersFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<=0) {\n\t\treturn \"\";\n\t} else {\n\t\treturn title.substr(0,lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.leafFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<0) {\n\t\treturn title;\n\t} else {\n\t\treturn title.substr(lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.generateTiddlerPathAndFilename = function(tiddler, suggestedTitle, draftOf) {\n\t// set up the policy method options such that if in a rare circumstance no policy\n\t// should fire, then we fall back to plain old flat storage in the main wiki folder.\n\tvar options = {\n\t\ttiddler: tiddler, // in: tiddler object we're trying a policy to find for\n\t\tdraft: !!draftOf, // in: is this a draft tiddler?\n\t\tsubfolder: \"\", // in/out: folder into which to place the tiddler file\n\t\tname: suggestedTitle // in/out: name of tiddler file\n\t};\n\t\n\t// run through our ordered list of folder policies and wait for one of them\n\t// to return true because its folder policy should be applied.\n\tfor (var i=0; i<this.policyModules.length; ++i) {\n\t\tif (this.policyModules[i].policy.call(this, suggestedTitle, options)) {\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\t// Sanitize the filename as well as the subfolder(s) name(s)...\n\t// This more or less comes down to removing those characters that are illegal in\n\t// Windows file names. Oh, and we also hammer out any hierarchy slashes inside\n\t// the filename, thereby flattening it.\n\toptions.name = options.name.replace(/\\<|\\>|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\");\n\t// For the subfolder path we are converting hierarchy slashes into the proper\n\t// platform-specific separators.\n\toptions.subfolder = options.subfolder.replace(/\\<|\\>|\\:|\\\"|\\\\|\\||\\?|\\*|\\^/g,\"_\").replace(/\\//g, path.sep);\n\n\treturn options;\n};\n\n/*\nGiven a tiddler title and an array of existing filenames, generate a new legal filename for the title, case insensitively avoiding the array of existing filenames\n*/\nHierarchicalFileSystemAdaptor.prototype.generateUniqueTiddlerFilename = function(baseFilename,draftOf,extension,existingFilenames) {\n\t// Truncate the filename if it is too long\n\tif(baseFilename.length > 200) {\n\t\tbaseFilename = baseFilename.substr(0,200);\n\t}\n\t// Start with the base filename plus the extension\n\tvar filename = baseFilename + extension,\n\t\tcount = 1;\n\t// Add a discriminator if we're clashing with an existing filename\n\twhile(existingFilenames.indexOf(filename) !== -1) {\n\t\tfilename = baseFilename + \" \" + (count++) + extension;\n\t}\n\treturn filename;\n};\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nHierarchicalFileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tvar self = this;\n\n\t// Monitor for configuration changes and then trigger the folder\n\t// policy modules affected from configuration changes.\n\t$tw.utils.each(this.fpcWatching, function(watch, title, obj) {\n\t\tvar changes = watch.filter.call(self.wiki, function(filterCallback) {\n\t\t\tfilterCallback(tiddler, tiddler.fields.title);\n\t\t});\n\t\tif ( changes.length > 0 ) {\n\t\t\twatch.reconfig.call(self, tiddler.fields.title);\n\t\t}\n\t});\n\t\n\t// Proceed with saving the tiddler\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"saving disabled\");\n\t\treturn callback(null, {}, 0);\n\t}\n\t\n\tthis.getTiddlerFileInfo(tiddler,function(err,fileInfo) {\n\t\tvar template, content, encoding;\n\t\tfunction _finish() {\n\t\t\tcallback(null, {}, 0);\n\t\t}\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(fileInfo.hasMetaFile) {\n\t\t\t// Save the tiddler as a separate body and meta file\n\t\t\tvar typeInfo = $tw.config.contentTypeInfo[fileInfo.type],\n\t\t\t\tencoding = typeInfo.encoding || \"base64\"; // makes sense for TW\n\t\t\tself.logger.log(\"saving type\", fileInfo.type, \"with meta file and encoding\", encoding);\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,{encoding: encoding},function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",\"$:/core/templates/tiddler-metadata\",{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",content,{encoding: \"utf8\"},function (err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t\t_finish();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\t// Save the tiddler as a self contained templated file\n\t\t\ttemplate = $tw.config.typeTemplates[fileInfo.type];\n\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",template,{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\tfs.writeFile(fileInfo.filepath,content,{encoding: \"utf8\"},function (err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t_finish();\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*/\nHierarchicalFileSystemAdaptor.prototype.loadTiddler = function(title,callback) {\n\tcallback(null,null);\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\n*/\nHierarchicalFileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"deleting disabled\");\n\t\treturn callback(null);\n\t}\n\n\tvar self = this,\n\t\tfileInfo = $tw.boot.files[title];\n\t// Only delete the tiddler if we have writable information for the file\n\tif(fileInfo) {\n\t\t// Delete the file\n\t\tfs.unlink(fileInfo.filepath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.logger.log(\"Deleted file\",fileInfo.filepath);\n\t\t\t// Delete the metafile if present\n\t\t\tif(fileInfo.hasMetaFile) {\n\t\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\t\tcallback(null);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\tcallback(null);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null);\n\t}\n};\n\nif(fs) {\n\texports.adaptorClass = HierarchicalFileSystemAdaptor;\n}\n\n})();\n","created":"20141015190317579","type":"application/javascript","modified":"20141015190324904","module-type":"syncadaptor"},"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction":{"title":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","created":"20180204194231803","list":"","modified":"20180204194242455","tags":"","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler","created":"20140927173431490","modified":"20140927173434365","type":"text/vnd.tiddlywiki","text":"<$metafy/>"},"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources","created":"20140902113827798","modified":"20140927173615299","type":"text/vnd.tiddlywiki","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/temp/]] -[is[shadowinsync]] -[[$:/plugins/TheDiveO/ThirdFlow/readme]is[shadow]!is[tiddler]removesuffix[/readme]] -[prefix[$:/plugins/TheDiveO/BrokenPlugin]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic","caption":"Basic","created":"20141013144648552","modified":"20141013190842095","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"|Folder for system tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/systemfoldername\" default=\"system\" tag=\"input\"/>|\n|Folder for draft tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/draftfoldername\" default=\"drafts\" tag=\"input\"/>|\n\n!! How to store ordinary tiddlers into (sub) folders\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"yes\"> Organize ordinary tiddlers into hierarchical subfolders.</$radio>\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"no\"> Store ordinary tiddlers ''flat'' in the top-level wiki folder.</$radio>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags","caption":"Tag-based Folders","created":"20141013152809952","modified":"20141203202326182","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"\\define config-tiddler() $:/config/FileStorage/tagfolders\n\n\\define config-tiddler-list() [list[$(config-tiddler)$]]\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n\n\\define config-defaults() {\"tag-name\": \"$(currentListElement)$\", \"folder-name\": \"$(folder)$\", \"folder-mode\": \"flat\"}\n\n\\define tag-folder-editor()\n <$set name=\"tagConfigTiddler\" value=<<hashify title:\"$(currentListElement)$\" prefix:\"$(config-tiddler)$/config-\">>>\n <$set name=\"folder\" value=<<sanitizedfoldername \"$(currentListElement)$\">>>\n <$list filter=\"[<tagConfigTiddler>is[missing]]\">\n <$ensuretiddler title=<<tagConfigTiddler>> default=<<config-defaults>>/>\n <$link title=<<currentTiddler>> format=\"text\"><$text text=<<currentTiddler>>/></$link>\n </$list>\n <tr class=\"tc-edit-field\">\n <td class=\"tc-edit-tag-name\">\n <$tiddler tiddler=<<currentListElement>> >\n <$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n </$tiddler>\n </td>\n\n <td class=\"tc-edit-tag-folder\">\n <$edit-text tiddler=<<tagConfigTiddler>> field=\"folder-name\" placeholder=\"enter a folder name\"/>\n </td>\n\n <td class=\"tc-edit-tag-flat\">\n <$select tiddler=<<tagConfigTiddler>> field=\"folder-mode\">\n <option value=\"flat\">flat</option>\n <option value=\"subfolders\">subfolders</option>\n </$select>\n </td>\n\n <td class=\"tc-edit-tag-ops\">\n <$button message=\"tm-shift-back-list-element\" param=<<currentListElement>> class=\"tc-btn-invisible\">{{$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled}}</$button>\n \n <$button message=\"tm-shift-forward-list-element\" param=<<currentListElement>> class=\"tc-btn-invisible\">{{$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled}}</$button>\n \n <$button message=\"tm-remove-list-element\" param=<<currentListElement>> class=\"tc-btn-invisible\">{{$:/core/images/delete-button}}</$button>\n </td>\n </tr>\n </$set>\n </$set>\n\\end\n\nTags towards the beginning of the list take priority over tags more down the list.\n\n<$listmangler tiddler=<<config-tiddler>>>\n\n<div class=\"tc-edit-fields\">\n <table class=\"tc-edit-fields\">\n \t<thead>\n <tr>\n <td>tag</td>\n <td>folder</td>\n <td>storage</td>\n <td>priority</td>\n </tr>\n </thead>\n <tbody>\n <$list filter=<<config-tiddler-list>> variable=\"currentListElement\">\n <<tag-folder-editor>>\n </$list>\n </tbody>\n </table>\n</div>\n\n<div class=\"tc-edit-field-add\">\n <em class=\"tc-edit\">Add a new tag folder:</em>\n\n <div class=\"tc-edit-add-tag\">\n <span class=\"tc-add-tag-name\">\n <$edit-text tiddler=\"$:/temp/NewTagName\" tag=\"input\" default=\"\" placeholder=\"tag name\" focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor\"/>\n </span>\n \n <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\">\n {{$:/core/images/down-arrow}}\n </$button>\n \n <span class=\"tc-add-tag-button\">\n <$button message=\"tm-add-list-element\" param={{$:/temp/NewTagName}} set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n add\n </$button>\n </span>\n </div>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n <$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n <div class=\"tc-block-dropdown\">\n <$linkcatcher set=\"$:/temp/NewTagName\" setTo=\"\" message=\"tm-add-list-element\">\n <$list filter=\"[!is[shadow]tags[]search{$:/temp/NewTagName}sort[title]]\">\n <$link>\n <$set name=\"backgroundColor\" value={{!!color}}>\n <span style=<<tag-styles>> class=\"tc-tag-label\">\n <$view field=\"title\" format=\"text\"/>\n </span>\n </$set>\n </$link>\n </$list>\n </$linkcatcher>\n </div>\n </$reveal>\n</div>\n\n</$listmangler>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage","caption":"File Storage","created":"20141013143730660","modified":"20170222203526611","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"Control how a Node.js-server TiddlyWiki organizes your tiddlers into hierarchical folders and subfolders inside your file system. Any configuration changes you make here will immediately become live, even on your TiddlyWiki server.\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/HFS/ControlPanel]!has[draft.of]]\" \"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic\">>\n</div>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations","caption":"Default Locations","created":"20180217145204420","modified":"20180217150355438","type":"text/vnd.tiddlywiki","text":"\\define template-path(t) $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/$t$\n\n\\define infix(setting)\n<div class=\"tfc-infix-setting\">\n <div class=\"tfc-infix-setting-prefix\">plugin/ </div>\n <$edit-text tiddler=\"$:/config/ThirdFlow/$setting$\" default={{$(tf-config-base-default)$$setting$}} tag=\"input\"/>\n \n <$button class=\"tc-btn-invisible\" aria-label=\"reset to default\" tooltip=\"reset to default\">\n <$action-deletetiddler $tiddler=\"$:/config/ThirdFlow/$setting$\" />\n {{$:/core/images/refresh-button}}\n </$button>\n</div>\n\\end\n\n\\define template-link(t, ttype)\n<$button class=\"tc-btn-invisible\" aria-label=\"open $ttype$ template\" tooltip=\"open $ttype$ template\" to=<<template-path \"$t$\">>>\n {{$:/core/images/file}}\n</$button>\n\\end\n\n\\define infixsetting(description, infix, templatetitle, templatetype)\n<tr class=\"tc-edit-field\">\n <td style=\"white-space: nowrap;\">$description$</td>\n <td><<infix \"$infix$\">></td>\n <td><<template-link \"$templatetitle$\" \"$templatetype$\">></td>\n</tr>\n\\end\n\nSettings to customize //your// ''plugin development'' in TiddlyWiki.\n\nConfigure the places where you want to add new tiddlers of a certain type when developing your plugins. These settings only apply when adding new tiddlers to a plugin, never afterwards.\n\n* Simply leave a place empty when you don't want tiddlers of a specific type to be organized into their own sub title-namespace, but instead \"//flat//\" directly within the plugin.\n* Press <span class=\"tc-icon-wrapper\">{{$:/core/images/refresh-button}}</span> in order to reset a place for a specific type of plugin tiddler to its default setting.\n* Press <span class=\"tc-icon-wrapper\">{{$:/core/images/file}}</span> to see -- and optionally edit -- the template for a specific plugin tiddler type.\n\n<div class=\"tc-edit-fields\">\n <table class=\"tc-edit-fields\">\n <tbody>\n <<infixsetting \"command modules\" \"commandinfix\" \"command.js\" \"command module\">>\n <<infixsetting \"general filter operators `foo[]`\" \"filterinfix\" \"filter.js\" \"filter module\">>\n <<infixsetting \" … `all[...]` filters\" \"allfilterinfix\" \"allfilter.js\" \"all[...] filter module\">>\n <<infixsetting \" … `is[...]` filters\" \"isfilterinfix\" \"isfilter.js\" \"is[...] filter module\">>\n <<infixsetting \"Javascript macro modules\" \"jsmacroinfix\" \"jsmacro.js\" \"Javascript macro module\">>\n <<infixsetting \"~TiddlyWiki-markup macros\" \"twmacroinfix\" \"twmacro\" \"TiddlyWiki-markup macro\">>\n <<infixsetting \"library modules\" \"jslibinfix\" \"library.js\" \"Javascript library module\">>\n <<infixsetting \"parser modules\" \"parserinfix\" \"parser.js\" \"parser module\">>\n <<infixsetting \" … wikiparser rule modules\" \"wikiparserruleinfix\" \"wikirule.js\" \"wikiparser rule module\">>\n <<infixsetting \"startup modules\" \"startupinfix\" \"startup.js\" \"startup module\">>\n <<infixsetting \"CSS tiddlers\" \"styleinfix\" \"cssstyle.css\" \"CSS\">>\n <<infixsetting \"template tiddlers\" \"templateinfix\" \"template\" \"TiddlyWiki template tiddler\">>\n <<infixsetting \"UI tiddlers\" \"uiinfix\" \"ui\" \"UI tiddler\">>\n <<infixsetting \"widget modules\" \"widgetinfix\" \"widget.js\" \"widget module\">>\n <<infixsetting \"`$tw` global modules\" \"twglobalinfix\" \"twglobal.js\" \"$tw global module\">>\n <<infixsetting \"`$tw.config` modules\" \"twconfiginfix\" \"twconfig.js\" \"$tw.config module\">>\n <<infixsetting \"`$tw.utils` modules\" \"twutilinfix\" \"twutil.js\" \"$tw.utils module\">>\n <<infixsetting \"`$tw.utils` Node.js-only modules\" \"twutilnodeinfix\" \"twutilnode.js\" \"$tw.utils Node.js-only configuration module\">>\n </tbody>\n </table>\n</div>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Release":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Release","caption":"Release","created":"20180217150231019","modified":"20180217202317855","tags":"","type":"text/vnd.tiddlywiki","text":"\\define plain(text)\n$text$\n\\end\n\n\\define release-item(itemdesc, itemconfig, defaultfilename, templateplaceholder)\n<div class=\"tc-edit-fields\">\n <table class=\"tc-edit-fields\">\n <tbody>\n <tr class=\"tc-edit-field\">\n <td>release:</td>\n <td class=\"tfc-plugin-edit-element-value\" style=\"white-space: nowrap;\">\n <$checkbox tiddler=\"$itemconfig$\" field=\"release\" checked=\"yes\" unchecked=\"no\">\n\t $itemdesc$\n </$checkbox>\n </td>\n </tr>\n <tr class=\"tc-edit-field\">\n <td>as:</td>\n <td class=\"tfc-plugin-edit-element-value\" style=\"white-space: nowrap;\">\n <$edit-text tiddler=\"$itemconfig$\" field=\"text\" default=\"$defaultfilename$\" tag=\"input\" />\n </td>\n </tr>\n <tr class=\"tc-edit-field\">\n <td>template:</td>\n <td class=\"tfc-plugin-edit-element-value\" style=\"white-space: nowrap;\">\n <$edit-text tiddler=\"$itemconfig$\" field=\"template\" default=\"\" placeholder=\"$templateplaceholder$\" tag=\"input\" />\n </td>\n </tr>\n\t</tbody>\n </table>\n</div>\n\\end\n\n\\define release-plugin-item(itemdesc, itemconfig, defaultfilename, templateplaceholder)\n<<release-item '<$link to=\"$:/plugins/$(plugin-name)$\"><$macrocall $name=\"plain\" text=\"$itemdesc$\" $output=\"text/plain\"/></$link>' \"$itemconfig$\" \"$defaultfilename$\" \"$templateplaceholder$\">>\n\\end\n\nSettings to customize your ''plugin(s) release'', including an optional plugin-demo wiki.\n\n> ''Note:'' To ''create'' the release files, run `npm run release` on your development ~TiddlyWiki in a terminal session.\n\n!! Plugins\n\n<$list filter=\"[prefix[$:/plugins/]has[plugin-type]removeprefix[$:/plugins/]!prefix[tiddlywiki/]!regexp:title[^.+/.+/]sort[]] -[all[shadows]prefix[$:/plugins/]shadowsource[]removeprefix[$:/plugins/]]\" variable=\"plugin-name\">\n <$set name=\"plugin-config\" filter=\"[<plugin-name>addprefix[$:/config/ThirdFlow/plugins/$:/plugins/]]\">\n <$set name=\"plugin-filename\" filter=\"[<plugin-name>titlecomponents[]last[]addsuffix[.tid]]\">\n <$macrocall $name=\"release-plugin-item\" itemdesc=<<plugin-name>> itemconfig=<<plugin-config>> defaultfilename=<<plugin-filename>> templateplaceholder=\"$:/core/templates/tid-tiddler\" />\n </$set>\n </$set>\n</$list>\n\n\n!! Plugin-Demo Wiki\n\n<<release-item \"demo wiki\" \"$:/config/ThirdFlow/demowiki\" \"plugin-demo.html\" \"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow","caption":"ThirdFlow","created":"20180203154413491","list":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations","modified":"20180217150140183","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"<<tabs \"[all[shadows+tiddlers]prefix[$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/]]\" \"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations\" \"$:/state/tabs/cp3f\" >>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData","created":"20180202124221987","list-before":"$:/core/ui/EditTemplate/body","modified":"20180205194150923","tags":"$:/tags/EditTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-info-row(name, value, output:\"html\")\n\\rules except wikilink\n <tr class=\"tfc-plugin-info-element\">\n <td class=\"tfc-plugin-info-element-name\">\n $name$:\n </td>\n <td class=\"tfc-plugin-edit-element-value\">\n\t $value$\n </td>\n </tr>\n\\end\n\n\\define plugin-edit-row(name, field, placeholder)\n <tr class=\"tfc-plugin-info-element\">\n <td class=\"tfc-plugin-info-element-name\">\n $name$:\n </td>\n <td class=\"tfc-plugin-edit-element-value\">\n <$edit-text field=\"$field$\" placeholder=\"$placeholder$\"/>\n </td>\n </tr>\n\\end\n\n<$list filter=\"[all[current]has:field[plugin-type]!field:plugin-type[import]]\">\n\n<h1>Plugin Meta Data</h1>\n\n<div class=\"tfc-plugin-info\">\n <table class=\"tfc-plugin-info\">\n <$set name=\"publisher\" filter=\"[all[current]get[draft.title]removeprefix[$:/plugins/]splitbefore[/]removesuffix[/]]\">\n <<plugin-info-row name:\"Plugin publisher\" value:\"$(publisher)$\" output:\"text\">>\n <$set name=\"plugin-name\" filter=\"[all[current]get[draft.title]removeprefix[$:/plugins/]removeprefix<publisher>removeprefix[/]splitbefore[/]]\">\n <<plugin-info-row name:\"Plugin name\" value:\"$(plugin-name)$\" output:\"text\">>\n </$set>\n </$set>\n\n\t<<plugin-edit-row \"Version\" \"version\" \"0.0.1\">>\n\t<<plugin-edit-row \"Plugin type\" \"plugin-type\" \"plugin\">>\n\t<<plugin-edit-row \"Description\" \"description\" \"Tell TiddlyWiki users about what your plugin does\">>\n\t<<plugin-edit-row \"Author\" \"author\" \"U. K. Known\">>\n\t<<plugin-edit-row \"Source\" \"source\" \"https://example.org/foo\">>\n\t<<plugin-edit-row \"Plugin priority\" \"plugin-priority\" \"\">>\n\t<<plugin-edit-row \"Required TW Core version\" \"core-version\" \">=5.0.0\">>\n</table>\n</div>\n\n</$list>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/PluginSources":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/PluginSources","caption":"Plugin Sources","created":"20141003192047443","modified":"20180217202921185","tags":"$:/tags/MoreSideBar","type":"text/vnd.tiddlywiki","text":"\\whitespace trim\n\n\\define qualify-plugin() $(q)$/$(plugin-name)$\">>\n\n\\define plugin-full-path() $:/plugins/$(plugin-name)$\n\n\\define action-new-with-template(actiontext, infixtype, title, template, fields)\n<$set name=\"newtitle\" value=<<typedplugintiddlertitle pluginroot:\"$:/plugins/$(plugin-name)$\" configtiddler:\"$(tf-config-base)$$infixtype$\" defaulttiddler:\"$(tf-config-base-default)$$infixtype$\" title:\"$title$\">> >\n<$button class=<<tv-config-toolbar-class>> >\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<newtitle>> $param=\"$template$\" $fields$ />\n$actiontext$\n</$button>\n</$set>\n\\end\n\n\\define new-source-tiddler-name() $(plugin-full-path)$/new source tiddler\n\n\\define plugin-icon() $(plugin-full-path)$/icon\n\n\\define plugin-type-filter() [{$(plugin-full-path)$!!plugin-type}]\n\n\\define plugin-default-icon() $:/core/images/plugin-generic-$(plugin-type)$\n\n\\define plugin-contents-filter() [prefix[$(plugin-full-path)$/]!is[shadow]sort[]]\n\n\\define plugin-item-relname() [all[current]removeprefix[$(plugin-full-path)$/]!prefix[tiddlywiki/]]\n\n\\define plugin-item()\n<div class=\"tc-menu-list-subitem\">\n <$link to={{!!title}}>\n <$list filter=<<plugin-item-relname>> >\n ...<$view field=\"title\" format=\"text\" />\n </$list>\n </$link>\n</div>\n\\end\n\n\\define empty-plugin()\n<$set name=\"plugin-boilerplate-icon\" value=\"{{$:/core/images/list-bullet}} \">\n <div class=\"tc-menu-list-subitem\">\n {{$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate}}\n </div>\n</$set>\n\\end\n\n<$set name=\"q\" value=<<qualify \"$:/state/popup/thirdflow/pluginactions\">>>\n<div class=\"tc-timeline\">\n <div class=\"tc-menu-list-item tc-sidebar-header\">\n <div class=\"tc-plugin-info-chunk\">{{$:/core/images/plugin-generic-plugin}}</div>\n \n <$button tooltip=\"create new plugin\" class=<<tv-config-toolbar-class>> >\n <$action-sendmessage $message=\"tm-new-tiddler\" title=\"$:/plugins/PublisherName/PluginName\" $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin\" />\n {{$:/core/images/new-button}}\n </$button>\n \n new plugin\n </div>\n\n <$list filter=\"[prefix[$:/plugins/]has[plugin-type]removeprefix[$:/plugins/]!prefix[tiddlywiki/]!prefix[TheDiveO/ThirdFlow/]sort[]] -[all[shadows]prefix[$:/plugins/]shadowsource[]removeprefix[$:/plugins/]]\" variable=\"plugin-name\">\n <div class=\"tc-menu-list-item tc-sidebar-header\">\n \n <!-- plugin icon or default icon -->\n <div class=\"tc-plugin-info-chunk\">\n <$transclude tiddler=<<plugin-icon>> >\n <$list filter=<<plugin-type-filter>> variable=\"plugin-type\">\n <$transclude tiddler=<<plugin-default-icon>> />\n </$list>\n </$transclude>\n </div>\n \n <!-- plugin actions -->\n <$set name=\"qp\" value=<<qualify-plugin>> >\n <$button popup=<<qp>> class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n <$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n {{$:/core/images/down-arrow}}\n </$list>\n <$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n <span class=\"tc-btn-text\">plugin actions</span>\n </$list>\n </$button>\n <$reveal state=<<qp>> type=\"popup\" position=\"below\" animate=\"yes\">\n <div class=\"tc-drop-down\">\n <$list filter=\"[all[shadows+tiddlers]tag[$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction]!has[draft.of]sort[caption]]\">\n <$transclude mode=\"inline\"/>\n </$list>\n </div>\n </$reveal>\n </$set>\n \n <!-- plugin author/name w. link -->\n <$link to=<<plugin-full-path>>>\n <$macrocall $name=\"plugin-name\" $output=\"text/plain\" />\n </$link>\n (<$count filter=<<plugin-contents-filter>> />)\n \n <!-- list of plugin contents -->\n <$list filter=<<plugin-contents-filter>> emptyMessage=<<empty-plugin>> >\n <<plugin-item>>\n </$list>\n \n </div>\n </$list>\n</div>\n</$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js\ntags: \nmodified: 20180207103459780\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [all[XXX]] filter operator function. Such\n * all-filter operators return all tiddlers of a certain \"category\". The parameters\n * to this all-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step. Not of much use here, ignore it for most usecases.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foos = function(source, prefix, options) {\n return [\"foo\", \"bar\", \"baz\"];\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207103459780"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js\ntags: \nmodified: 20180207092452733\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our command and tells TiddlyWiki whether to run it\n * synchronously or asynchronously. The latter use a callback to signal\n * finish or failure (see below).\n */\nexports.info = {\n name: \"foobarbaz\",\n synchronous: true\n};\n\n/* Creates a new command instance. Please note that asynchronous commands will\n * receive a third \"callback\" parameter, which we should store for later use;\n * see below how to use it.\n */\nvar Command = function(params, commander /*, callback */) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n /* this.callback = callback; */\n};\n\n/* Executes our command. For synchronous commands return either null (success)\n * or an error string. For asynchronous commands use the callback instead which\n * we'd receive in the constructor call.\n */\nCommand.prototype.execute = function() {\n /* check your command parameters, which you will find in this.params */\n if (this.params.length < 1) {\n return \"Missing foo parameter\";\n }\n\n /* ... */\n\n return null; /* no error. */\n /* this.callback(); // for async commands */\n};\n\nexports.Command = Command;\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207092452733"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css","created":"20180205162715434","modified":"20180207092942425","type":"text/css","text":"/* add your CSS rules here */\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js\nmodified: 20180207103213628\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and and exports our filter operator function. The parameters\n * to operator functions are as follows:\n *\n * source: a tiddler iterator that represents the resoluts of the previous\n * filter step.\n * operator: the arguments to this filter operator...\n * .operator: name of the filter operator.\n * .operand: the operand as a string; text references and variable names\n * have already been resolved at this point.\n * .prefix: an optional \"!\" if the filter is to be negated.\n * .suffix: an optional string containing an additional filter argument.\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's allowed to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.dofoo = function(source, operator, options) {\n\tvar results = [];\n\tsource(function(tiddler, title) {\n\t\tresults.push(\"foo\" + title);\n\t});\n\treturn results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103213628"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history","created":"20180202212229406","modified":"20180202212958716","tags":"","type":"text/vnd.tiddlywiki","text":"* ''0.0.1'' -- my first plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js\nmodified: 20180207103529498\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [is[XXX]] filter operator function. Such\n * is-filter operators filter tiddlers by a certain \"category\". The parameters\n * to this is-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step, which we now need to filter.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foo = function(source, prefix, options) {\n var results = [];\n\n if (prefix !== \"!\") {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) >= 0) {\n results.push(title);\n }\n });\n } else {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) < 0) {\n results.push(title);\n }\n });\n }\n\n return results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103529498"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js\nmodified: 20180207100549039\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Tells TiddlyWiki the name of our macro through the export mechanism. */\nexports.name = \"foObAr\";\n\n/* Lists of macro parameters; leave this array empty if you need none, or\n * want all supplied macro call parameters to be passed to the run() method.\n */\nexports.params = [\n { name: \"foo\" }, /* 1st parameter name */\n { name: \"bar\", default: \"bar\" }\n];\n\n/* Executes (runs) our macro when it requires evaluation; returns a string\n * value.\n */\nexports.run = function(foo, bar) {\n return foo + bar;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207100549039"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js\nmodified: 20180207095013968\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports/exposes symbols that users of this library can later use\n * after require()'ing a reference to this library.\n */\nexports.dofoo = function () {\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207095013968"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license","created":"20180202222709213","modified":"20180202222730979","tags":"","type":"text/vnd.tiddlywiki","text":"This plugin is licensed under the ..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js\nmodule-type: parser\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Parses blocks of source text into a parse tree. The parameters to the\n * constructor are as follows:\n *\n * type: the (mime type) of the text to parse.\n * text: the text to parse.\n * options:\n * .wiki: TiddlyWiki object reference.\n * ._canonical_uri: ...\n */\nvar Parser = function(type, text, options) {\n this.tree = [{\n \"type\": \"element\", \"tag\": \"code\", \"children\": [{\n \"type\": \"text\", \"text\": text\n }]\n }];\n};\n\n/* Declares the (document) mime types this parser is able to handle; multiple\n * export declarations are supported.\n */\nexports[\"application/x-foo-ducument\"] = Parser;\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"parser"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin","created":"20180202203909068","modified":"20180218193839795","plugin-type":"plugin","tags":"","type":"application/json","text":"{\"tiddlers\": {}}"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme","created":"20180202222539879","modified":"20180202222703851","tags":"","type":"text/vnd.tiddlywiki","text":"Tell your users about your plugin: what is it good for? How can it be used? And so on..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js","text":"/*\\\ncreated: 20180205163726933\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js\nmodified: 20180205164120901\ntype: application/javascript\nmodule-type: startup\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Names this startup module and tells TiddlyWiki to run it either\n * synchronously or asynchronously.\n */\nexports.name = \"foostartup\";\nexports.synchronous = true;\n\n/* Optionally set the order of startup execution */\n/* exports.after = [\"story\"]; */\n/* Optionally set the platforms on which to be executed */\n/* exports.platforms = [\"browser\"]; */\n\n/* Runs this function during startup */\nexports.startup = function() {\n /* do something here... */\n};\n \n})();","created":"20180205163726933","modified":"20180205164120901","type":"application/javascript","module-type":"startup"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template","created":"20180205164155065","modified":"20180205164212763","type":"text/vnd.tiddlywiki","text":"<!-- throw in your TiddlyWiki markup here -->"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js","text":"/*\\\ncreated: 20180211152629856\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js\nmodified: 20180211155735719\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to $tw.config */\nexports.foofoo = 42;\nexports.foobar = {};\n \n})();","created":"20180211152629856","type":"application/javascript","modified":"20180211155735719","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js","text":"/*\\\ncreated: 20180211153224637\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js\nmodified: 20180211153304692\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to the global $tw */\nexports.foofoo = 42;\n \n})();","created":"20180211153224637","type":"application/javascript","modified":"20180211153304692","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro","created":"20180205162715434","modified":"20180207101427201","type":"text/vnd.tiddlywiki","text":"\\define fOObARbAZ()\nfOObARBaZong!\n\\end"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui","created":"20180205164236165","modified":"20180205164237226","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js","text":"/*\\\ncreated: 20180205164319473\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js\nmodified: 20180211153602323\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180205164319473","type":"application/javascript","modified":"20180211153602323"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js","text":"/*\\\ncreated: 20180211153526427\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js\nmodified: 20180211153817740\ntags: \n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Only when running inside a Node.js-based TiddlyWiki server,\n * this creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180211153526427","type":"application/javascript","modified":"20180211153817740","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js","text":"/*\\\ncreated: 20180211154125055\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js\nmodified: 20180211154857371\ntags: \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\n/* Creates a new <$foo> widget. */\nvar FooWidget = function(parseTreeNode, options) {\n this.initialise(parseTreeNode, options);\n};\n \n/* \"Inherits\" from the Widget base \"class\" in order to get all\n * the basic widget functionality.\n */\nFooWidget.prototype = new Widget();\n\n/* Renders this widget into the DOM. */\nFooWidget.prototype.render = function(parent,nextSibling) {\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n /* ... */\n};\n\n/* Computes the internal state of this widget. */\nFooWidget.prototype.execute = function() {\n /* ... */\n this.makeChildWidgets();\n}; \n \n/* Selectively refreshes this widget if needed and returns\n * true if either this widget itself or one of its children\n * needs to be re-rendered.\n */\nFooWidget.prototype.refresh = function(changedTiddlers) {\n var changedAttributes = this.computeAttributes(),\n hasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n if (hasChangedAttributes) {\n /* ... */\n }\n return this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\n/* Finally exports the widget constructor. */\nexports.foo = FooWidget;\n\n})();","created":"20180211154125055","type":"application/javascript","modified":"20180211154857371","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js\ntype: application/javascript\nmodule-type: wikirule\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our wikiparser rule and exports it */\nexports.name = \"dash\";\n/* Export the type(s) of rule, can be \"inline: true\" or/and \"block: true\" */\nexports.types = { inline: true };\n\n/* Initializes the rule and tells the parser when to match */\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /fOO!/mg;\n};\n\n/* Parses markup after the parser has matched out rule. It then returns\n * a parse tree.\n */\nexports.parse = function() {\n\t/* Move past this match */\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: \"foo\"\n\t}];\n};\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"wikirule"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator","caption":"new [all[...]] filter operator","created":"20180207103416636","modified":"20180207103625598","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"allfilterinfix\" title:\"filter.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js\" fields:\"module-type='allfilteroperator'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate","caption":"add plugin boilerplate tiddlers","created":"20180202210615976","modified":"20180211162427574","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"\\define plugin-tiddler-within(title) $:/plugins/$(plugin-name)$/$title$\n\n<$set name=\"old-list\" tiddler=<<plugin-full-path>> field=\"list\">\n<$set name=\"list\" filter=\"[enlist<old-list>] -[[readme]] -[[license]] -[[history]]\">\n<$set name=\"new-list\" filter=\"readme license history [enlist<list>]\">\n<$button class=<<tv-config-toolbar-class>> >\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<plugin-tiddler-within \"history\">> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<plugin-tiddler-within \"license\">> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<plugin-tiddler-within \"readme\">> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme\" />\n<$action-setfield $tiddler=<<plugin-full-path>> list=<<new-list>> />\n<<plugin-boilerplate-icon>>{{!!caption}}\n</$button>\n</$set>\n</$set>\n</$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command","caption":"new command module","created":"20180202223504033","modified":"20180207100039540","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"commandinfix\" title:\"command.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js\" fields:\"module-type='command'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config","caption":"new $tw.config module","created":"20180211155634174","modified":"20180211155728819","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twconfiginfix\" title:\"twconfig.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js\" fields:\"module-type='config'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle","caption":"new CSS tiddler","created":"20180202223710863","modified":"20180207100321397","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"styleinfix\" title:\"style.css\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css\" fields:\"tags='$:/tags/Stylesheet'\">>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator","caption":"new [...[]] filter operator","created":"20180207103225047","modified":"20180207103715611","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"filterinfix\" title:\"filter.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js\" fields:\"module-type='filteroperator'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator","caption":"new [is[...]] filter operator","created":"20180207103539461","modified":"20180207103611302","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"isfilterinfix\" title:\"filter.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js\" fields:\"module-type='isfilteroperator'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro","caption":"new Javascript macro","created":"20180204191504018","modified":"20180207100731291","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"commandinfix\" title:\"macro.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js\" fields:\"module-type='macro'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library","caption":"new Javascript library","created":"20180202223038045","modified":"20180207100520908","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"jslibinfix\" title:\"library.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js\" fields:\"module-type='library'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler","caption":"new wikitext tiddler","created":"20180202224303945","modified":"20180207100850748","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"\" title:\"New Tiddler\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/Tiddler\">>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal","caption":"new $tw globals module","created":"20180211155502716","modified":"20180211155620374","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twglobalinfix\" title:\"twglobal.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js\" fields:\"module-type='global'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro","caption":"new wikitext macro","created":"20180202223619732","modified":"20180207101828276","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twmacroinfix\" title:\"macro\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro\" fields:\"tags='$:/tags/Macro'\">>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util","caption":"new $tw.utils module","created":"20180211155355001","modified":"20180211155426871","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twutilinfix\" title:\"util.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js\" fields:\"module-type='utils'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode","caption":"new Nodejs-only $tw.utils module","created":"20180211155116031","modified":"20180211155445679","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"twutilnodeinfix\" title:\"utilnode.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js\" fields:\"module-type='utils-node'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget","caption":"new widget module","created":"20180202223929415","modified":"20180211155035989","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<<action-new-with-template actiontext:{{!!caption}} infixtype:\"widgetinfix\" title:\"widget.js\" template:\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js\" fields:\"module-type='widget'\">>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData","created":"20141025150024301","list-before":"$:/core/ui/ViewTemplate/plugin","modified":"20180205194450156","tags":"$:/tags/ViewTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-type-infotiddler(tiddler)\n <$transclude tiddler=\"$tiddler$\">\n <$transclude tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined\"/>\n </$transclude>\n\\end\n\n\\define plugin-type-info(type)\n <$macrocall $name=\"plugin-type-infotiddler\" tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/$type$\"/>\n\\end\n\n\\define plugin-info-row(name, value)\n\\rules except wikilink\n <tr class=\"tfc-plugin-info-element\">\n <td class=\"tfc-plugin-info-element-name\">\n $name$:\n </td>\n <td class=\"tfc-plugin-info-element-value\">\n $value$\n </td>\n </tr>\n\\end\n\n\\define plugin-info-field-unspecified()\n <span class='tfc-plugin-info-unspecified'>unspecified</span>\n\\end\n\n\\define plugin-info-field(name, field)\n <<plugin-info-row \"$name$\" \"<$view field='$field$' format='text'><$macrocall $name='plugin-info-field-unspecified' /></$view>\">>\n\\end\n\n\\define plugin-info-field-plugin-type-int(name, type)\n <$set name=\"desc\" value=<<plugin-type-info \"$type$\" >> >\n <$macrocall $name=\"plugin-info-row\" name=\"$name$\" value=<<desc>> />\n </$set>\n\\end\n\n\\define plugin-info-field-plugin-type(name)\n <$macrocall $name=\"plugin-info-field-plugin-type-int\" name=\"$name$\" type={{!!plugin-type}} />\n\\end\n\n\\define plugin-info-field-link(name, field)\n <$list filter=\"[all[current]!field:$field$[]]\" emptyMessage=\"\"\"<<plugin-info-row \"$name$\" \"<$macrocall $name='plugin-info-field-unspecified'/>\" >>\"\"\">\n <$macrocall $name=\"plugin-info-row\" name=\"$name$\" value={{!!$field$}} />\n </$list>\n\\end\n\n\\define plugin-info-filter(name, filter)\n <$list filter=\"$filter$\" emptyMessage=\"\"\"<<plugin-info-row \"$name$\" \"<$macrocall $name='plugin-info-field-unspecified'/>\" >>\"\"\">\n <$macrocall $name=\"plugin-info-row\" name=\"$name$\" value={{!!title}} />\n </$list>\n\\end\n\n<$list filter=\"[all[current]has[plugin-type]!field:plugin-type[import]]\">\n\n! Plugin Meta Data\n\n<div class=\"tfc-plugin-info\">\n <table class=\"tfc-plugin-info\">\n <$list filter=\"[all[current]removeprefix[$:/plugins/]]\">\n \t<<plugin-info-filter \"Plugin publisher\" \"[all[current]titlecomponents[]first[]]\">>\n \t<<plugin-info-filter \"Plugin name\" \"[all[current]titlecomponents[]nth[2]]\">>\n </$list>\n <$list filter=\"[all[current]removeprefix[$:/themes/]]\">\n \t<<plugin-info-filter \"Theme publisher\" \"[all[current]titlecomponents[]first[]]\">>\n \t<<plugin-info-filter \"Theme name\" \"[all[current]titlecomponents[]nth[2]]\">>\n </$list>\n <$list filter=\"[all[current]prefix[$:/core]]\">\n \t<<plugin-info-row \"Plugin publisher\" \"TiddlyWiki\">>\n <<plugin-info-row \"Plugin name\" \"core\">>\n </$list>\n <<plugin-info-field \"Version\" \"version\">>\n <$macrocall $name=\"plugin-info-field-plugin-type\" name=\"Plugin type\" />\n <<plugin-info-field \"Description\" \"description\">>\n <<plugin-info-field \"Author\" \"author\">>\n <$macrocall $name=\"plugin-info-field-link\" name=\"Source\" field=\"source\" />\n <<plugin-info-field \"Plugin priority\" \"plugin-priority\">>\n <<plugin-info-field \"Required TW Core version\" \"core-version\">>\n </table>\n</div>\n\n</$list>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import","created":"20141025175537027","modified":"20180205194514922","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`import` -- is a special plugin type only used internally by the TiddlyWiki 5 core when importing tiddlers. No ordinary plugin should ever use a plugin type of `import`."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language","created":"20141025180244406","modified":"20141025180805600","type":"text/vnd.tiddlywiki","text":"`language` -- this plugin is a language package for the language \"{{!!name}}\". This language plugin will automatically be used when you select this language in the [[basic settings|$:/core/ui/ControlPanel/Basics]] of the [[control panel|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin","created":"20141025155451829","modified":"20180205194504314","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`plugin` -- this is the most general form of a TiddlyWiki 5 plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme","created":"20141025174630240","modified":"20180205194533069","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`theme` -- contains a TiddlyWiki 5 theme. You can select this theme through the [[theme switcher|$:/core/ui/ControlPanel/Theme]] in the [[control pane|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined","created":"20141025155725392","modified":"20141117190958706","type":"text/vnd.tiddlywiki","text":"<code><$view field=\"plugin-type\"/></code> -- is an ''unknown plugin type''."},"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js","text":"/*\\\ncreated: 20141020111918405\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js\ntype: application/javascript\nmodified: 20141020111927394\nmodule-type: widget\n\nDefault widget: if a particular tiddler is not present,\nthen it gets created using the default values specified.\nIn contrast to the new tiddler creation message, we don't\nuse a static template but instead accept the default values\nin form of a JSON string that may be the result of some\nmacro invokation.\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 EnsureTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEnsureTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEnsureTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEnsureTiddlerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.ensureTitle = this.getAttribute(\"title\",\"currentTiddler\");\n\tthis.ensureDefault = this.getAttribute(\"default\");\n\n var tiddler = this.wiki.getTiddler(this.ensureTitle);\n if(!tiddler) {\n var defaults;\n try {\n defaults = JSON.parse(this.ensureDefault);\n } catch(ex) {\n defaults = {};\n }\n defaults[\"title\"] = this.ensureTitle;\n var mods = this.wiki.getModificationFields();\n this.wiki.addTiddler(new $tw.Tiddler(defaults,mods));\n }\n \n // Construct the 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*/\nEnsureTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.title || changedAttributes.default) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.ensuretiddler = EnsureTiddlerWidget;\n\n})();\n","created":"20141020111918405","type":"application/javascript","modified":"20141020111927394","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js","text":"/*\\\ncreated: 20141015190230115\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js\ntype: application/javascript\nmodified: 20141015190236275\nmodule-type: widget\n\nThe JSON mangler widget -- similar to the fieldmangler widget,\nbut for mangling JSON data in a data tiddler instead of\nmangling the fields of a tiddler.\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\n// The JSON mangler widget understands the following events:\n// * tm-add-json-index: add a new index to a JSON data tiddler, the\n// index name to add is in the event param parameter.\n// * tm-remove-json-index: remove an existing index from a JSON data\n// tiddler, as specified in the event param parameter.\nvar JsonManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-json-index\", handler: \"handleAddJsonIndexEvent\"},\n\t\t{type: \"tm-remove-json-index\", handler: \"handleRemoveJsonIndexEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nJsonManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nJsonManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nJsonManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nJsonManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Add a new index (as specified in the event param parameter) to a JSON\n// data tiddler (specified in the widget title parameter). It is also possible\n// to specify a default value; the event param parameter then needs to be a hashmap\n// with the elements \"index\" (name of index) and \"default\" (default value).\nJsonManglerWidget.prototype.handleAddJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tvar def = (typeof event.param === \"string\") ? \"\" : event.param[\"default\"];\n\tif ( index ) {\n\t\tvar data = tiddler ? this.wiki.getTiddlerData(tiddler, {}) : {};\n\t\tdata[index] = \"\";\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\n// Remove an existing index (as specified in the event param parameter) from a JSON\n// data tiddler (specified in the widget title parameter).\nJsonManglerWidget.prototype.handleRemoveJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tif ( tiddler && index ) {\n\t\tvar data = this.wiki.getTiddlerData(tiddler, {});\n\t\tdelete data[index];\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\nexports.jsonmangler = JsonManglerWidget;\n\n})();\n","created":"20141015190230115","type":"application/javascript","modified":"20141015190236275","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js","text":"/*\\\ncreated: 20141020111936183\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js\ntype: application/javascript\nmodified: 20141020111942403\nmodule-type: widget\n\nThe list mangler widget -- mangles the list field of a\ntiddler. It supports the following parameters:\n* tiddler: the tiddler to work on, default is currentTiddler.\n* field: the field to mangle as a list, default is the list field.\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\n// The list mangler widget understands the following events:\n// * tm-add-list-element\n// * tm-remove-list-element\n// * tm-back-list-element\n// * tm-forward-list-element\nvar ListManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-list-element\", handler: \"handleAddListElementEvent\"},\n\t\t{type: \"tm-remove-list-element\", handler: \"handleRemoveListElementEvent\"},\n\t\t{type: \"tm-shift-forward-list-element\", handler: \"handleShiftForwardListElementEvent\"},\n\t\t{type: \"tm-shift-back-list-element\", handler: \"handleShiftBackListElementEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nListManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nListManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nListManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n this.mangleField = this.getAttribute(\"field\",\"list\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nListManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Appends a new element to the list field (or other anspecified field) of\n// the given tiddler. Ensures that the same element never gets added twice.\n// If the tiddler doesn't exist yet, it will be created.\nListManglerWidget.prototype.handleAddListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle) || new $tw.Tiddler({title: this.mangleTitle});\n var addElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(addElement);\n if(where<0) {\n list.push(addElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n return true;\n};\n\n// Removes an existing element from the list field (or another specified field)\n// of the given tiddler.\nListManglerWidget.prototype.handleRemoveListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var remElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(remElement);\n if(where>=0) {\n list.splice(where,1);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\n// Moves an existing element from the list field (or another specified field)\n// one position forward towards the end of the list of the given tiddler.\nListManglerWidget.prototype.handleShiftForwardListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var shiftElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(shiftElement);\n if((where>=0) && (where<list.length-1)) {\n var swapElement = list[where+1];\n list.splice(where,2,swapElement,shiftElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\n// Moves an existing element from the list field (or another specified field)\n// one position backwards towards the beginning of the list of the given tiddler.\nListManglerWidget.prototype.handleShiftBackListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var shiftElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(shiftElement);\n if(where>=1) {\n var swapElement = list[where-1];\n list.splice(where-1,2,shiftElement,swapElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\nexports.listmangler = ListManglerWidget;\n\n})();\n","created":"20141020111936183","type":"application/javascript","modified":"20141020111942403","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js","text":"/*\\\ncreated: 20140927173129833\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js\ntype: application/javascript\nmodified: 20140927173153432\nmodule-type: widget\n\nmetafy widget\n\nUsed to dump javascript tiddlers correctly as .js files as opposed to .js.tid\nfiles.\n\nwidget attributes:\n* tiddler: defaults to the widget variable currentTiddler.\n* detect: regular expression detecting a meta data section (which may be\n empty). Its parameter #2 indicates where to replace/insert meta data\n when such a section is present. Otherwise, the template parameter will\n be used instead. For instance, the following regular expression composed\n of these elements:\n \"(^\\/\\*\\\\(?:\\r?\\n))\"\n -- the special comment marker at the section beginning on its own line.\n \"((?:^[^\\r\\n]+(?:\\r?\\n))*)\"\n -- matches all meta data field lines.\n \"(?:(?:^[^\\r\\n]*(?:\\r?\\n))*)\"\n -- matches a trailing normal comment text.\n \"(?:^\\\\\\*\\/(?:\\r?\\n)?)\"\n -- the special comment marker at the section end on its own line.\n* exclude: the fields to exclude; defaults to \"text bag revision\".\n* template: template to use to establish meta data section if not yet present.\n $fields$ is used to indicate where to insert the fields (meta) data section of\n \"field: value\\n\" pairs. For instance, \"/*\\\\\\n$fields$\\\\*\"+\"/\\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\n/*\nConstructor\n */\nvar MetafyWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n\n/*\nInherit from the base widget class\n*/\nMetafyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMetafyWidget.prototype.render = function(parent, nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode, nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMetafyWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.metafyTitle = this.getAttribute(\"tiddler\", this.getVariable(\"currentTiddler\"));\n\tthis.metafyDetect = this.getAttribute(\"match\",\n\t\t \"(^\\\\/\\\\*\\\\\\\\(?:\\\\r?\\\\n))\" // special comment marker beginning\n\t\t+ \"((?:^[^\\\\r\\\\n]+(?:\\\\r?\\\\n))*)\" // field name-value pairs\n\t\t+ \"(?:(?:^[^\\\\r\\\\n]*(?:\\\\r?\\\\n))*)\" // remaining comment section\n\t\t+ \"(?:^\\\\\\\\\\\\*\\\\/(?:\\\\r?\\\\n)?)\" // special comment marker end\n\t);\n\tvar exclude = this.getAttribute(\"exclude\", \"text bag revision\");\n\texclude = exclude.split(\" \");\n\tthis.metafyExclude = exclude;\n\tthis.metafyTemplate = this.getAttribute(\"template\", \"/*\\\\\\n$fields$\\\\*/\\n\");\n\t\n\tvar tiddler = this.wiki.getTiddler(this.metafyTitle);\n\tvar text = \"\";\n\tif (tiddler) {\n\t\ttext = this.wiki.getTiddlerText(this.metafyTitle);\n\t}\n\t\n\tvar fields = \"\";\n\tfor(var field in tiddler.fields) {\n\t\tif (exclude.indexOf(field) === -1) {\n\t\t\tfields += field + \": \" + tiddler.getFieldString(field) + \"\\n\";\n\t\t}\n\t}\n\t\n\tvar match = new RegExp(this.metafyDetect, \"mg\").exec(text);\n\tif (match) {\n\t\tvar start = match.index + match[1].length;\n\t\ttext = text.substr(0, start) + fields + text.substr(start + match[2].length);\n\t} else {\n\t\tconsole.log(\"no match\");\n\t\ttext = this.metafyTemplate.replace(\"$fields$\", fields) + text;\n\t}\n\t\n\tthis.text = text;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMetafyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.detect || changedAttributes.exclude || changedAttributes.template || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nExport the metafy widget\n */\nexports.metafy = MetafyWidget;\n\n})();\n","created":"20140927173129833","type":"application/javascript","modified":"20140927173153432","module-type":"widget"}}}
{
diff --git a/editions/release/output/thirdflow.tid b/editions/release/output/thirdflow.tid
index 4f9c59c..172cdae 100644
--- a/editions/release/output/thirdflow.tid
+++ b/editions/release/output/thirdflow.tid
@@ -8,6 +8,6 @@ plugin-type: plugin
source: http://thediveo.github.io/ThirdFlow
title: $:/plugins/TheDiveO/ThirdFlow
type: application/json
-version: 1.2.1
+version: 1.2.2
-{"tiddlers":{"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js","text":"/*\\\ncreated: 20141003161333154\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js\nmodified: 20141003161445164\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// Because sometimes you need to style the cursor's line.\n//\n// Adds an option 'styleActiveLine' which, when enabled, gives the\n// active line's wrapping
the CSS class \"CodeMirror-activeline\",\n// and gives its background
the class \"CodeMirror-activeline-background\".\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n var WRAP_CLASS = \"CodeMirror-activeline\";\n var BACK_CLASS = \"CodeMirror-activeline-background\";\n\n CodeMirror.defineOption(\"styleActiveLine\", false, function(cm, val, old) {\n var prev = old && old != CodeMirror.Init;\n if (val && !prev) {\n cm.state.activeLines = [];\n updateActiveLines(cm, cm.listSelections());\n cm.on(\"beforeSelectionChange\", selectionChange);\n } else if (!val && prev) {\n cm.off(\"beforeSelectionChange\", selectionChange);\n clearActiveLines(cm);\n delete cm.state.activeLines;\n }\n });\n\n function clearActiveLines(cm) {\n for (var i = 0; i < cm.state.activeLines.length; i++) {\n cm.removeLineClass(cm.state.activeLines[i], \"wrap\", WRAP_CLASS);\n cm.removeLineClass(cm.state.activeLines[i], \"background\", BACK_CLASS);\n }\n }\n\n function sameArray(a, b) {\n if (a.length != b.length) return false;\n for (var i = 0; i < a.length; i++)\n if (a[i] != b[i]) return false;\n return true;\n }\n\n function updateActiveLines(cm, ranges) {\n var active = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) continue;\n var line = cm.getLineHandleVisualStart(range.head.line);\n if (active[active.length - 1] != line) active.push(line);\n }\n if (sameArray(cm.state.activeLines, active)) return;\n cm.operation(function() {\n clearActiveLines(cm);\n for (var i = 0; i < active.length; i++) {\n cm.addLineClass(active[i], \"wrap\", WRAP_CLASS);\n cm.addLineClass(active[i], \"background\", BACK_CLASS);\n }\n cm.state.activeLines = active;\n });\n }\n\n function selectionChange(cm, sel) {\n updateActiveLines(cm, sel.ranges);\n }\n});\n","created":"20141003161333154","modified":"20141003161445164","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js","text":"/*\\\ncreated: 20141003162651180\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js\nmodified: 20141003162818850\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n var indentUnit = config.indentUnit,\n tokenHooks = parserConfig.tokenHooks,\n mediaTypes = parserConfig.mediaTypes || {},\n mediaFeatures = parserConfig.mediaFeatures || {},\n propertyKeywords = parserConfig.propertyKeywords || {},\n nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n colorKeywords = parserConfig.colorKeywords || {},\n valueKeywords = parserConfig.valueKeywords || {},\n fontProperties = parserConfig.fontProperties || {},\n allowNested = parserConfig.allowNested;\n\n var type, override;\n function ret(style, tp) { type = tp; return style; }\n\n // Tokenizers\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (tokenHooks[ch]) {\n var result = tokenHooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == \"@\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"def\", stream.current());\n } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n return ret(null, \"compare\");\n } else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \"#\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"atom\", \"hash\");\n } else if (ch == \"!\") {\n stream.match(/^\\s*\\w*/);\n return ret(\"keyword\", \"important\");\n } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (ch === \"-\") {\n if (/[\\d.]/.test(stream.peek())) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (stream.match(/^\\w+-/)) {\n return ret(\"meta\", \"meta\");\n }\n } else if (/[,+>*\\/]/.test(ch)) {\n return ret(null, \"select-op\");\n } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n return ret(\"qualifier\", \"qualifier\");\n } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n return ret(null, ch);\n } else if (ch == \"u\" && stream.match(\"rl(\")) {\n stream.backUp(1);\n state.tokenize = tokenParenthesized;\n return ret(\"property\", \"word\");\n } else if (/[\\w\\\\\\-]/.test(ch)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"property\", \"word\");\n } else {\n return ret(null, null);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n if (quote == \")\") stream.backUp(1);\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenParenthesized(stream, state) {\n stream.next(); // Must be '('\n if (!stream.match(/\\s*[\\\"\\')]/, false))\n state.tokenize = tokenString(\")\");\n else\n state.tokenize = null;\n return ret(null, \"(\");\n }\n\n // Context management\n\n function Context(type, indent, prev) {\n this.type = type;\n this.indent = indent;\n this.prev = prev;\n }\n\n function pushContext(state, stream, type) {\n state.context = new Context(type, stream.indentation() + indentUnit, state.context);\n return type;\n }\n\n function popContext(state) {\n state.context = state.context.prev;\n return state.context.type;\n }\n\n function pass(type, stream, state) {\n return states[state.context.type](type, stream, state);\n }\n function popAndPass(type, stream, state, n) {\n for (var i = n || 1; i > 0; i--)\n state.context = state.context.prev;\n return pass(type, stream, state);\n }\n\n // Parser\n\n function wordAsValue(stream) {\n var word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"variable\";\n }\n\n var states = {};\n\n states.top = function(type, stream, state) {\n if (type == \"{\") {\n return pushContext(state, stream, \"block\");\n } else if (type == \"}\" && state.context.prev) {\n return popContext(state);\n } else if (type == \"@media\") {\n return pushContext(state, stream, \"media\");\n } else if (type == \"@font-face\") {\n return \"font_face_before\";\n } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {\n return \"keyframes\";\n } else if (type && type.charAt(0) == \"@\") {\n return pushContext(state, stream, \"at\");\n } else if (type == \"hash\") {\n override = \"builtin\";\n } else if (type == \"word\") {\n override = \"tag\";\n } else if (type == \"variable-definition\") {\n return \"maybeprop\";\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n } else if (type == \":\") {\n return \"pseudo\";\n } else if (allowNested && type == \"(\") {\n return pushContext(state, stream, \"parens\");\n }\n return state.context.type;\n };\n\n states.block = function(type, stream, state) {\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (propertyKeywords.hasOwnProperty(word)) {\n override = \"property\";\n return \"maybeprop\";\n } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n override = \"string-2\";\n return \"maybeprop\";\n } else if (allowNested) {\n override = stream.match(/^\\s*:/, false) ? \"property\" : \"tag\";\n return \"block\";\n } else {\n override += \" error\";\n return \"maybeprop\";\n }\n } else if (type == \"meta\") {\n return \"block\";\n } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n override = \"error\";\n return \"block\";\n } else {\n return states.top(type, stream, state);\n }\n };\n\n states.maybeprop = function(type, stream, state) {\n if (type == \":\") return pushContext(state, stream, \"prop\");\n return pass(type, stream, state);\n };\n\n states.prop = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n if (type == \"hash\" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {\n override += \" error\";\n } else if (type == \"word\") {\n wordAsValue(stream);\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n }\n return \"prop\";\n };\n\n states.propBlock = function(type, _stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n return state.context.type;\n };\n\n states.parens = function(type, stream, state) {\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \")\") return popContext(state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n if (type == \"word\") wordAsValue(stream);\n return \"parens\";\n };\n\n states.pseudo = function(type, stream, state) {\n if (type == \"word\") {\n override = \"variable-3\";\n return state.context.type;\n }\n return pass(type, stream, state);\n };\n\n states.media = function(type, stream, state) {\n if (type == \"(\") return pushContext(state, stream, \"media_parens\");\n if (type == \"}\") return popAndPass(type, stream, state);\n if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (word == \"only\" || word == \"not\" || word == \"and\")\n override = \"keyword\";\n else if (mediaTypes.hasOwnProperty(word))\n override = \"attribute\";\n else if (mediaFeatures.hasOwnProperty(word))\n override = \"property\";\n else\n override = \"error\";\n }\n return state.context.type;\n };\n\n states.media_parens = function(type, stream, state) {\n if (type == \")\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n return states.media(type, stream, state);\n };\n\n states.font_face_before = function(type, stream, state) {\n if (type == \"{\")\n return pushContext(state, stream, \"font_face\");\n return pass(type, stream, state);\n };\n\n states.font_face = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") {\n if (!fontProperties.hasOwnProperty(stream.current().toLowerCase()))\n override = \"error\";\n else\n override = \"property\";\n return \"maybeprop\";\n }\n return \"font_face\";\n };\n\n states.keyframes = function(type, stream, state) {\n if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n if (type == \"{\") return pushContext(state, stream, \"top\");\n return pass(type, stream, state);\n };\n\n states.at = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"tag\";\n else if (type == \"hash\") override = \"builtin\";\n return \"at\";\n };\n\n states.interpolation = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n if (type != \"variable\") override = \"error\";\n return \"interpolation\";\n };\n\n return {\n startState: function(base) {\n return {tokenize: null,\n state: \"top\",\n context: new Context(\"top\", base || 0, null)};\n },\n\n token: function(stream, state) {\n if (!state.tokenize && stream.eatSpace()) return null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style && typeof style == \"object\") {\n type = style[1];\n style = style[0];\n }\n override = style;\n state.state = states[state.state](type, stream, state);\n return override;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context, ch = textAfter && textAfter.charAt(0);\n var indent = cx.indent;\n if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n if (cx.prev &&\n (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" || cx.type == \"interpolation\" || cx.type == \"font_face\") ||\n ch == \")\" && (cx.type == \"parens\" || cx.type == \"media_parens\") ||\n ch == \"{\" && (cx.type == \"at\" || cx.type == \"media\"))) {\n indent = cx.indent - indentUnit;\n cx = cx.prev;\n }\n return indent;\n },\n\n electricChars: \"}\",\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n fold: \"brace\"\n };\n});\n\n function keySet(array) {\n var keys = {};\n for (var i = 0; i < array.length; ++i) {\n keys[array[i]] = true;\n }\n return keys;\n }\n\n var mediaTypes_ = [\n \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n \"tty\", \"tv\", \"embossed\"\n ], mediaTypes = keySet(mediaTypes_);\n\n var mediaFeatures_ = [\n \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n \"min-resolution\", \"max-resolution\", \"scan\", \"grid\"\n ], mediaFeatures = keySet(mediaFeatures_);\n\n var propertyKeywords_ = [\n \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n \"alignment-baseline\", \"anchor-point\", \"animation\", \"animation-delay\",\n \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n \"animation-timing-function\", \"appearance\", \"azimuth\", \"backface-visibility\",\n \"background\", \"background-attachment\", \"background-clip\", \"background-color\",\n \"background-image\", \"background-origin\", \"background-position\",\n \"background-repeat\", \"background-size\", \"baseline-shift\", \"binding\",\n \"bleed\", \"bookmark-label\", \"bookmark-level\", \"bookmark-state\",\n \"bookmark-target\", \"border\", \"border-bottom\", \"border-bottom-color\",\n \"border-bottom-left-radius\", \"border-bottom-right-radius\",\n \"border-bottom-style\", \"border-bottom-width\", \"border-collapse\",\n \"border-color\", \"border-image\", \"border-image-outset\",\n \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n \"border-image-width\", \"border-left\", \"border-left-color\",\n \"border-left-style\", \"border-left-width\", \"border-radius\", \"border-right\",\n \"border-right-color\", \"border-right-style\", \"border-right-width\",\n \"border-spacing\", \"border-style\", \"border-top\", \"border-top-color\",\n \"border-top-left-radius\", \"border-top-right-radius\", \"border-top-style\",\n \"border-top-width\", \"border-width\", \"bottom\", \"box-decoration-break\",\n \"box-shadow\", \"box-sizing\", \"break-after\", \"break-before\", \"break-inside\",\n \"caption-side\", \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\",\n \"column-fill\", \"column-gap\", \"column-rule\", \"column-rule-color\",\n \"column-rule-style\", \"column-rule-width\", \"column-span\", \"column-width\",\n \"columns\", \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\",\n \"cue-after\", \"cue-before\", \"cursor\", \"direction\", \"display\",\n \"dominant-baseline\", \"drop-initial-after-adjust\",\n \"drop-initial-after-align\", \"drop-initial-before-adjust\",\n \"drop-initial-before-align\", \"drop-initial-size\", \"drop-initial-value\",\n \"elevation\", \"empty-cells\", \"fit\", \"fit-position\", \"flex\", \"flex-basis\",\n \"flex-direction\", \"flex-flow\", \"flex-grow\", \"flex-shrink\", \"flex-wrap\",\n \"float\", \"float-offset\", \"flow-from\", \"flow-into\", \"font\", \"font-feature-settings\",\n \"font-family\", \"font-kerning\", \"font-language-override\", \"font-size\", \"font-size-adjust\",\n \"font-stretch\", \"font-style\", \"font-synthesis\", \"font-variant\",\n \"font-variant-alternates\", \"font-variant-caps\", \"font-variant-east-asian\",\n \"font-variant-ligatures\", \"font-variant-numeric\", \"font-variant-position\",\n \"font-weight\", \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\",\n \"grid-auto-position\", \"grid-auto-rows\", \"grid-column\", \"grid-column-end\",\n \"grid-column-start\", \"grid-row\", \"grid-row-end\", \"grid-row-start\",\n \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\",\n \"icon\", \"image-orientation\", \"image-rendering\", \"image-resolution\",\n \"inline-box-align\", \"justify-content\", \"left\", \"letter-spacing\",\n \"line-break\", \"line-height\", \"line-stacking\", \"line-stacking-ruby\",\n \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\",\n \"marker-offset\", \"marks\", \"marquee-direction\", \"marquee-loop\",\n \"marquee-play-count\", \"marquee-speed\", \"marquee-style\", \"max-height\",\n \"max-width\", \"min-height\", \"min-width\", \"move-to\", \"nav-down\", \"nav-index\",\n \"nav-left\", \"nav-right\", \"nav-up\", \"object-fit\", \"object-position\",\n \"opacity\", \"order\", \"orphans\", \"outline\",\n \"outline-color\", \"outline-offset\", \"outline-style\", \"outline-width\",\n \"overflow\", \"overflow-style\", \"overflow-wrap\", \"overflow-x\", \"overflow-y\",\n \"padding\", \"padding-bottom\", \"padding-left\", \"padding-right\", \"padding-top\",\n \"page\", \"page-break-after\", \"page-break-before\", \"page-break-inside\",\n \"page-policy\", \"pause\", \"pause-after\", \"pause-before\", \"perspective\",\n \"perspective-origin\", \"pitch\", \"pitch-range\", \"play-during\", \"position\",\n \"presentation-level\", \"punctuation-trim\", \"quotes\", \"region-break-after\",\n \"region-break-before\", \"region-break-inside\", \"region-fragment\",\n \"rendering-intent\", \"resize\", \"rest\", \"rest-after\", \"rest-before\", \"richness\",\n \"right\", \"rotation\", \"rotation-point\", \"ruby-align\", \"ruby-overhang\",\n \"ruby-position\", \"ruby-span\", \"shape-image-threshold\", \"shape-inside\", \"shape-margin\",\n \"shape-outside\", \"size\", \"speak\", \"speak-as\", \"speak-header\",\n \"speak-numeral\", \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\",\n \"tab-size\", \"table-layout\", \"target\", \"target-name\", \"target-new\",\n \"target-position\", \"text-align\", \"text-align-last\", \"text-decoration\",\n \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n \"text-decoration-style\", \"text-emphasis\", \"text-emphasis-color\",\n \"text-emphasis-position\", \"text-emphasis-style\", \"text-height\",\n \"text-indent\", \"text-justify\", \"text-outline\", \"text-overflow\", \"text-shadow\",\n \"text-size-adjust\", \"text-space-collapse\", \"text-transform\", \"text-underline-position\",\n \"text-wrap\", \"top\", \"transform\", \"transform-origin\", \"transform-style\",\n \"transition\", \"transition-delay\", \"transition-duration\",\n \"transition-property\", \"transition-timing-function\", \"unicode-bidi\",\n \"vertical-align\", \"visibility\", \"voice-balance\", \"voice-duration\",\n \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\", \"voice-stress\",\n \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\", \"word-break\",\n \"word-spacing\", \"word-wrap\", \"z-index\",\n // SVG-specific\n \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n \"color-interpolation\", \"color-interpolation-filters\",\n \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"shape-rendering\", \"stroke\",\n \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\"\n ], propertyKeywords = keySet(propertyKeywords_);\n\n var nonStandardPropertyKeywords_ = [\n \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n \"scrollbar-3d-light-color\", \"scrollbar-track-color\", \"shape-inside\",\n \"searchfield-cancel-button\", \"searchfield-decoration\", \"searchfield-results-button\",\n \"searchfield-results-decoration\", \"zoom\"\n ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n var colorKeywords_ = [\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n \"whitesmoke\", \"yellow\", \"yellowgreen\"\n ], colorKeywords = keySet(colorKeywords_);\n\n var valueKeywords_ = [\n \"above\", \"absolute\", \"activeborder\", \"activecaption\", \"afar\",\n \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alternate\",\n \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n \"arabic-indic\", \"armenian\", \"asterisks\", \"auto\", \"avoid\", \"avoid-column\", \"avoid-page\",\n \"avoid-region\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"button\", \"button-bevel\",\n \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"cambodian\",\n \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-earthly-branch\",\n \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n \"col-resize\", \"collapse\", \"column\", \"compact\", \"condensed\", \"contain\", \"content\",\n \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"cover\", \"crop\",\n \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"dashed\", \"decimal\",\n \"decimal-leading-zero\", \"default\", \"default-button\", \"destination-atop\",\n \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\",\n \"disc\", \"discard\", \"document\", \"dot-dash\", \"dot-dot-dash\", \"dotted\",\n \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\",\n \"ethiopic-halehame-tig\", \"ew-resize\", \"expanded\", \"extra-condensed\",\n \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fixed\", \"flat\", \"footnotes\",\n \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"groove\",\n \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hebrew\",\n \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"icon\", \"ignore\",\n \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n \"inline-block\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n \"italic\", \"justify\", \"kannada\", \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\",\n \"line-through\", \"linear\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n \"lower-roman\", \"lowercase\", \"ltr\", \"malayalam\", \"match\",\n \"media-controls-background\", \"media-current-time-display\",\n \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n \"media-return-to-realtime-button\", \"media-rewind-button\",\n \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"myanmar\", \"n-resize\",\n \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n \"ns-resize\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"open-quote\",\n \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n \"painted\", \"page\", \"paused\", \"persian\", \"plus-darker\", \"plus-lighter\", \"pointer\",\n \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\", \"progress\", \"push-button\",\n \"radio\", \"read-only\", \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n \"relative\", \"repeat\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\", \"rgb\", \"rgba\",\n \"ridge\", \"right\", \"round\", \"row-resize\", \"rtl\", \"run-in\", \"running\",\n \"s-resize\", \"sans-serif\", \"scroll\", \"scrollbar\", \"se-resize\", \"searchfield\",\n \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\",\n \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n \"single\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"solid\", \"somali\",\n \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"square\",\n \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\",\n \"sub\", \"subpixel-antialiased\", \"super\", \"sw-resize\", \"table\",\n \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"up\",\n \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n \"vertical\", \"vertical-text\", \"visible\", \"visibleFill\", \"visiblePainted\",\n \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n \"window\", \"windowframe\", \"windowtext\", \"x-large\", \"x-small\", \"xor\",\n \"xx-large\", \"xx-small\"\n ], valueKeywords = keySet(valueKeywords_);\n\n var fontProperties_ = [\n \"font-family\", \"src\", \"unicode-range\", \"font-variant\", \"font-feature-settings\",\n \"font-stretch\", \"font-weight\", \"font-style\"\n ], fontProperties = keySet(fontProperties_);\n\n var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_)\n .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);\n CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n function tokenCComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (maybeEnd && ch == \"/\") {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return [\"comment\", \"comment\"];\n }\n\n function tokenSGMLComment(stream, state) {\n if (stream.skipTo(\"-->\")) {\n stream.match(\"-->\");\n state.tokenize = null;\n } else {\n stream.skipToEnd();\n }\n return [\"comment\", \"comment\"];\n }\n\n CodeMirror.defineMIME(\"text/css\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n tokenHooks: {\n \"<\": function(stream, state) {\n if (!stream.match(\"!--\")) return false;\n state.tokenize = tokenSGMLComment;\n return tokenSGMLComment(stream, state);\n },\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\"\n });\n\n CodeMirror.defineMIME(\"text/x-scss\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \":\": function(stream) {\n if (stream.match(/\\s*\\{/))\n return [null, \"{\"];\n return false;\n },\n \"$\": function(stream) {\n stream.match(/^[\\w-]+/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"#\": function(stream) {\n if (!stream.eat(\"{\")) return false;\n return [null, \"interpolation\"];\n }\n },\n name: \"css\",\n helperType: \"scss\"\n });\n\n CodeMirror.defineMIME(\"text/x-less\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \"@\": function(stream) {\n if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/, false)) return false;\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"&\": function() {\n return [\"atom\", \"atom\"];\n }\n },\n name: \"css\",\n helperType: \"less\"\n });\n\n});\n","created":"20141003162651180","modified":"20141003162818850","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js","text":"/*\\\ncreated: 20140927171850335\nmodified: 20141003155657361\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js\ntype: application/javascript\nmodule-type: command\n\nThe packplugin command packages source tiddlers (ordinary\ntiddlers) into a plugin tiddler:\n--packplugin \n\nPlease note that the plugin tiddler must be correctly set\nup in that it is of type \"application/json\" and also\nthe plugin-type is set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"packplugin\",\n\tsynchronous: true\n};\n\n\nvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\n\nvar Command = function(params, commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 1) {\n\t\treturn \"Missing plugin title\";\n\t}\n\tvar pluginTitle = this.params[0];\n\tvar filter = this.params[1];\n\n\t// Get the plug-in self-description tiddler. If it doesn't exist,\n\t// bail out as the plugin developer needs to provide a plugin tiddler\n\t// with the required self-description.\n\tthis.logger.log(\"making plugin:\", pluginTitle);\n\tthis.logger.log(\"using filter for packing:\", filter);\n\treturn thirdflow.packagePlugin($tw.wiki, pluginTitle, filter);\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927171850335","modified":"20141003155657361","type":"application/javascript","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js","text":"/*\\\ncreated: 20180217143029574\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js\ntags:\nmodified: 20180217143211351\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n name: \"releasedemowiki\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLER = \"$:/config/ThirdFlow/demowiki\";\nvar DEFAULT_DEMOWIKI_TEMPLATE = \"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources\";\n\n\n/* Creates a new command instance to release a demo wiki. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Releases this wiki as a plugin-demo wiki. */\nCommand.prototype.execute = function() {\n var self = this;\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var path = require(\"path\");\n var fs = require(\"fs\");\n\n var config = $tw.wiki.getTiddler(RELEASE_CONFIG_TIDDLER);\n if (!config) {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_DEMOWIKI_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing demowiki to:\", filename);\n var content = $tw.wiki.renderTiddler(\"text/plain\", template);\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n self.logger.alert(\"cannot create file directories\");\n return err;\n }\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n }\n }\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180217143029574","type":"application/javascript","tags":"","modified":"20180217143211351","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js","text":"/*\\\ncreated: 20180212171824929\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js\ntags:\nmodified: 20180212172043868\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Exports our --releaseplugins command, which packages all plugins marked for\n * release in this wiki, and then writes them to the local filesystem.\n */\nexports.info = {\n name: \"releaseplugins\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLERS_PREFIX = \"$:/config/ThirdFlow/plugins\";\nvar RELEASE_CONFIG_FILTER = \"[prefix[\" + RELEASE_CONFIG_TIDDLERS_PREFIX + \"/]]\";\nvar DEFAULT_TID_TEMPLATE = \"$:/core/templates/tid-tiddler\";\n\n\n/* Creates a new command instance. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Executes our command. */\nCommand.prototype.execute = function() {\n var self = this;\n /* check your command parameters, which you will find in this.params */\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n var path = require(\"path\");\n\n // Retrieve the release configuration tiddlers, then iterate over them\n // and package and render those plugins for which release is enabled.\n // Plugin-release config tiddler fields:\n // release: must be \"yes\" to trigger release, otherwise the release config\n // data gets ignored.\n // text: mandatory name of plugin file name.\n // template: optional title of a tempplate tiddler to be used for rendering\n // the plugin output file.\n var releaseConfigs = $tw.wiki.filterTiddlers(RELEASE_CONFIG_FILTER);\n self.logger.log(\"release config tiddlers found:\", releaseConfigs.length);\n $tw.utils.each(releaseConfigs, function(title) {\n var pluginTitle = title.substr(RELEASE_CONFIG_TIDDLERS_PREFIX.length + 1);\n var config = $tw.wiki.getTiddler(title);\n if (config) {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_TID_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping:\", pluginTitle);\n } else {\n // (1) pack the plugin tiddler\n self.logger.log(\"packaging:\", pluginTitle);\n var err = thirdflow.packagePlugin($tw.wiki, pluginTitle);\n if (!err) {\n // (2) write the plugin tiddler\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing to:\", filename);\n err = thirdflow.renderTiddlerWithTemplate(\n self.commander.wiki, pluginTitle, template, filename\n );\n if (err) {\n self.logger.alert(\"writing failed:\", err);\n return err;\n }\n } else {\n self.logger.alert(\"packaging failed:\", err);\n return err;\n }\n }\n }\n });\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180212171824929","type":"application/javascript","tags":"","modified":"20180212172043868","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js","text":"/*\\\ncreated: 20140927173011680\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js\ntype: application/javascript\nmodified: 20140927173032181\nmodule-type: command\n\nCommand to render a single tiddler using a template.\n--rendertemplatedtiddler \n\nCommand to render a single tiddler using a template to a specific file.\nIn comparism to --rendertiddler this command variant accepts a template\nbut only works on a single tiddler. This allows us to avoid having specific\ntemplate tiddlers including the filter set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"rendertemplatedtiddler\",\n\tsynchronous: true\n};\n\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 3) {\n\t\treturn \"Missing template or filename\";\n\t}\n\tvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\tvar path = require(\"path\");\n\tvar title = this.params[0];\n\tvar template = this.params[1];\n\tvar filename = path.resolve(this.commander.outputPath, this.params[2]);\n\t// Save the tiddler as a self contained templated file\n thirdflow.renderTiddlerWithTemplate(\n\t\tthis.commander.wiki,\n\t\ttitle,\n\t\ttemplate,\n\t\tfilename\n\t);\n this.logger.log(\"rendered tiddler\", title, \"to\", filename);\n\treturn null; // done fine\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927173011680","type":"application/javascript","modified":"20140927173032181","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix","created":"20180203172801606","modified":"20180203172814315","tags":"","type":"text/vnd.tiddlywiki","text":"filters/all"},"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix","created":"20180203170629108","modified":"20180203170648166","tags":"","type":"text/vnd.tiddlywiki","text":"commands"},"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix","created":"20180203172725023","modified":"20180203172738692","tags":"","type":"text/vnd.tiddlywiki","text":"filters"},"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix","created":"20180203172744547","modified":"20180203172757212","tags":"","type":"text/vnd.tiddlywiki","text":"filters/is"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix","created":"20180203173603786","modified":"20180203173625412","tags":"","type":"text/vnd.tiddlywiki","text":"libs"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix","created":"20180203172945642","modified":"20180203172956320","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix","created":"20180203172818867","modified":"20180203172921843","tags":"","type":"text/vnd.tiddlywiki","text":"parsers"},"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix","created":"20180203173103664","modified":"20180203173117022","tags":"","type":"text/vnd.tiddlywiki","text":"startups"},"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix","created":"20180203173153198","modified":"20180203173208873","tags":"","type":"text/vnd.tiddlywiki","text":"styles"},"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix","created":"20180203173215242","modified":"20180203173234383","tags":"","type":"text/vnd.tiddlywiki","text":"templates"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix","created":"20180207102757523","modified":"20180211155919528","tags":"","type":"text/vnd.tiddlywiki","text":"config"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix","created":"20180207102840528","modified":"20180207102855322","tags":"","type":"text/vnd.tiddlywiki","text":"globals"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix","created":"20180203172853288","modified":"20180203172905835","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix","created":"20180207102731921","modified":"20180207103054605","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix","created":"20180207102537150","modified":"20180207102719509","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix","created":"20180203173239752","modified":"20180203173248899","tags":"","type":"text/vnd.tiddlywiki","text":"ui"},"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix","created":"20180203173311648","modified":"20180203173326083","tags":"","type":"text/vnd.tiddlywiki","text":"widgets"},"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix","created":"20180203173001192","modified":"20180205162648345","tags":"","type":"text/vnd.tiddlywiki","text":"parsers/wikiparser/rules"},"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js","text":"/*\\\ncreated: 20140927173349128\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js\ntype: application/javascript\nmodified: 20140927173409192\nmodule-type: isfilteroperator\n\nFilter function for [is[shadowinsync]]\n a tiddler is shadowsynced when an ordinary tiddler also has\n a shadow tiddler *AND* the shadow tiddler is the same as the\n real tiddler. This is decided on the basis of type, and the\n creation and modification dates.\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.shadowinsync = function(source,prefix,options) {\n\tvar results = [];\n\tvar invert = prefix === \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar match = invert;\n\t\tvar pluginTitle = options.wiki.getShadowSource(title);\n\t\tif(pluginTitle) {\n\t\t\tvar pluginInfo = options.wiki.getPluginInfo(pluginTitle),\n\t\t\t\tshadow = pluginInfo.tiddlers[title];\n\t\t\tif ( (tiddler.fields.type == shadow.type)\n\t\t\t && (tiddler.getFieldString(\"created\") === shadow.created)\n\t\t\t\t && (tiddler.getFieldString(\"modified\") === shadow.modified) ) {\n\t\t\t\tmatch = !match;\n\t\t\t}\n\t\t}\n\t\tif ( match ) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","created":"20140927173349128","type":"application/javascript","modified":"20140927173409192","module-type":"isfilteroperator"},"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js","text":"/*\\\ncreated: 20141117182000659\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js\nmodified: 20180217161013611\nmodule-type: filteroperator\n\nFilter operator for splitting a title containing slashes as separators\ninto its components.\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.titlecomponents = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n var components = title.split(\"/\");\n var idx;\n var l = components.length;\n for ( idx = 0; idx < l; idx++ ) {\n results.push(components[idx]);\n }\n\t});\n\treturn results;\n};\n\n})();\n","created":"20141117182000659","type":"application/javascript","modified":"20180217161013611","module-type":"filteroperator"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js\ntype: application/javascript\npriority: 0\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/enableautomaticsubfolders\";\nvar automaticSubfoldersEnabled;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tautomaticSubfoldersEnabled = $tw.wiki.getTiddlerText(configTiddler, \"yes\") === \"yes\";\n\tthis.logger.log(\"folder policy config: default: hierarchical subfolders are \" + (automaticSubfoldersEnabled ? \"enabled\" : \"disabled\"));\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(!options.draft && automaticSubfoldersEnabled) {\n\t\toptions.subfolder = this.subfoldersFromTitle(title);\n\t\toptions.name = this.leafFromTitle(title);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"0"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js\ntype: application/javascript\npriority: 200\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/draftfoldername\";\nvar draftFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tdraftFolderName = $tw.wiki.getTiddlerText(configTiddler, \"drafts\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: draft: draft subfolder is: \" + draftFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(options.draft) {\n\t\toptions.subfolder = draftFolderName;\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"200"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js\ntype: application/javascript\npriority: 100\n\nThis folder usher handles system tiddlers and places them into their\nown separate system folder and then into hierarchical subfolders according\nto their title. The exact name of the system folder is configurable.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/systemfoldername\";\nvar systemFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tsystemFolderName = $tw.wiki.getTiddlerText(configTiddler, \"system\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: system: system subfolder is: \" + systemFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft && title.substr(0, 3) === \"$:/\") {\n\t\tvar posTitle = title.lastIndexOf(\"/\");\n\t\toptions.subfolder = systemFolderName + title.substr(2, posTitle - 2);\n\t\toptions.name = title.substr(posTitle + 1);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"100"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js\ntype: application/javascript\npriority: 50\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddlerBase = \"$:/config/FileStorage/tagfolders\";\nvar tagFolders;\nvar tagList;\n\n// The configuration tiddlers to monitor for changes\nexports.watch = \"[field:title[\" + configTiddlerBase + \"]] [prefix[\" + configTiddlerBase + \"/]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tvar self = this;\n \n var cfgTiddler = $tw.wiki.getTiddler(configTiddlerBase);\n tagList = $tw.utils.parseStringArray((cfgTiddler && cfgTiddler.fields.list) || \"\");\n var cfgTags = $tw.wiki.filterTiddlers(\"[prefix[\" + configTiddlerBase + \"/]]\");\n tagFolders = {};\n \n $tw.utils.each(tagList, function(tag) {\n tagFolders[tag] = {folderName: \"\", folderMode: \"flat\"};\n });\n $tw.utils.each(cfgTags, function(tagCfg) {\n var tiddler = $tw.wiki.getTiddler(tagCfg);\n var tag = tiddler.fields[\"tag-name\"];\n var folderName = tiddler.fields[\"folder-name\"] || \"\";\n var folderMode = tiddler.fields[\"folder-mode\"] || \"flat\";\n self.logger.log(\"folder policy config: tag: for:\", \"\\\"\" + tag + \"\\\"\", \"folder:\", \"\\\"\" + folderName + \"\\\"\", \"mode:\", folderMode);\n if(tag && tagFolders[tag]) {\n tagFolders[tag].folderName = folderName;\n tagFolders[tag].folderMode = folderMode;\n }\n });\n};\n\n// We are asked to apply our folder policy...\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft ) {\n\t\tvar tags = options.tiddler.fields.tags;\n\t\tif ($tw.utils.isArray(tags)) {\n\t\t\tthis.logger.log(\"Tags: \"+tags.toString());\n for (var t=0; t= 0) {\n var info = tagFolders[tagList[t]];\n var subfolder = info.folderName;\n if(info.folderMode !== \"flat\") {\n options.subfolder = subfolder + \"/\" + this.subfoldersFromTitle(title);\n options.name = this.leafFromTitle(title);\n } else {\n options.subfolder = subfolder;\n options.title = title;\n }\n return true;\n }\n }\n\t\t}\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"50"},"$:/plugins/TheDiveO/ThirdFlow/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/history","created":"20140902083720188","modified":"20180218200526556","type":"text/vnd.tiddlywiki","text":"* ''1.2.1''\n** fixes new plugin template so its text content is of (mime) type `application/json`.\n** fixes error reporting in `--releaseplugins` and `--releasedemowiki`.\n\n* ''1.2.0''\n** brings a new automated release mechanism for plugins and plugin-demo wikis that simplifies maintaining what is to be released. The new system especially makes releasing multiple different plugins from the same development wiki much easier -- because there is no more need to tweak the release `tiddlywiki.info` configuration (however, this old release mechanism is still available).\n*** new \"''Release''\" tab in control panel, which configures which plugin(s) to release under which name, as well as whether to additionally release a plugin-demo wiki.\n*** new commands `--releaseplugins` and `--releasedemowiki` which use the configuration set from the control panel to package your plugins, write them to files, as well as writing the plugin-demo wiki (when enabled in configuration).\n*** upgrades `release/tiddlywiki.info` to use the new automated release mechanism, so plugin developers don't need to edit this file anymore in the future. To upgrade an existing plugin development wiki, simply upgrade your local `release/tiddlywiki.info` with this new one: [[editions/release/tiddlywiki.info]].\n*** upgrades skeleton `release/tiddlywiki.info` to also use the new automated release mechanism.\n*** refactors internal Javascript code.\n** removes released(!) plugins from the \"Plugin Sources\" view, as well as from the \"Releases\" tab in the Control Panel. This keeps the display cleaner, avoiding confusion.\n\n* ''1.1.1''\n** fixes plugin tiddler templates incorrectly setting `moduleType` instead of `module-type`.\n\n* ''1.1.0''\n** fixes //Plugin Sources// sidebar tab previously not sorting plugins alphabetically.\n** now shows number of tiddlers inside a plugin next to the plugin publisher/name.\n** adds a new <$button class=<> >{{$:/core/images/down-arrow}}$button> popup menu to each plugin listed in the //Plugin Sources// sidebar tab. This menu offers to create new tiddlers inside a plugin, from an assortion of type-specific templates. Templates included cover new Javascript macro modules, filter modules, and many more.\n** shows \"add plugin boilerplate tiddlers\" for empty plugins; clicking it opens the standard `readme`, `license` and `history` tiddlers ready for editing. Additionally, these three tiddlers get added to the plugin tiddlers `list` field.\n** adds a new //~ThirdFlow// tab to the control panel. This tab allows developers to configure the places inside plugins where they want to add new tiddlers of a certain type (such as macro modules, filter modules, et cetera).\n** now shows more plugin meta data than before when //viewing// a plugin tiddler:\n*** `core-version` dependency field,\n*** `plugin-priority` field controlling the order of unpacking (where plugin tiddlers \"explode\" into their shadow tiddlers).\n** adds a new //edit// template to edit plugin meta data:\n*** the edit template shows the same plugin meta data as the plugin //view// template, but additionally allows //editing// most fields.\n*** two plugin meta data elements cannot be edited: the plugin publisher and plugin name elements, as these are derived from the plugin title.\n** removes (annoying) wikilink-ification when displaying or editing plugin meta data.\n\n* ''1.0.14''\n** adds npm package and (development) script support.\n** after cloning the ThirdFlow repository, first run `npm install tiddlywiki` inside the project directory.\n*** `npm run develop` starts the development TiddlyWiki server. Use Ctrl-C to stop the server.\n*** `npm run release` creates the release files.\n*** `nmp start` starts the development TiddlyWiki server. Use `npm stop` to stop it.\n\n* ''1.0.13''\n** fixes a bug in the hierarchical filesystem sync adapter related to evaluation of the `disable-hfs` configuration option.\n\n* ''1.0.12''\n** minor internal optimization: in filter expressions use `[all[current]]` instead of `[is[current]]`.\n\n* ''1.0.11''\n** fixes the import tiddler activating the plugin view template when it shouldn't.\n\n* ''1.0.10''\n** the <> plugin is not dead yet.\n** fixes `HierarchicalFileSystemAdaptor` to make it work with recent TW5 releases: adds missing `isReady()` method that was introduced some time ago to TW sync adaptors.\n** fixes `editions/develop/tiddlywiki.info` to load the -- now required -- `tiddlywiki/filesystem` plugin.\n** supports node-webkit; thanks to Eucaly for this fix.\n** fixes handling of filetypes not defined in `$tw.config.typeTemplates`; again, thanks to Eucaly for this fix.\n** updated documentation to properly reflect the correct configuration required with recent TiddlyWiki 5 releases.\n** minor textual tweaks.\n\n* ''1.0.9''\n** upgraded the tag-based folder storage user interface to use the new core tag-pill template ([[$:/core/ui/TagTemplate]]).\n\n* ''1.0.8'' -- fixes and usability improvements.\n** fixed broken handling of Javascript tiddlers when creating them: they are now correctly created as .js files. Also corrected file name handling to avoid duplicated file endings in case the title already contains the extension (as it is custom for Javascript tiddlers).\n** added \"new plugin source tiddler here\" to the \"plugin sources\" sidebar tab.\n** added new plugin view template part: it shows the meta information associated with the plugin and is shown before the core's stock plugin view template that (only) lists the contents of a plugin.\n\n* ''1.0.7'' -- minor fix release and core upgrade.\n** fixed the add tag button not working.\n** upgraded the release demo wiki core to 5.1.3.\n\n* ''1.0.6'' -- improved tag-based folders release.\n** the tags configured for organizing tiddler storage into folders now have a well-defined natural order. Tags earlier in the tag list take precedence over later ones. The new UI makes setting precedence easy, please see the next item.\n** revamped UI for configuring tag-based folders. The new UI allows tags to be sorted earlier in the list so that those earlier tags take precedence over latter tags.\n\n* ''1.0.5'' -- lots of new stuff release.\n** a new \"Plugin Sources\" UI in the sidebar under the \"More\" tab. Lists only plugins and their original source code tiddlers.\n** an enhanced file system sync adaptor that is now configurable through its own control panel UI extension, under the new tab [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]].\n*** configure the folder names for system tiddlers and drafts.\n*** organize your tiddlers neatly into their own subfolders based on tags. Unfortunately, tag priority cannot be controlled at this time.\n** more editing and highlight support.\n*** towards a (mostly) unified syntax highlighting in both static rendering as well as when editing tiddlers.\n*** added more codemirror features: current line highlighting, CSS syntax support.\n*** added support for TW5's native ~JavaScript storage format when creating ~JavaScript tiddlers directly inside ~TiddlyWiki 5. Tiddler meta-data gets correctly inserted into a (special) comment section.\n* ''1.0.4'' -- fix and more documentation.\n** fixed a typo in the (empty) source plugin tiddler itself which caused hiccups in ~TiddlyWiki's control panel plugin tab.\n** added more background information about plugins, modules, and the crazy stuff the <> plugin is made of.\n\n* ''1.0.3'' -- upgraded to work with the final ~TiddlyWiki 5.1.x releases.\n** fixed using deprecated regular expression when packing plugin tiddlers.\n\n* ''1.0.2'' -- fix and polishing release.\n** fixes a problem in the hierarchical filesystem sync adaptor that previously caused server aborts when adding JPEG tiddlers. The sync adaptor now defaults to the \"~~binary~~base64\" encoding whenever a meta file is required.\n** added two illustrations to the demo documentation showing the develop and release phases.\n** further minor documentation fixes and improvements.\n\n* ''1.0.1'' -- fix and polishing release.\n** fixes an issue where the user plugin demonstration wikis contained still the plugin source in addition to the plugin itself.\n** included polishing documentation from pmario (thanks!).\n\n* ''1.0.0'' -- this marks the first public release of the <> plugin. Of course, the <> eats its own dog food: this plugin has been developed with itself. Sweet, isn't it?\n** the ``--makeplugin`` command for creating plugins in headless TW5 instances running under Node.js.\n** the ``hierarchicalfilesystemadaptor`` sync adapter that stores tiddlers according to their hierarchical names into folders and subfolders.\n"},"$:/plugins/TheDiveO/ThirdFlow/icon":{"title":"$:/plugins/TheDiveO/ThirdFlow/icon","created":"20140902083115519","modified":"20140902083155746","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled","created":"20141018212934861","modified":"20141018213600106","type":"text/vnd.tiddlywiki","text":"\n"},"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled","created":"20141018213823637","modified":"20141018213933115","type":"text/vnd.tiddlywiki","text":"\n"},"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js","text":"/*\\\ncreated: 20180212163414709\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\nmodified: 20180212163710081\ntags:\nmodule-type: library\n\nA library of (reusable) ThirdFlow plugin tiddler functions. These\nfunctions can be used, for instance, through TW server commands.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Good Stuff(tm) we need */\nif ($tw.node) {\n var fs = require(\"fs\");\n var path = require(\"path\");\n}\n\n\n/* Packages a plugin tiddler from its constituent individual tiddlers that exist\n * inside the title sub-namespace of the plugin tiddler.\n *\n * Parameters:\n * wiki: TW instance.\n * pluginTitle: the plugin tiddler to be packed; this must be a valid\n * plugin tiddler which has its plugin-type correctly set, as well\n * as a type of \"application/json\".\n * filterExpression: optional TW filter expression to be used to decide\n * which tiddlers need to be packed into the plugin. If left unspecified,\n * it defaults to all sub-tiddlers of the plugin title.\n *\n * Result:\n * returns undefined when the plugin tiddler specified in pluginTitle has\n * been packed without issues. Otherwise, an error string is returned,\n * detailing what went wrong.\n */\nexports.packagePlugin = function(wiki, pluginTitle, filterExpression) {\n // Prepare input parameters...\n if (pluginTitle.substr(-1) === \"/\") {\n pluginTitle = pluginTitle.substr(0, pluginTitle.length - 1);\n }\n filterExpression = filterExpression\n || \"[all[tiddlers]prefix[\" + pluginTitle + \"/]]\";\n // Plugin tiddler sanity checks...\n var pluginTiddler = wiki.getTiddler(pluginTitle);\n\tif (!pluginTiddler) {\n\t\treturn \"missing plugin tiddler: \" + pluginTitle;\n\t}\n\tif (pluginTiddler.fields.type !== \"application/json\"\n || !pluginTiddler.hasField(\"plugin-type\")) {\n\t\treturn \"not a plugin (skeleton) tiddler: \" + pluginTitle;\n\t}\n\t// Update the plugin content to contain all the tiddlers that match\n\t// the filter expression.\n\tvar filteredTiddlers = wiki.filterTiddlers(filterExpression);\n\tvar pluginTiddlers = {};\n\t$tw.utils.each(filteredTiddlers, function(title) {\n\t\tvar tiddler = wiki.getTiddler(title);\n\t\tvar fields = {};\n\t\t$tw.utils.each(tiddler.fields, function(value, fieldname) {\n\t\t\tfields[fieldname] = tiddler.getFieldString(fieldname);\n\t\t});\n\t\tpluginTiddlers[title] = fields;\n\t});\n\tvar plugin = new $tw.Tiddler(\n pluginTiddler,\n {\n \"text\": JSON.stringify({ \"tiddlers\": pluginTiddlers })\n });\n\twiki.addTiddler(plugin);\n\t// We need to update the plugin info that TW had built up during boot...\n\twiki.readPluginInfo();\n\t// ...and we need to re-unpack the plugins into their shadow tiddlers in\n\t// order to make [is[shadow]] work correctly. Yes, that causes the plugin\n // tiddlers to exist two times: the original source tiddler, as well as\n // a corresponding shadow tiddler. However, this is just during release,\n // but never in a development wiki nor in a user wiki deploying this plugin.\n\twiki.unpackPluginTiddlers();\n return;\n};\n\n\n/* Renders a single tiddler using a template to a file. Please note that\n * this function automatically creates the required subdirectories needed\n * to contain the output file.\n *\n * Parameters:\n * wiki: TW instance.\n * title: the tiddler to be rendered.\n * template: the title of the template to be used for rendering.\n * filename: the output filename to which the tiddler gets rendered.\n *\n * Result:\n * returns undefined when the rendering and writing process finished\n * successfully. Otherwise, an error string is returned, detailing what\n * went wrong.\n */\nexports.renderTiddlerWithTemplate = function(wiki, title, template, filename) {\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n return err;\n }\n var content = wiki.renderTiddler(\n \"text/plain\", template, { variables: { currentTiddler: title } });\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n return;\n};\n\n\n})();\n","created":"20180212163414709","type":"application/javascript","modified":"20180212163710081","tags":"","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/license","created":"20140902084022063","modified":"20140902090843205","type":"text/vnd.tiddlywiki","text":"The //Third Flow// plugin is covered by the following licenses:\n\n* The ''Third Flow plugin'' is licensed under the [[MIT license|http://opensource.org/licenses/MIT]].\n* The ''hierarchical file system adapter'' is licensed under the [[TiddlyWiki 5 license|https://raw.githubusercontent.com/Jermolene/TiddlyWiki5/master/licenses/copyright.md]] (links to ~GitHub TW5 repository). It bases on ``plugins/tiddlywiki/filesystem/filesystemadaptor.js`` and brings in storing tiddlers into hierarchical folder structures according to their titles.\n* Other content of this ~TiddlyWiki which is not part of the plugin or ~TiddlyWiki 5 is covered by the [[CC BY 3.0|http://creativecommons.org/licenses/by/3.0/]] license."},"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations","created":"20180203171654847","modified":"20180205195031010","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define tf-config-base() $:/config/ThirdFlow/\n\n\\define tf-config-base-default() $:/plugins/TheDiveO/ThirdFlow/defaults/\n"},"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js","text":"/*\\\ncreated: 20141020111828333\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/hashify.js\ntype: application/javascript\nmodified: 20141020111837899\nmodule-type: macro\n\nMacro to hash a tiddler title into a (mostly) unique number.\nThis avoids problems when using titles (from tags, et cetera)\nas path elements of a system tiddler title.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"hashify\";\n\nexports.params = [\n\t{name: \"title\"},\n {name: \"prefix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title,prefix) {\n\treturn (prefix || \"\") + $tw.utils.hashString(title);\n};\n\n})();\n","created":"20141020111828333","type":"application/javascript","modified":"20141020111837899","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js","text":"/*\\\ncreated: 20141020111845057\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js\ntype: application/javascript\nmodified: 20141020111852925\nmodule-type: macro\n\nMacro to sanitize a tiddler title for use as, e.g. a folder name.\nAlso converts the title to lowercase.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"sanitizedfoldername\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title.replace(/\\<|\\>|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\").toLowerCase();\n};\n\n})();\n","created":"20141020111845057","type":"application/javascript","modified":"20141020111852925","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js","text":"/*\\\ncreated: 20180203193341374\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js\nmodified: 20180205195741652\nmodule-type: macro\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"typedplugintiddlertitle\";\n\nexports.params = [\n { name: \"pluginroot\" }, /* such as: \"$:/plugins/publisher/plugin\" */\n { name: \"configtiddler\" }, /* title of config infix tiddler (may be missing) */\n { name: \"defaulttiddler\" }, /* title of default infix tiddler (may be missing too, but should not ;) */\n { name: \"title\" } /* title (suffix) */\n];\n\nexports.run = function(pluginroot, configtiddler, defaulttiddler, title) {\n /* Start with the plugin root part, and add a trailing slash, if not already given */\n var t = pluginroot;\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* Either add a configured infix, or a default infix; handle \"\" config correctly. */\n var cfgtiddler = this.wiki.getTiddler(configtiddler);\n if (cfgtiddler) {\n t += cfgtiddler.fields.text; /* \"\" will be just fine! */\n } else {\n var deftiddler = this.wiki.getTiddler(defaulttiddler);\n if (deftiddler) {\n t += deftiddler.fields.text;\n }\n }\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* End with the (suffix) title element. */\n t += title;\n \n /* Grmpf: ensure that the full title returned is unique. */\n return this.wiki.generateNewTitle(t);\n};\n\n})();","created":"20180203193341374","type":"application/javascript","modified":"20180205195741652","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/readme","created":"20140902083641711","modified":"20141020083728826","type":"text/vnd.tiddlywiki","text":"Use the //Third Flow// plugin in your Node.js-based ~TiddlyWikis to develop your customization plugins inside ~TiddlyWiki but with support for well-structured source code repository layouts.\n\nThe //Third Flow// plugin supports your plugin development in that it organizes all your tiddler source files into a clear hierarchical folder structure based on tiddler titles. An additional plugin creation command module makes it easy to create the package plugin itself as well as a demonstration ~TiddlyWiki without the hassle of having to maintain separate and even multiple ``tiddlers/`` and ``plugin/`` folders. Also, the //Third Flow// relieves you from shuffling tiddler source code files around in your source code repository.\n\nThere's only a ''single'' tiddler source code tree and it is synchronized to your tiddler's title-based structure. Thus, no more need for external editing sessions and source file shuffling.\n\nSimply install this plugin into your ~TiddlyWiki in which you are developing your customizations. For more information, please go to the [[Third Flow project website|http://thediveo.github.io/ThirdFlow]].\n\nYou can use the new [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]] control panel tab to configure how your tiddlers get organized into folders and subfolders in your source code repository.\n\nEnjoy the //Third Flow//!"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel","created":"20180203155550006","modified":"20180203163400275","tags":"$:/tags/Stylesheet","type":"text/css","text":".tfc-infix-setting {\n width: 100%;\n display: flex;\n align-items: center;\n}\n\n.tfc-infix-setting-prefix {\n opacity: 0.5;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView","created":"20180202130047517","modified":"20180217165529786","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"td.tfc-plugin-edit-element-value {\n text-align: left;\n vertical-align: baseline;\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input {\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input[type=checkbox] {\n width: auto;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView","created":"20141025152245526","modified":"20180205183442633","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"tr.tfc-plugin-info-element td {\n padding-top: 0.4ex;\n padding-bottom: 0.4ex;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\ntd.tfc-plugin-info-element-name {\n text-align: right;\n vertical-align: baseline;\n background-color: <>;\n font-weight: bold;\n}\n\ntd.tfc-plugin-info-element-value {\n text-align: left;\n vertical-align: top;\n}\n\nspan.tfc-plugin-info-unspecified {\n font-style: italic;\n color: <>;\n}\n\nspan.tfc-plugin-info-unspecified:before {\n font-style: normal;\n content: \"(\";\n}\n\nspan.tfc-plugin-info-unspecified:after {\n font-style: normal;\n content: \")\";\n padding-left: 0.15em;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5","created":"20141003153100991","modified":"20141003164807749","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* This CodeMirror stylesheet implements a TW5-compatible syntax coloring theme */\n\n.cm-s-tw5 span.cm-meta {color: #FF1717;}\n.cm-s-tw5 span.cm-keyword { line-height: 1em; font-weight: bold; color: #333; }\n.cm-s-tw5 span.cm-atom {color: #219;}\n.cm-s-tw5 span.cm-number {color: #008080;}\n.cm-s-tw5 span.cm-def {color: #00f;}\n.cm-s-tw5 span.cm-variable {color: black;}\n.cm-s-tw5 span.cm-variable-2 {color: #0000C0;}\n.cm-s-tw5 span.cm-variable-3 {color: #0000C0;}\n.cm-s-tw5 span.cm-property {color: #065252;}\n.cm-s-tw5 span.cm-operator {color: black;}\n.cm-s-tw5 span.cm-comment {color: #998;}\n.cm-s-tw5 span.cm-string {color: #2A00FF;}\n.cm-s-tw5 span.cm-string-2 {color: #f50;}\n.cm-s-tw5 span.cm-qualifier {color: #555;}\n.cm-s-tw5 span.cm-builtin {color: #30a;}\n.cm-s-tw5 span.cm-bracket {color: #cc7;}\n.cm-s-tw5 span.cm-tag {color: #000080; font-weight: bold;}\n.cm-s-tw5 span.cm-attribute {color: #00c;}\n.cm-s-tw5 span.cm-link {color: #219;}\n.cm-s-tw5 span.cm-error {color: #f00;}\n\n.cm-s-tw5 span.cm-underlined { text-decoration: underline; }\n.cm-s-tw5 span.cm-strikethrough { text-decoration: line-through; }\n.cm-s-tw5 span.cm-brace { color: #170; font-weight: bold; }\n.cm-s-tw5 span.cm-table { color: blue; font-weight: bold; }\n\n.cm-s-tw5 .CodeMirror-activeline-background {background: #F0F3F7 !important;}\n.cm-s-tw5 .CodeMirror-matchingbracket {outline:1px solid #c00; color:black !important;}\n"},"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5","created":"20141003155429576","modified":"20141003164730907","tags":"$:/tags/Stylesheet","type":"text/css","text":"/*\n\ngithub.com style (c) Vasily Polovnyov \n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #333;\n background: #f8f8f8;\n -webkit-text-size-adjust: none;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n color: #998;\n font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n color: #333;\n font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n color: #008080;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.hljs-dartdoc,\n.tex .hljs-formula {\n color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.scss .hljs-preprocessor {\n color: #900;\n font-weight: bold;\n}\n\n.javascript .hljs-title,\n.hljs-list .hljs-keyword,\n.hljs-subst {\n font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n color: #458;\n font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n color: #000080;\n font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n color: #065252;\n}\n\n.hljs-regexp {\n color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.clojure .hljs-keyword,\n.scheme .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n color: #990073;\n}\n\n.hljs-built_in {\n color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n color: #999;\n font-weight: bold;\n}\n\n.hljs-deletion {\n background: #fdd;\n}\n\n.hljs-addition {\n background: #dfd;\n}\n\n.diff .hljs-change {\n background: #0086b3;\n}\n\n.hljs-chunk {\n color: #aaa;\n}\n"},"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js","text":"/*\\\ncreated: 20141015190317579\ntitle: $:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js\ntype: application/javascript\nmodified: 20141015190324904\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with the local filesystem via node.js APIs\n...in contrast to filesystemadaptor.js this variant understands forward slashes \"/\"\nin tiddler titles and stores tiddlers appropriately in the file system by mapping\nthe hierarchy in the title to a (sub) directory structure.\n\nIn addition, this sync adaptor understands the concept of system tiddlers (starting\ntheir titles with \"$:/\") and stores them inside a \"special\" system branch.\n\nMoreover, this sync adaptor also understands the concept of draft tiddlers (based\non the presence of the \"draft.of\" field) and stores all draft tiddlers in a flat\nsingle \"drafts\" folder. The makes cleanup and (git) repository syncing easier to do.\n\nIn order to realize good modularity and to allow this sync adaptor to be enhanced\nat any time later in an easy manner, it supports so-called folder policy modules.\nThese are module tiddlers with a module-type of \"folderpolicy\". Folder policy modules\nneed to export a method named \"folderpolicy\". In addition, folder policy modules\ncan be assigned a priority value. Normally, the priority of a folder policy should\nbe between 199 and 1, inclusively. Priority 200 is currently used for the draft\ntiddler policy. Priority 0 is assigned to the default policy.\n\nThe code for this sync adaptor comes from filesystemadaptor.js and has been enhanced\nto support hierarchical tiddler storage as well as folder policies.\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 and path tools;\n// support node.js and nodejs-webkit\nvar fs = $tw.node ? require(\"fs\") : null,\n\tpath = $tw.node ? require(\"path\") : null;\n\nfunction HierarchicalFileSystemAdaptor(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.logger = new $tw.utils.Logger(\"HierarchicalFileSystem\");\n\t// Create the /tiddlers folder if it doesn't exist\n\t$tw.utils.createDirectory($tw.boot.wikiTiddlersPath);\n\t\n\tthis.config = {\n\t\tdisabled: false\n\t};\n\t\n\t// retrieve all folder policy modules and sort them according\n\t// to their priority, with higher priority values sorted towards\n\t// the beginning of our folder policy modules list. Policy modules\n\t// more to the beginning are getting an earlier chance of applying\n\t// their policy.\n\tvar fpModules = [];\n\tvar fpcWatching = [];\n\t$tw.modules.forEachModuleOfType(\"folderpolicy\", function(title, exports) {\n\t\t// prepare folder policy information for later sorting and calling\n\t\tfpModules.push({\n\t\t\ttitle: title, // just for logging\n\t\t\tpriority: options.wiki.getTiddler(title).fields.priority || 100,\n\t\t\tpolicy: exports.folderpolicy || function() { return false; }\n\t\t});\n\t\t// get the information to monitor for configuration changes\n\t\tif ( exports.watch && exports.reconfig ) {\n\t\t\tfpcWatching.push({\n\t\t\t\tfilter: self.wiki.compileFilter(exports.watch),\n\t\t\t\treconfig: exports.reconfig\n\t\t\t});\n\t\t}\n\t\t// initial configuration call\n\t\tif ( exports.reconfig ) {\n\t\t\texports.reconfig.call(self);\n\t\t}\n\t});\n\tthis.fpcWatching = fpcWatching;\n\tfpModules.sort(function(policyA, policyB) {\n\t\treturn policyB.priority - policyA.priority;\n\t});\n\tthis.logger.log(fpModules.length + \" folder policies active\");\n\tthis.policyModules = fpModules;\n\t\n\tif($tw.boot.wikiInfo.config && $tw.boot.wikiInfo.config[\"disable-hfs\"]) {\n\t\tthis.config.disabled = true;\n\t\tthis.logger.log(\"plugin disabled; no saving and deleting\");\n\t}\n}\n \nHierarchicalFileSystemAdaptor.prototype.isReady = \"hfs\";\n\n// Are we ready? Are we ready?? We're always ready!\nHierarchicalFileSystemAdaptor.prototype.isReady = function() {\n\treturn true;\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerInfo = function(tiddler) {\n\treturn {};\n};\n\n//\n// file type-specific templates\n//\n$tw.config.typeTemplates = {\n\t\"application/x-tiddler\": \"$:/core/templates/tid-tiddler\",\n\t\"application/javascript\": \"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler\"\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) {\n\t// See if we've already got information about this file\n\tvar self = this,\n\t\ttitle = tiddler.fields.title,\n\t\tfileInfo = $tw.boot.files[title],\n\t\tdraftOf = tiddler.fields[\"draft.of\"];\n\t// Get information about how to save tiddlers of this type\n\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\ttypeInfo = $tw.config.contentTypeInfo[type];\n\tif(!typeInfo) {\n typeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n\t}\n if (!($tw.config.typeTemplates[typeInfo.fileType || tiddler.fields.type])) {\n \ttypeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n \t\ttypeInfo.fileType = \"application/x-tiddler\";\n\t}\n\tvar extension = typeInfo.extension || \"\";\n\tif(!fileInfo) {\n\t\t// If not, we'll need to generate it\n // Handle case where the title already ends in the file extension:\n // in this case we remove the extension from the suggested title.\n var suggestedName = title;\n if(suggestedName.substr(-extension.length) === extension) {\n suggestedName = suggestedName.substr(0,suggestedName.length - extension.length);\n }\n\t\tvar paf = self.generateTiddlerPathAndFilename(tiddler, suggestedName, draftOf);\n\t\tvar folder = $tw.boot.wikiTiddlersPath+path.sep+paf.subfolder;\n\t\t$tw.utils.createDirectory(folder);\n\t\t// Start by getting a list of the existing files in the directory\n\t\tfs.readdir(folder,function(err,files) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Assemble the new fileInfo\n\t\t\tfileInfo = {};\n\t\t\t\n\t\t\tfileInfo.filepath = folder + path.sep + self.generateUniqueTiddlerFilename(paf.name,draftOf,extension,files);\n\t\t\tfileInfo.type = typeInfo.fileType || tiddler.fields.type;\n\t\t\tfileInfo.hasMetaFile = typeInfo.hasMetaFile;\n\t\t\t// Save the newly created fileInfo\n\t\t\t$tw.boot.files[title] = fileInfo;\n\t\t\t// Pass it to the callback\n\t\t\tcallback(null,fileInfo);\n\t\t});\n\t} else {\n\t\t// Otherwise just invoke the callback\n\t\tcallback(null,fileInfo);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.subfoldersFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<=0) {\n\t\treturn \"\";\n\t} else {\n\t\treturn title.substr(0,lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.leafFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<0) {\n\t\treturn title;\n\t} else {\n\t\treturn title.substr(lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.generateTiddlerPathAndFilename = function(tiddler, suggestedTitle, draftOf) {\n\t// set up the policy method options such that if in a rare circumstance no policy\n\t// should fire, then we fall back to plain old flat storage in the main wiki folder.\n\tvar options = {\n\t\ttiddler: tiddler, // in: tiddler object we're trying a policy to find for\n\t\tdraft: !!draftOf, // in: is this a draft tiddler?\n\t\tsubfolder: \"\", // in/out: folder into which to place the tiddler file\n\t\tname: suggestedTitle // in/out: name of tiddler file\n\t};\n\t\n\t// run through our ordered list of folder policies and wait for one of them\n\t// to return true because its folder policy should be applied.\n\tfor (var i=0; i|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\");\n\t// For the subfolder path we are converting hierarchy slashes into the proper\n\t// platform-specific separators.\n\toptions.subfolder = options.subfolder.replace(/\\<|\\>|\\:|\\\"|\\\\|\\||\\?|\\*|\\^/g,\"_\").replace(/\\//g, path.sep);\n\n\treturn options;\n};\n\n/*\nGiven a tiddler title and an array of existing filenames, generate a new legal filename for the title, case insensitively avoiding the array of existing filenames\n*/\nHierarchicalFileSystemAdaptor.prototype.generateUniqueTiddlerFilename = function(baseFilename,draftOf,extension,existingFilenames) {\n\t// Truncate the filename if it is too long\n\tif(baseFilename.length > 200) {\n\t\tbaseFilename = baseFilename.substr(0,200);\n\t}\n\t// Start with the base filename plus the extension\n\tvar filename = baseFilename + extension,\n\t\tcount = 1;\n\t// Add a discriminator if we're clashing with an existing filename\n\twhile(existingFilenames.indexOf(filename) !== -1) {\n\t\tfilename = baseFilename + \" \" + (count++) + extension;\n\t}\n\treturn filename;\n};\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nHierarchicalFileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tvar self = this;\n\n\t// Monitor for configuration changes and then trigger the folder\n\t// policy modules affected from configuration changes.\n\t$tw.utils.each(this.fpcWatching, function(watch, title, obj) {\n\t\tvar changes = watch.filter.call(self.wiki, function(filterCallback) {\n\t\t\tfilterCallback(tiddler, tiddler.fields.title);\n\t\t});\n\t\tif ( changes.length > 0 ) {\n\t\t\twatch.reconfig.call(self, tiddler.fields.title);\n\t\t}\n\t});\n\t\n\t// Proceed with saving the tiddler\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"saving disabled\");\n\t\treturn callback(null, {}, 0);\n\t}\n\t\n\tthis.getTiddlerFileInfo(tiddler,function(err,fileInfo) {\n\t\tvar template, content, encoding;\n\t\tfunction _finish() {\n\t\t\tcallback(null, {}, 0);\n\t\t}\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(fileInfo.hasMetaFile) {\n\t\t\t// Save the tiddler as a separate body and meta file\n\t\t\tvar typeInfo = $tw.config.contentTypeInfo[fileInfo.type],\n\t\t\t\tencoding = typeInfo.encoding || \"base64\"; // makes sense for TW\n\t\t\tself.logger.log(\"saving type\", fileInfo.type, \"with meta file and encoding\", encoding);\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,{encoding: encoding},function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",\"$:/core/templates/tiddler-metadata\",{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",content,{encoding: \"utf8\"},function (err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t\t_finish();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\t// Save the tiddler as a self contained templated file\n\t\t\ttemplate = $tw.config.typeTemplates[fileInfo.type];\n\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",template,{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\tfs.writeFile(fileInfo.filepath,content,{encoding: \"utf8\"},function (err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t_finish();\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*/\nHierarchicalFileSystemAdaptor.prototype.loadTiddler = function(title,callback) {\n\tcallback(null,null);\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\n*/\nHierarchicalFileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"deleting disabled\");\n\t\treturn callback(null);\n\t}\n\n\tvar self = this,\n\t\tfileInfo = $tw.boot.files[title];\n\t// Only delete the tiddler if we have writable information for the file\n\tif(fileInfo) {\n\t\t// Delete the file\n\t\tfs.unlink(fileInfo.filepath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.logger.log(\"Deleted file\",fileInfo.filepath);\n\t\t\t// Delete the metafile if present\n\t\t\tif(fileInfo.hasMetaFile) {\n\t\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\t\tcallback(null);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\tcallback(null);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null);\n\t}\n};\n\nif(fs) {\n\texports.adaptorClass = HierarchicalFileSystemAdaptor;\n}\n\n})();\n","created":"20141015190317579","type":"application/javascript","modified":"20141015190324904","module-type":"syncadaptor"},"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction":{"title":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","created":"20180204194231803","list":"","modified":"20180204194242455","tags":"","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler","created":"20140927173431490","modified":"20140927173434365","type":"text/vnd.tiddlywiki","text":"<$metafy/>"},"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources","created":"20140902113827798","modified":"20140927173615299","type":"text/vnd.tiddlywiki","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/temp/]] -[is[shadowinsync]] -[[$:/plugins/TheDiveO/ThirdFlow/readme]is[shadow]!is[tiddler]removesuffix[/readme]] -[prefix[$:/plugins/TheDiveO/BrokenPlugin]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic","caption":"Basic","created":"20141013144648552","modified":"20141013190842095","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"|Folder for system tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/systemfoldername\" default=\"system\" tag=\"input\"/>|\n|Folder for draft tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/draftfoldername\" default=\"drafts\" tag=\"input\"/>|\n\n!! How to store ordinary tiddlers into (sub) folders\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"yes\"> Organize ordinary tiddlers into hierarchical subfolders.$radio>\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"no\"> Store ordinary tiddlers ''flat'' in the top-level wiki folder.$radio>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags","caption":"Tag-based Folders","created":"20141013152809952","modified":"20141203202326182","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"\\define config-tiddler() $:/config/FileStorage/tagfolders\n\n\\define config-tiddler-list() [list[$(config-tiddler)$]]\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n\n\\define config-defaults() {\"tag-name\": \"$(currentListElement)$\", \"folder-name\": \"$(folder)$\", \"folder-mode\": \"flat\"}\n\n\\define tag-folder-editor()\n <$set name=\"tagConfigTiddler\" value=<>>\n <$set name=\"folder\" value=<>>\n <$list filter=\"[is[missing]]\">\n <$ensuretiddler title=<> default=<>/>\n <$link title=<> format=\"text\"><$text text=<>/>$link>\n $list>\n
\n\n$listmangler>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage","caption":"File Storage","created":"20141013143730660","modified":"20170222203526611","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"Control how a Node.js-server TiddlyWiki organizes your tiddlers into hierarchical folders and subfolders inside your file system. Any configuration changes you make here will immediately become live, even on your TiddlyWiki server.\n
\n\\end\n\nSettings to customize //your// ''plugin development'' in TiddlyWiki.\n\nConfigure the places where you want to add new tiddlers of a certain type when developing your plugins. These settings only apply when adding new tiddlers to a plugin, never afterwards.\n\n* Simply leave a place empty when you don't want tiddlers of a specific type to be organized into their own sub title-namespace, but instead \"//flat//\" directly within the plugin.\n* Press {{$:/core/images/refresh-button}} in order to reset a place for a specific type of plugin tiddler to its default setting.\n* Press {{$:/core/images/file}} to see -- and optionally edit -- the template for a specific plugin tiddler type.\n\n
\n\\end\n\n\\define release-plugin-item(itemdesc, itemconfig, defaultfilename, templateplaceholder)\n<<$macrocall $name=\"plain\" text=\"$itemdesc$\" $output=\"text/plain\"/>$link>' \"$itemconfig$\" \"$defaultfilename$\" \"$templateplaceholder$\">>\n\\end\n\nSettings to customize your ''plugin(s) release'', including an optional plugin-demo wiki.\n\n> ''Note:'' To ''create'' the release files, run `npm run release` on your development ~TiddlyWiki in a terminal session.\n\n!! Plugins\n\n<$list filter=\"[prefix[$:/plugins/]has[plugin-type]removeprefix[$:/plugins/]!prefix[tiddlywiki/]!regexp:title[^.+/.+/]sort[]] -[all[shadows]prefix[$:/plugins/]shadowsource[]removeprefix[$:/plugins/]]\" variable=\"plugin-name\">\n <$set name=\"plugin-config\" filter=\"[addprefix[$:/config/ThirdFlow/plugins/$:/plugins/]]\">\n <$set name=\"plugin-filename\" filter=\"[titlecomponents[]last[]addsuffix[.tid]]\">\n <$macrocall $name=\"release-plugin-item\" itemdesc=<> itemconfig=<> defaultfilename=<> templateplaceholder=\"$:/core/templates/tid-tiddler\" />\n $set>\n $set>\n$list>\n\n\n!! Plugin-Demo Wiki\n\n<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow","caption":"ThirdFlow","created":"20180203154413491","list":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations","modified":"20180217150140183","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData","created":"20180202124221987","list-before":"$:/core/ui/EditTemplate/body","modified":"20180205194150923","tags":"$:/tags/EditTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-info-row(name, value, output:\"html\")\n\\rules except wikilink\n
\n$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js\ntags: \nmodified: 20180207103459780\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [all[XXX]] filter operator function. Such\n * all-filter operators return all tiddlers of a certain \"category\". The parameters\n * to this all-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step. Not of much use here, ignore it for most usecases.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foos = function(source, prefix, options) {\n return [\"foo\", \"bar\", \"baz\"];\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207103459780"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js\ntags: \nmodified: 20180207092452733\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our command and tells TiddlyWiki whether to run it\n * synchronously or asynchronously. The latter use a callback to signal\n * finish or failure (see below).\n */\nexports.info = {\n name: \"foobarbaz\",\n synchronous: true\n};\n\n/* Creates a new command instance. Please note that asynchronous commands will\n * receive a third \"callback\" parameter, which we should store for later use;\n * see below how to use it.\n */\nvar Command = function(params, commander /*, callback */) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n /* this.callback = callback; */\n};\n\n/* Executes our command. For synchronous commands return either null (success)\n * or an error string. For asynchronous commands use the callback instead which\n * we'd receive in the constructor call.\n */\nCommand.prototype.execute = function() {\n /* check your command parameters, which you will find in this.params */\n if (this.params.length < 1) {\n return \"Missing foo parameter\";\n }\n\n /* ... */\n\n return null; /* no error. */\n /* this.callback(); // for async commands */\n};\n\nexports.Command = Command;\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207092452733"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css","created":"20180205162715434","modified":"20180207092942425","type":"text/css","text":"/* add your CSS rules here */\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js\nmodified: 20180207103213628\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and and exports our filter operator function. The parameters\n * to operator functions are as follows:\n *\n * source: a tiddler iterator that represents the resoluts of the previous\n * filter step.\n * operator: the arguments to this filter operator...\n * .operator: name of the filter operator.\n * .operand: the operand as a string; text references and variable names\n * have already been resolved at this point.\n * .prefix: an optional \"!\" if the filter is to be negated.\n * .suffix: an optional string containing an additional filter argument.\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's allowed to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.dofoo = function(source, operator, options) {\n\tvar results = [];\n\tsource(function(tiddler, title) {\n\t\tresults.push(\"foo\" + title);\n\t});\n\treturn results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103213628"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history","created":"20180202212229406","modified":"20180202212958716","tags":"","type":"text/vnd.tiddlywiki","text":"* ''0.0.1'' -- my first plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js\nmodified: 20180207103529498\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [is[XXX]] filter operator function. Such\n * is-filter operators filter tiddlers by a certain \"category\". The parameters\n * to this is-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step, which we now need to filter.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foo = function(source, prefix, options) {\n var results = [];\n\n if (prefix !== \"!\") {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) >= 0) {\n results.push(title);\n }\n });\n } else {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) < 0) {\n results.push(title);\n }\n });\n }\n\n return results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103529498"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js\nmodified: 20180207100549039\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Tells TiddlyWiki the name of our macro through the export mechanism. */\nexports.name = \"foObAr\";\n\n/* Lists of macro parameters; leave this array empty if you need none, or\n * want all supplied macro call parameters to be passed to the run() method.\n */\nexports.params = [\n { name: \"foo\" }, /* 1st parameter name */\n { name: \"bar\", default: \"bar\" }\n];\n\n/* Executes (runs) our macro when it requires evaluation; returns a string\n * value.\n */\nexports.run = function(foo, bar) {\n return foo + bar;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207100549039"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js\nmodified: 20180207095013968\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports/exposes symbols that users of this library can later use\n * after require()'ing a reference to this library.\n */\nexports.dofoo = function () {\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207095013968"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license","created":"20180202222709213","modified":"20180202222730979","tags":"","type":"text/vnd.tiddlywiki","text":"This plugin is licensed under the ..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js\nmodule-type: parser\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Parses blocks of source text into a parse tree. The parameters to the\n * constructor are as follows:\n *\n * type: the (mime type) of the text to parse.\n * text: the text to parse.\n * options:\n * .wiki: TiddlyWiki object reference.\n * ._canonical_uri: ...\n */\nvar Parser = function(type, text, options) {\n this.tree = [{\n \"type\": \"element\", \"tag\": \"code\", \"children\": [{\n \"type\": \"text\", \"text\": text\n }]\n }];\n};\n\n/* Declares the (document) mime types this parser is able to handle; multiple\n * export declarations are supported.\n */\nexports[\"application/x-foo-ducument\"] = Parser;\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"parser"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin","created":"20180202203909068","modified":"20180218193839795","plugin-type":"plugin","tags":"","type":"application/json","text":"{\"tiddlers\": {}}"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme","created":"20180202222539879","modified":"20180202222703851","tags":"","type":"text/vnd.tiddlywiki","text":"Tell your users about your plugin: what is it good for? How can it be used? And so on..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js","text":"/*\\\ncreated: 20180205163726933\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js\nmodified: 20180205164120901\ntype: application/javascript\nmodule-type: startup\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Names this startup module and tells TiddlyWiki to run it either\n * synchronously or asynchronously.\n */\nexports.name = \"foostartup\";\nexports.synchronous = true;\n\n/* Optionally set the order of startup execution */\n/* exports.after = [\"story\"]; */\n/* Optionally set the platforms on which to be executed */\n/* exports.platforms = [\"browser\"]; */\n\n/* Runs this function during startup */\nexports.startup = function() {\n /* do something here... */\n};\n \n})();","created":"20180205163726933","modified":"20180205164120901","type":"application/javascript","module-type":"startup"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template","created":"20180205164155065","modified":"20180205164212763","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js","text":"/*\\\ncreated: 20180211152629856\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js\nmodified: 20180211155735719\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to $tw.config */\nexports.foofoo = 42;\nexports.foobar = {};\n \n})();","created":"20180211152629856","type":"application/javascript","modified":"20180211155735719","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js","text":"/*\\\ncreated: 20180211153224637\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js\nmodified: 20180211153304692\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to the global $tw */\nexports.foofoo = 42;\n \n})();","created":"20180211153224637","type":"application/javascript","modified":"20180211153304692","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro","created":"20180205162715434","modified":"20180207101427201","type":"text/vnd.tiddlywiki","text":"\\define fOObARbAZ()\nfOObARBaZong!\n\\end"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui","created":"20180205164236165","modified":"20180205164237226","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js","text":"/*\\\ncreated: 20180205164319473\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js\nmodified: 20180211153602323\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180205164319473","type":"application/javascript","modified":"20180211153602323"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js","text":"/*\\\ncreated: 20180211153526427\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js\nmodified: 20180211153817740\ntags: \n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Only when running inside a Node.js-based TiddlyWiki server,\n * this creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180211153526427","type":"application/javascript","modified":"20180211153817740","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js","text":"/*\\\ncreated: 20180211154125055\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js\nmodified: 20180211154857371\ntags: \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\n/* Creates a new <$foo> widget. */\nvar FooWidget = function(parseTreeNode, options) {\n this.initialise(parseTreeNode, options);\n};\n \n/* \"Inherits\" from the Widget base \"class\" in order to get all\n * the basic widget functionality.\n */\nFooWidget.prototype = new Widget();\n\n/* Renders this widget into the DOM. */\nFooWidget.prototype.render = function(parent,nextSibling) {\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n /* ... */\n};\n\n/* Computes the internal state of this widget. */\nFooWidget.prototype.execute = function() {\n /* ... */\n this.makeChildWidgets();\n}; \n \n/* Selectively refreshes this widget if needed and returns\n * true if either this widget itself or one of its children\n * needs to be re-rendered.\n */\nFooWidget.prototype.refresh = function(changedTiddlers) {\n var changedAttributes = this.computeAttributes(),\n hasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n if (hasChangedAttributes) {\n /* ... */\n }\n return this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\n/* Finally exports the widget constructor. */\nexports.foo = FooWidget;\n\n})();","created":"20180211154125055","type":"application/javascript","modified":"20180211154857371","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js\ntype: application/javascript\nmodule-type: wikirule\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our wikiparser rule and exports it */\nexports.name = \"dash\";\n/* Export the type(s) of rule, can be \"inline: true\" or/and \"block: true\" */\nexports.types = { inline: true };\n\n/* Initializes the rule and tells the parser when to match */\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /fOO!/mg;\n};\n\n/* Parses markup after the parser has matched out rule. It then returns\n * a parse tree.\n */\nexports.parse = function() {\n\t/* Move past this match */\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: \"foo\"\n\t}];\n};\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"wikirule"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator","caption":"new [all[...]] filter operator","created":"20180207103416636","modified":"20180207103625598","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate","caption":"add plugin boilerplate tiddlers","created":"20180202210615976","modified":"20180211162427574","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"\\define plugin-tiddler-within(title) $:/plugins/$(plugin-name)$/$title$\n\n<$set name=\"old-list\" tiddler=<> field=\"list\">\n<$set name=\"list\" filter=\"[enlist] -[[readme]] -[[license]] -[[history]]\">\n<$set name=\"new-list\" filter=\"readme license history [enlist]\">\n<$button class=<> >\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme\" />\n<$action-setfield $tiddler=<> list=<> />\n<>{{!!caption}}\n$button>\n$set>\n$set>\n$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command","caption":"new command module","created":"20180202223504033","modified":"20180207100039540","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config","caption":"new $tw.config module","created":"20180211155634174","modified":"20180211155728819","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle","caption":"new CSS tiddler","created":"20180202223710863","modified":"20180207100321397","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator","caption":"new [...[]] filter operator","created":"20180207103225047","modified":"20180207103715611","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator","caption":"new [is[...]] filter operator","created":"20180207103539461","modified":"20180207103611302","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro","caption":"new Javascript macro","created":"20180204191504018","modified":"20180207100731291","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library","caption":"new Javascript library","created":"20180202223038045","modified":"20180207100520908","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler","caption":"new wikitext tiddler","created":"20180202224303945","modified":"20180207100850748","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal","caption":"new $tw globals module","created":"20180211155502716","modified":"20180211155620374","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro","caption":"new wikitext macro","created":"20180202223619732","modified":"20180207101828276","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util","caption":"new $tw.utils module","created":"20180211155355001","modified":"20180211155426871","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode","caption":"new Nodejs-only $tw.utils module","created":"20180211155116031","modified":"20180211155445679","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget","caption":"new widget module","created":"20180202223929415","modified":"20180211155035989","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData","created":"20141025150024301","list-before":"$:/core/ui/ViewTemplate/plugin","modified":"20180205194450156","tags":"$:/tags/ViewTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-type-infotiddler(tiddler)\n <$transclude tiddler=\"$tiddler$\">\n <$transclude tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined\"/>\n $transclude>\n\\end\n\n\\define plugin-type-info(type)\n <$macrocall $name=\"plugin-type-infotiddler\" tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/$type$\"/>\n\\end\n\n\\define plugin-info-row(name, value)\n\\rules except wikilink\n
\n\n$list>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import","created":"20141025175537027","modified":"20180205194514922","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`import` -- is a special plugin type only used internally by the TiddlyWiki 5 core when importing tiddlers. No ordinary plugin should ever use a plugin type of `import`."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language","created":"20141025180244406","modified":"20141025180805600","type":"text/vnd.tiddlywiki","text":"`language` -- this plugin is a language package for the language \"{{!!name}}\". This language plugin will automatically be used when you select this language in the [[basic settings|$:/core/ui/ControlPanel/Basics]] of the [[control panel|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin","created":"20141025155451829","modified":"20180205194504314","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`plugin` -- this is the most general form of a TiddlyWiki 5 plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme","created":"20141025174630240","modified":"20180205194533069","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`theme` -- contains a TiddlyWiki 5 theme. You can select this theme through the [[theme switcher|$:/core/ui/ControlPanel/Theme]] in the [[control pane|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined","created":"20141025155725392","modified":"20141117190958706","type":"text/vnd.tiddlywiki","text":"<$view field=\"plugin-type\"/> -- is an ''unknown plugin type''."},"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js","text":"/*\\\ncreated: 20141020111918405\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js\ntype: application/javascript\nmodified: 20141020111927394\nmodule-type: widget\n\nDefault widget: if a particular tiddler is not present,\nthen it gets created using the default values specified.\nIn contrast to the new tiddler creation message, we don't\nuse a static template but instead accept the default values\nin form of a JSON string that may be the result of some\nmacro invokation.\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 EnsureTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEnsureTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEnsureTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEnsureTiddlerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.ensureTitle = this.getAttribute(\"title\",\"currentTiddler\");\n\tthis.ensureDefault = this.getAttribute(\"default\");\n\n var tiddler = this.wiki.getTiddler(this.ensureTitle);\n if(!tiddler) {\n var defaults;\n try {\n defaults = JSON.parse(this.ensureDefault);\n } catch(ex) {\n defaults = {};\n }\n defaults[\"title\"] = this.ensureTitle;\n var mods = this.wiki.getModificationFields();\n this.wiki.addTiddler(new $tw.Tiddler(defaults,mods));\n }\n \n // Construct the 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*/\nEnsureTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.title || changedAttributes.default) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.ensuretiddler = EnsureTiddlerWidget;\n\n})();\n","created":"20141020111918405","type":"application/javascript","modified":"20141020111927394","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js","text":"/*\\\ncreated: 20141015190230115\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js\ntype: application/javascript\nmodified: 20141015190236275\nmodule-type: widget\n\nThe JSON mangler widget -- similar to the fieldmangler widget,\nbut for mangling JSON data in a data tiddler instead of\nmangling the fields of a tiddler.\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\n// The JSON mangler widget understands the following events:\n// * tm-add-json-index: add a new index to a JSON data tiddler, the\n// index name to add is in the event param parameter.\n// * tm-remove-json-index: remove an existing index from a JSON data\n// tiddler, as specified in the event param parameter.\nvar JsonManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-json-index\", handler: \"handleAddJsonIndexEvent\"},\n\t\t{type: \"tm-remove-json-index\", handler: \"handleRemoveJsonIndexEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nJsonManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nJsonManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nJsonManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nJsonManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Add a new index (as specified in the event param parameter) to a JSON\n// data tiddler (specified in the widget title parameter). It is also possible\n// to specify a default value; the event param parameter then needs to be a hashmap\n// with the elements \"index\" (name of index) and \"default\" (default value).\nJsonManglerWidget.prototype.handleAddJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tvar def = (typeof event.param === \"string\") ? \"\" : event.param[\"default\"];\n\tif ( index ) {\n\t\tvar data = tiddler ? this.wiki.getTiddlerData(tiddler, {}) : {};\n\t\tdata[index] = \"\";\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\n// Remove an existing index (as specified in the event param parameter) from a JSON\n// data tiddler (specified in the widget title parameter).\nJsonManglerWidget.prototype.handleRemoveJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tif ( tiddler && index ) {\n\t\tvar data = this.wiki.getTiddlerData(tiddler, {});\n\t\tdelete data[index];\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\nexports.jsonmangler = JsonManglerWidget;\n\n})();\n","created":"20141015190230115","type":"application/javascript","modified":"20141015190236275","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js","text":"/*\\\ncreated: 20141020111936183\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js\ntype: application/javascript\nmodified: 20141020111942403\nmodule-type: widget\n\nThe list mangler widget -- mangles the list field of a\ntiddler. It supports the following parameters:\n* tiddler: the tiddler to work on, default is currentTiddler.\n* field: the field to mangle as a list, default is the list field.\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\n// The list mangler widget understands the following events:\n// * tm-add-list-element\n// * tm-remove-list-element\n// * tm-back-list-element\n// * tm-forward-list-element\nvar ListManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-list-element\", handler: \"handleAddListElementEvent\"},\n\t\t{type: \"tm-remove-list-element\", handler: \"handleRemoveListElementEvent\"},\n\t\t{type: \"tm-shift-forward-list-element\", handler: \"handleShiftForwardListElementEvent\"},\n\t\t{type: \"tm-shift-back-list-element\", handler: \"handleShiftBackListElementEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nListManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nListManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nListManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n this.mangleField = this.getAttribute(\"field\",\"list\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nListManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Appends a new element to the list field (or other anspecified field) of\n// the given tiddler. Ensures that the same element never gets added twice.\n// If the tiddler doesn't exist yet, it will be created.\nListManglerWidget.prototype.handleAddListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle) || new $tw.Tiddler({title: this.mangleTitle});\n var addElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(addElement);\n if(where<0) {\n list.push(addElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n return true;\n};\n\n// Removes an existing element from the list field (or another specified field)\n// of the given tiddler.\nListManglerWidget.prototype.handleRemoveListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var remElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(remElement);\n if(where>=0) {\n list.splice(where,1);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\n// Moves an existing element from the list field (or another specified field)\n// one position forward towards the end of the list of the given tiddler.\nListManglerWidget.prototype.handleShiftForwardListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var shiftElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(shiftElement);\n if((where>=0) && (where=1) {\n var swapElement = list[where-1];\n list.splice(where-1,2,shiftElement,swapElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\nexports.listmangler = ListManglerWidget;\n\n})();\n","created":"20141020111936183","type":"application/javascript","modified":"20141020111942403","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js","text":"/*\\\ncreated: 20140927173129833\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js\ntype: application/javascript\nmodified: 20140927173153432\nmodule-type: widget\n\nmetafy widget\n\nUsed to dump javascript tiddlers correctly as .js files as opposed to .js.tid\nfiles.\n\nwidget attributes:\n* tiddler: defaults to the widget variable currentTiddler.\n* detect: regular expression detecting a meta data section (which may be\n empty). Its parameter #2 indicates where to replace/insert meta data\n when such a section is present. Otherwise, the template parameter will\n be used instead. For instance, the following regular expression composed\n of these elements:\n \"(^\\/\\*\\\\(?:\\r?\\n))\"\n -- the special comment marker at the section beginning on its own line.\n \"((?:^[^\\r\\n]+(?:\\r?\\n))*)\"\n -- matches all meta data field lines.\n \"(?:(?:^[^\\r\\n]*(?:\\r?\\n))*)\"\n -- matches a trailing normal comment text.\n \"(?:^\\\\\\*\\/(?:\\r?\\n)?)\"\n -- the special comment marker at the section end on its own line.\n* exclude: the fields to exclude; defaults to \"text bag revision\".\n* template: template to use to establish meta data section if not yet present.\n $fields$ is used to indicate where to insert the fields (meta) data section of\n \"field: value\\n\" pairs. For instance, \"/*\\\\\\n$fields$\\\\*\"+\"/\\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\n/*\nConstructor\n */\nvar MetafyWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n\n/*\nInherit from the base widget class\n*/\nMetafyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMetafyWidget.prototype.render = function(parent, nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode, nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMetafyWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.metafyTitle = this.getAttribute(\"tiddler\", this.getVariable(\"currentTiddler\"));\n\tthis.metafyDetect = this.getAttribute(\"match\",\n\t\t \"(^\\\\/\\\\*\\\\\\\\(?:\\\\r?\\\\n))\" // special comment marker beginning\n\t\t+ \"((?:^[^\\\\r\\\\n]+(?:\\\\r?\\\\n))*)\" // field name-value pairs\n\t\t+ \"(?:(?:^[^\\\\r\\\\n]*(?:\\\\r?\\\\n))*)\" // remaining comment section\n\t\t+ \"(?:^\\\\\\\\\\\\*\\\\/(?:\\\\r?\\\\n)?)\" // special comment marker end\n\t);\n\tvar exclude = this.getAttribute(\"exclude\", \"text bag revision\");\n\texclude = exclude.split(\" \");\n\tthis.metafyExclude = exclude;\n\tthis.metafyTemplate = this.getAttribute(\"template\", \"/*\\\\\\n$fields$\\\\*/\\n\");\n\t\n\tvar tiddler = this.wiki.getTiddler(this.metafyTitle);\n\tvar text = \"\";\n\tif (tiddler) {\n\t\ttext = this.wiki.getTiddlerText(this.metafyTitle);\n\t}\n\t\n\tvar fields = \"\";\n\tfor(var field in tiddler.fields) {\n\t\tif (exclude.indexOf(field) === -1) {\n\t\t\tfields += field + \": \" + tiddler.getFieldString(field) + \"\\n\";\n\t\t}\n\t}\n\t\n\tvar match = new RegExp(this.metafyDetect, \"mg\").exec(text);\n\tif (match) {\n\t\tvar start = match.index + match[1].length;\n\t\ttext = text.substr(0, start) + fields + text.substr(start + match[2].length);\n\t} else {\n\t\tconsole.log(\"no match\");\n\t\ttext = this.metafyTemplate.replace(\"$fields$\", fields) + text;\n\t}\n\t\n\tthis.text = text;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMetafyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.detect || changedAttributes.exclude || changedAttributes.template || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nExport the metafy widget\n */\nexports.metafy = MetafyWidget;\n\n})();\n","created":"20140927173129833","type":"application/javascript","modified":"20140927173153432","module-type":"widget"}}}
\ No newline at end of file
+{"tiddlers":{"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js","text":"/*\\\ncreated: 20141003161333154\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/addon/selection/active-line.js\nmodified: 20141003161445164\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n// Because sometimes you need to style the cursor's line.\n//\n// Adds an option 'styleActiveLine' which, when enabled, gives the\n// active line's wrapping
the CSS class \"CodeMirror-activeline\",\n// and gives its background
the class \"CodeMirror-activeline-background\".\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n \"use strict\";\n var WRAP_CLASS = \"CodeMirror-activeline\";\n var BACK_CLASS = \"CodeMirror-activeline-background\";\n\n CodeMirror.defineOption(\"styleActiveLine\", false, function(cm, val, old) {\n var prev = old && old != CodeMirror.Init;\n if (val && !prev) {\n cm.state.activeLines = [];\n updateActiveLines(cm, cm.listSelections());\n cm.on(\"beforeSelectionChange\", selectionChange);\n } else if (!val && prev) {\n cm.off(\"beforeSelectionChange\", selectionChange);\n clearActiveLines(cm);\n delete cm.state.activeLines;\n }\n });\n\n function clearActiveLines(cm) {\n for (var i = 0; i < cm.state.activeLines.length; i++) {\n cm.removeLineClass(cm.state.activeLines[i], \"wrap\", WRAP_CLASS);\n cm.removeLineClass(cm.state.activeLines[i], \"background\", BACK_CLASS);\n }\n }\n\n function sameArray(a, b) {\n if (a.length != b.length) return false;\n for (var i = 0; i < a.length; i++)\n if (a[i] != b[i]) return false;\n return true;\n }\n\n function updateActiveLines(cm, ranges) {\n var active = [];\n for (var i = 0; i < ranges.length; i++) {\n var range = ranges[i];\n if (!range.empty()) continue;\n var line = cm.getLineHandleVisualStart(range.head.line);\n if (active[active.length - 1] != line) active.push(line);\n }\n if (sameArray(cm.state.activeLines, active)) return;\n cm.operation(function() {\n clearActiveLines(cm);\n for (var i = 0; i < active.length; i++) {\n cm.addLineClass(active[i], \"wrap\", WRAP_CLASS);\n cm.addLineClass(active[i], \"background\", BACK_CLASS);\n }\n cm.state.activeLines = active;\n });\n }\n\n function selectionChange(cm, sel) {\n updateActiveLines(cm, sel.ranges);\n }\n});\n","created":"20141003161333154","modified":"20141003161445164","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js","text":"/*\\\ncreated: 20141003162651180\ntitle: $:/plugins/TheDiveO/ThirdFlow/codemirror/mode/css/css.js\nmodified: 20141003162818850\ntype: application/javascript\nmodule-type: library\n\\*/\n// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/LICENSE\n\n(function(mod) {\n if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n mod(require(\"$:/plugins/tiddlywiki/codemirror/lib/codemirror\"));\n else if (typeof define == \"function\" && define.amd) // AMD\n define([\"../../lib/codemirror\"], mod);\n else // Plain browser env\n mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"css\", function(config, parserConfig) {\n if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode(\"text/css\");\n\n var indentUnit = config.indentUnit,\n tokenHooks = parserConfig.tokenHooks,\n mediaTypes = parserConfig.mediaTypes || {},\n mediaFeatures = parserConfig.mediaFeatures || {},\n propertyKeywords = parserConfig.propertyKeywords || {},\n nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {},\n colorKeywords = parserConfig.colorKeywords || {},\n valueKeywords = parserConfig.valueKeywords || {},\n fontProperties = parserConfig.fontProperties || {},\n allowNested = parserConfig.allowNested;\n\n var type, override;\n function ret(style, tp) { type = tp; return style; }\n\n // Tokenizers\n\n function tokenBase(stream, state) {\n var ch = stream.next();\n if (tokenHooks[ch]) {\n var result = tokenHooks[ch](stream, state);\n if (result !== false) return result;\n }\n if (ch == \"@\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"def\", stream.current());\n } else if (ch == \"=\" || (ch == \"~\" || ch == \"|\") && stream.eat(\"=\")) {\n return ret(null, \"compare\");\n } else if (ch == \"\\\"\" || ch == \"'\") {\n state.tokenize = tokenString(ch);\n return state.tokenize(stream, state);\n } else if (ch == \"#\") {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"atom\", \"hash\");\n } else if (ch == \"!\") {\n stream.match(/^\\s*\\w*/);\n return ret(\"keyword\", \"important\");\n } else if (/\\d/.test(ch) || ch == \".\" && stream.eat(/\\d/)) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (ch === \"-\") {\n if (/[\\d.]/.test(stream.peek())) {\n stream.eatWhile(/[\\w.%]/);\n return ret(\"number\", \"unit\");\n } else if (stream.match(/^\\w+-/)) {\n return ret(\"meta\", \"meta\");\n }\n } else if (/[,+>*\\/]/.test(ch)) {\n return ret(null, \"select-op\");\n } else if (ch == \".\" && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {\n return ret(\"qualifier\", \"qualifier\");\n } else if (/[:;{}\\[\\]\\(\\)]/.test(ch)) {\n return ret(null, ch);\n } else if (ch == \"u\" && stream.match(\"rl(\")) {\n stream.backUp(1);\n state.tokenize = tokenParenthesized;\n return ret(\"property\", \"word\");\n } else if (/[\\w\\\\\\-]/.test(ch)) {\n stream.eatWhile(/[\\w\\\\\\-]/);\n return ret(\"property\", \"word\");\n } else {\n return ret(null, null);\n }\n }\n\n function tokenString(quote) {\n return function(stream, state) {\n var escaped = false, ch;\n while ((ch = stream.next()) != null) {\n if (ch == quote && !escaped) {\n if (quote == \")\") stream.backUp(1);\n break;\n }\n escaped = !escaped && ch == \"\\\\\";\n }\n if (ch == quote || !escaped && quote != \")\") state.tokenize = null;\n return ret(\"string\", \"string\");\n };\n }\n\n function tokenParenthesized(stream, state) {\n stream.next(); // Must be '('\n if (!stream.match(/\\s*[\\\"\\')]/, false))\n state.tokenize = tokenString(\")\");\n else\n state.tokenize = null;\n return ret(null, \"(\");\n }\n\n // Context management\n\n function Context(type, indent, prev) {\n this.type = type;\n this.indent = indent;\n this.prev = prev;\n }\n\n function pushContext(state, stream, type) {\n state.context = new Context(type, stream.indentation() + indentUnit, state.context);\n return type;\n }\n\n function popContext(state) {\n state.context = state.context.prev;\n return state.context.type;\n }\n\n function pass(type, stream, state) {\n return states[state.context.type](type, stream, state);\n }\n function popAndPass(type, stream, state, n) {\n for (var i = n || 1; i > 0; i--)\n state.context = state.context.prev;\n return pass(type, stream, state);\n }\n\n // Parser\n\n function wordAsValue(stream) {\n var word = stream.current().toLowerCase();\n if (valueKeywords.hasOwnProperty(word))\n override = \"atom\";\n else if (colorKeywords.hasOwnProperty(word))\n override = \"keyword\";\n else\n override = \"variable\";\n }\n\n var states = {};\n\n states.top = function(type, stream, state) {\n if (type == \"{\") {\n return pushContext(state, stream, \"block\");\n } else if (type == \"}\" && state.context.prev) {\n return popContext(state);\n } else if (type == \"@media\") {\n return pushContext(state, stream, \"media\");\n } else if (type == \"@font-face\") {\n return \"font_face_before\";\n } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(type)) {\n return \"keyframes\";\n } else if (type && type.charAt(0) == \"@\") {\n return pushContext(state, stream, \"at\");\n } else if (type == \"hash\") {\n override = \"builtin\";\n } else if (type == \"word\") {\n override = \"tag\";\n } else if (type == \"variable-definition\") {\n return \"maybeprop\";\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n } else if (type == \":\") {\n return \"pseudo\";\n } else if (allowNested && type == \"(\") {\n return pushContext(state, stream, \"parens\");\n }\n return state.context.type;\n };\n\n states.block = function(type, stream, state) {\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (propertyKeywords.hasOwnProperty(word)) {\n override = \"property\";\n return \"maybeprop\";\n } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) {\n override = \"string-2\";\n return \"maybeprop\";\n } else if (allowNested) {\n override = stream.match(/^\\s*:/, false) ? \"property\" : \"tag\";\n return \"block\";\n } else {\n override += \" error\";\n return \"maybeprop\";\n }\n } else if (type == \"meta\") {\n return \"block\";\n } else if (!allowNested && (type == \"hash\" || type == \"qualifier\")) {\n override = \"error\";\n return \"block\";\n } else {\n return states.top(type, stream, state);\n }\n };\n\n states.maybeprop = function(type, stream, state) {\n if (type == \":\") return pushContext(state, stream, \"prop\");\n return pass(type, stream, state);\n };\n\n states.prop = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" && allowNested) return pushContext(state, stream, \"propBlock\");\n if (type == \"}\" || type == \"{\") return popAndPass(type, stream, state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n\n if (type == \"hash\" && !/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {\n override += \" error\";\n } else if (type == \"word\") {\n wordAsValue(stream);\n } else if (type == \"interpolation\") {\n return pushContext(state, stream, \"interpolation\");\n }\n return \"prop\";\n };\n\n states.propBlock = function(type, _stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") { override = \"property\"; return \"maybeprop\"; }\n return state.context.type;\n };\n\n states.parens = function(type, stream, state) {\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \")\") return popContext(state);\n if (type == \"(\") return pushContext(state, stream, \"parens\");\n if (type == \"word\") wordAsValue(stream);\n return \"parens\";\n };\n\n states.pseudo = function(type, stream, state) {\n if (type == \"word\") {\n override = \"variable-3\";\n return state.context.type;\n }\n return pass(type, stream, state);\n };\n\n states.media = function(type, stream, state) {\n if (type == \"(\") return pushContext(state, stream, \"media_parens\");\n if (type == \"}\") return popAndPass(type, stream, state);\n if (type == \"{\") return popContext(state) && pushContext(state, stream, allowNested ? \"block\" : \"top\");\n\n if (type == \"word\") {\n var word = stream.current().toLowerCase();\n if (word == \"only\" || word == \"not\" || word == \"and\")\n override = \"keyword\";\n else if (mediaTypes.hasOwnProperty(word))\n override = \"attribute\";\n else if (mediaFeatures.hasOwnProperty(word))\n override = \"property\";\n else\n override = \"error\";\n }\n return state.context.type;\n };\n\n states.media_parens = function(type, stream, state) {\n if (type == \")\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state, 2);\n return states.media(type, stream, state);\n };\n\n states.font_face_before = function(type, stream, state) {\n if (type == \"{\")\n return pushContext(state, stream, \"font_face\");\n return pass(type, stream, state);\n };\n\n states.font_face = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"word\") {\n if (!fontProperties.hasOwnProperty(stream.current().toLowerCase()))\n override = \"error\";\n else\n override = \"property\";\n return \"maybeprop\";\n }\n return \"font_face\";\n };\n\n states.keyframes = function(type, stream, state) {\n if (type == \"word\") { override = \"variable\"; return \"keyframes\"; }\n if (type == \"{\") return pushContext(state, stream, \"top\");\n return pass(type, stream, state);\n };\n\n states.at = function(type, stream, state) {\n if (type == \";\") return popContext(state);\n if (type == \"{\" || type == \"}\") return popAndPass(type, stream, state);\n if (type == \"word\") override = \"tag\";\n else if (type == \"hash\") override = \"builtin\";\n return \"at\";\n };\n\n states.interpolation = function(type, stream, state) {\n if (type == \"}\") return popContext(state);\n if (type == \"{\" || type == \";\") return popAndPass(type, stream, state);\n if (type != \"variable\") override = \"error\";\n return \"interpolation\";\n };\n\n return {\n startState: function(base) {\n return {tokenize: null,\n state: \"top\",\n context: new Context(\"top\", base || 0, null)};\n },\n\n token: function(stream, state) {\n if (!state.tokenize && stream.eatSpace()) return null;\n var style = (state.tokenize || tokenBase)(stream, state);\n if (style && typeof style == \"object\") {\n type = style[1];\n style = style[0];\n }\n override = style;\n state.state = states[state.state](type, stream, state);\n return override;\n },\n\n indent: function(state, textAfter) {\n var cx = state.context, ch = textAfter && textAfter.charAt(0);\n var indent = cx.indent;\n if (cx.type == \"prop\" && (ch == \"}\" || ch == \")\")) cx = cx.prev;\n if (cx.prev &&\n (ch == \"}\" && (cx.type == \"block\" || cx.type == \"top\" || cx.type == \"interpolation\" || cx.type == \"font_face\") ||\n ch == \")\" && (cx.type == \"parens\" || cx.type == \"media_parens\") ||\n ch == \"{\" && (cx.type == \"at\" || cx.type == \"media\"))) {\n indent = cx.indent - indentUnit;\n cx = cx.prev;\n }\n return indent;\n },\n\n electricChars: \"}\",\n blockCommentStart: \"/*\",\n blockCommentEnd: \"*/\",\n fold: \"brace\"\n };\n});\n\n function keySet(array) {\n var keys = {};\n for (var i = 0; i < array.length; ++i) {\n keys[array[i]] = true;\n }\n return keys;\n }\n\n var mediaTypes_ = [\n \"all\", \"aural\", \"braille\", \"handheld\", \"print\", \"projection\", \"screen\",\n \"tty\", \"tv\", \"embossed\"\n ], mediaTypes = keySet(mediaTypes_);\n\n var mediaFeatures_ = [\n \"width\", \"min-width\", \"max-width\", \"height\", \"min-height\", \"max-height\",\n \"device-width\", \"min-device-width\", \"max-device-width\", \"device-height\",\n \"min-device-height\", \"max-device-height\", \"aspect-ratio\",\n \"min-aspect-ratio\", \"max-aspect-ratio\", \"device-aspect-ratio\",\n \"min-device-aspect-ratio\", \"max-device-aspect-ratio\", \"color\", \"min-color\",\n \"max-color\", \"color-index\", \"min-color-index\", \"max-color-index\",\n \"monochrome\", \"min-monochrome\", \"max-monochrome\", \"resolution\",\n \"min-resolution\", \"max-resolution\", \"scan\", \"grid\"\n ], mediaFeatures = keySet(mediaFeatures_);\n\n var propertyKeywords_ = [\n \"align-content\", \"align-items\", \"align-self\", \"alignment-adjust\",\n \"alignment-baseline\", \"anchor-point\", \"animation\", \"animation-delay\",\n \"animation-direction\", \"animation-duration\", \"animation-fill-mode\",\n \"animation-iteration-count\", \"animation-name\", \"animation-play-state\",\n \"animation-timing-function\", \"appearance\", \"azimuth\", \"backface-visibility\",\n \"background\", \"background-attachment\", \"background-clip\", \"background-color\",\n \"background-image\", \"background-origin\", \"background-position\",\n \"background-repeat\", \"background-size\", \"baseline-shift\", \"binding\",\n \"bleed\", \"bookmark-label\", \"bookmark-level\", \"bookmark-state\",\n \"bookmark-target\", \"border\", \"border-bottom\", \"border-bottom-color\",\n \"border-bottom-left-radius\", \"border-bottom-right-radius\",\n \"border-bottom-style\", \"border-bottom-width\", \"border-collapse\",\n \"border-color\", \"border-image\", \"border-image-outset\",\n \"border-image-repeat\", \"border-image-slice\", \"border-image-source\",\n \"border-image-width\", \"border-left\", \"border-left-color\",\n \"border-left-style\", \"border-left-width\", \"border-radius\", \"border-right\",\n \"border-right-color\", \"border-right-style\", \"border-right-width\",\n \"border-spacing\", \"border-style\", \"border-top\", \"border-top-color\",\n \"border-top-left-radius\", \"border-top-right-radius\", \"border-top-style\",\n \"border-top-width\", \"border-width\", \"bottom\", \"box-decoration-break\",\n \"box-shadow\", \"box-sizing\", \"break-after\", \"break-before\", \"break-inside\",\n \"caption-side\", \"clear\", \"clip\", \"color\", \"color-profile\", \"column-count\",\n \"column-fill\", \"column-gap\", \"column-rule\", \"column-rule-color\",\n \"column-rule-style\", \"column-rule-width\", \"column-span\", \"column-width\",\n \"columns\", \"content\", \"counter-increment\", \"counter-reset\", \"crop\", \"cue\",\n \"cue-after\", \"cue-before\", \"cursor\", \"direction\", \"display\",\n \"dominant-baseline\", \"drop-initial-after-adjust\",\n \"drop-initial-after-align\", \"drop-initial-before-adjust\",\n \"drop-initial-before-align\", \"drop-initial-size\", \"drop-initial-value\",\n \"elevation\", \"empty-cells\", \"fit\", \"fit-position\", \"flex\", \"flex-basis\",\n \"flex-direction\", \"flex-flow\", \"flex-grow\", \"flex-shrink\", \"flex-wrap\",\n \"float\", \"float-offset\", \"flow-from\", \"flow-into\", \"font\", \"font-feature-settings\",\n \"font-family\", \"font-kerning\", \"font-language-override\", \"font-size\", \"font-size-adjust\",\n \"font-stretch\", \"font-style\", \"font-synthesis\", \"font-variant\",\n \"font-variant-alternates\", \"font-variant-caps\", \"font-variant-east-asian\",\n \"font-variant-ligatures\", \"font-variant-numeric\", \"font-variant-position\",\n \"font-weight\", \"grid\", \"grid-area\", \"grid-auto-columns\", \"grid-auto-flow\",\n \"grid-auto-position\", \"grid-auto-rows\", \"grid-column\", \"grid-column-end\",\n \"grid-column-start\", \"grid-row\", \"grid-row-end\", \"grid-row-start\",\n \"grid-template\", \"grid-template-areas\", \"grid-template-columns\",\n \"grid-template-rows\", \"hanging-punctuation\", \"height\", \"hyphens\",\n \"icon\", \"image-orientation\", \"image-rendering\", \"image-resolution\",\n \"inline-box-align\", \"justify-content\", \"left\", \"letter-spacing\",\n \"line-break\", \"line-height\", \"line-stacking\", \"line-stacking-ruby\",\n \"line-stacking-shift\", \"line-stacking-strategy\", \"list-style\",\n \"list-style-image\", \"list-style-position\", \"list-style-type\", \"margin\",\n \"margin-bottom\", \"margin-left\", \"margin-right\", \"margin-top\",\n \"marker-offset\", \"marks\", \"marquee-direction\", \"marquee-loop\",\n \"marquee-play-count\", \"marquee-speed\", \"marquee-style\", \"max-height\",\n \"max-width\", \"min-height\", \"min-width\", \"move-to\", \"nav-down\", \"nav-index\",\n \"nav-left\", \"nav-right\", \"nav-up\", \"object-fit\", \"object-position\",\n \"opacity\", \"order\", \"orphans\", \"outline\",\n \"outline-color\", \"outline-offset\", \"outline-style\", \"outline-width\",\n \"overflow\", \"overflow-style\", \"overflow-wrap\", \"overflow-x\", \"overflow-y\",\n \"padding\", \"padding-bottom\", \"padding-left\", \"padding-right\", \"padding-top\",\n \"page\", \"page-break-after\", \"page-break-before\", \"page-break-inside\",\n \"page-policy\", \"pause\", \"pause-after\", \"pause-before\", \"perspective\",\n \"perspective-origin\", \"pitch\", \"pitch-range\", \"play-during\", \"position\",\n \"presentation-level\", \"punctuation-trim\", \"quotes\", \"region-break-after\",\n \"region-break-before\", \"region-break-inside\", \"region-fragment\",\n \"rendering-intent\", \"resize\", \"rest\", \"rest-after\", \"rest-before\", \"richness\",\n \"right\", \"rotation\", \"rotation-point\", \"ruby-align\", \"ruby-overhang\",\n \"ruby-position\", \"ruby-span\", \"shape-image-threshold\", \"shape-inside\", \"shape-margin\",\n \"shape-outside\", \"size\", \"speak\", \"speak-as\", \"speak-header\",\n \"speak-numeral\", \"speak-punctuation\", \"speech-rate\", \"stress\", \"string-set\",\n \"tab-size\", \"table-layout\", \"target\", \"target-name\", \"target-new\",\n \"target-position\", \"text-align\", \"text-align-last\", \"text-decoration\",\n \"text-decoration-color\", \"text-decoration-line\", \"text-decoration-skip\",\n \"text-decoration-style\", \"text-emphasis\", \"text-emphasis-color\",\n \"text-emphasis-position\", \"text-emphasis-style\", \"text-height\",\n \"text-indent\", \"text-justify\", \"text-outline\", \"text-overflow\", \"text-shadow\",\n \"text-size-adjust\", \"text-space-collapse\", \"text-transform\", \"text-underline-position\",\n \"text-wrap\", \"top\", \"transform\", \"transform-origin\", \"transform-style\",\n \"transition\", \"transition-delay\", \"transition-duration\",\n \"transition-property\", \"transition-timing-function\", \"unicode-bidi\",\n \"vertical-align\", \"visibility\", \"voice-balance\", \"voice-duration\",\n \"voice-family\", \"voice-pitch\", \"voice-range\", \"voice-rate\", \"voice-stress\",\n \"voice-volume\", \"volume\", \"white-space\", \"widows\", \"width\", \"word-break\",\n \"word-spacing\", \"word-wrap\", \"z-index\",\n // SVG-specific\n \"clip-path\", \"clip-rule\", \"mask\", \"enable-background\", \"filter\", \"flood-color\",\n \"flood-opacity\", \"lighting-color\", \"stop-color\", \"stop-opacity\", \"pointer-events\",\n \"color-interpolation\", \"color-interpolation-filters\",\n \"color-rendering\", \"fill\", \"fill-opacity\", \"fill-rule\", \"image-rendering\",\n \"marker\", \"marker-end\", \"marker-mid\", \"marker-start\", \"shape-rendering\", \"stroke\",\n \"stroke-dasharray\", \"stroke-dashoffset\", \"stroke-linecap\", \"stroke-linejoin\",\n \"stroke-miterlimit\", \"stroke-opacity\", \"stroke-width\", \"text-rendering\",\n \"baseline-shift\", \"dominant-baseline\", \"glyph-orientation-horizontal\",\n \"glyph-orientation-vertical\", \"text-anchor\", \"writing-mode\"\n ], propertyKeywords = keySet(propertyKeywords_);\n\n var nonStandardPropertyKeywords_ = [\n \"scrollbar-arrow-color\", \"scrollbar-base-color\", \"scrollbar-dark-shadow-color\",\n \"scrollbar-face-color\", \"scrollbar-highlight-color\", \"scrollbar-shadow-color\",\n \"scrollbar-3d-light-color\", \"scrollbar-track-color\", \"shape-inside\",\n \"searchfield-cancel-button\", \"searchfield-decoration\", \"searchfield-results-button\",\n \"searchfield-results-decoration\", \"zoom\"\n ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_);\n\n var colorKeywords_ = [\n \"aliceblue\", \"antiquewhite\", \"aqua\", \"aquamarine\", \"azure\", \"beige\",\n \"bisque\", \"black\", \"blanchedalmond\", \"blue\", \"blueviolet\", \"brown\",\n \"burlywood\", \"cadetblue\", \"chartreuse\", \"chocolate\", \"coral\", \"cornflowerblue\",\n \"cornsilk\", \"crimson\", \"cyan\", \"darkblue\", \"darkcyan\", \"darkgoldenrod\",\n \"darkgray\", \"darkgreen\", \"darkkhaki\", \"darkmagenta\", \"darkolivegreen\",\n \"darkorange\", \"darkorchid\", \"darkred\", \"darksalmon\", \"darkseagreen\",\n \"darkslateblue\", \"darkslategray\", \"darkturquoise\", \"darkviolet\",\n \"deeppink\", \"deepskyblue\", \"dimgray\", \"dodgerblue\", \"firebrick\",\n \"floralwhite\", \"forestgreen\", \"fuchsia\", \"gainsboro\", \"ghostwhite\",\n \"gold\", \"goldenrod\", \"gray\", \"grey\", \"green\", \"greenyellow\", \"honeydew\",\n \"hotpink\", \"indianred\", \"indigo\", \"ivory\", \"khaki\", \"lavender\",\n \"lavenderblush\", \"lawngreen\", \"lemonchiffon\", \"lightblue\", \"lightcoral\",\n \"lightcyan\", \"lightgoldenrodyellow\", \"lightgray\", \"lightgreen\", \"lightpink\",\n \"lightsalmon\", \"lightseagreen\", \"lightskyblue\", \"lightslategray\",\n \"lightsteelblue\", \"lightyellow\", \"lime\", \"limegreen\", \"linen\", \"magenta\",\n \"maroon\", \"mediumaquamarine\", \"mediumblue\", \"mediumorchid\", \"mediumpurple\",\n \"mediumseagreen\", \"mediumslateblue\", \"mediumspringgreen\", \"mediumturquoise\",\n \"mediumvioletred\", \"midnightblue\", \"mintcream\", \"mistyrose\", \"moccasin\",\n \"navajowhite\", \"navy\", \"oldlace\", \"olive\", \"olivedrab\", \"orange\", \"orangered\",\n \"orchid\", \"palegoldenrod\", \"palegreen\", \"paleturquoise\", \"palevioletred\",\n \"papayawhip\", \"peachpuff\", \"peru\", \"pink\", \"plum\", \"powderblue\",\n \"purple\", \"rebeccapurple\", \"red\", \"rosybrown\", \"royalblue\", \"saddlebrown\",\n \"salmon\", \"sandybrown\", \"seagreen\", \"seashell\", \"sienna\", \"silver\", \"skyblue\",\n \"slateblue\", \"slategray\", \"snow\", \"springgreen\", \"steelblue\", \"tan\",\n \"teal\", \"thistle\", \"tomato\", \"turquoise\", \"violet\", \"wheat\", \"white\",\n \"whitesmoke\", \"yellow\", \"yellowgreen\"\n ], colorKeywords = keySet(colorKeywords_);\n\n var valueKeywords_ = [\n \"above\", \"absolute\", \"activeborder\", \"activecaption\", \"afar\",\n \"after-white-space\", \"ahead\", \"alias\", \"all\", \"all-scroll\", \"alternate\",\n \"always\", \"amharic\", \"amharic-abegede\", \"antialiased\", \"appworkspace\",\n \"arabic-indic\", \"armenian\", \"asterisks\", \"auto\", \"avoid\", \"avoid-column\", \"avoid-page\",\n \"avoid-region\", \"background\", \"backwards\", \"baseline\", \"below\", \"bidi-override\", \"binary\",\n \"bengali\", \"blink\", \"block\", \"block-axis\", \"bold\", \"bolder\", \"border\", \"border-box\",\n \"both\", \"bottom\", \"break\", \"break-all\", \"break-word\", \"button\", \"button-bevel\",\n \"buttonface\", \"buttonhighlight\", \"buttonshadow\", \"buttontext\", \"cambodian\",\n \"capitalize\", \"caps-lock-indicator\", \"caption\", \"captiontext\", \"caret\",\n \"cell\", \"center\", \"checkbox\", \"circle\", \"cjk-earthly-branch\",\n \"cjk-heavenly-stem\", \"cjk-ideographic\", \"clear\", \"clip\", \"close-quote\",\n \"col-resize\", \"collapse\", \"column\", \"compact\", \"condensed\", \"contain\", \"content\",\n \"content-box\", \"context-menu\", \"continuous\", \"copy\", \"cover\", \"crop\",\n \"cross\", \"crosshair\", \"currentcolor\", \"cursive\", \"dashed\", \"decimal\",\n \"decimal-leading-zero\", \"default\", \"default-button\", \"destination-atop\",\n \"destination-in\", \"destination-out\", \"destination-over\", \"devanagari\",\n \"disc\", \"discard\", \"document\", \"dot-dash\", \"dot-dot-dash\", \"dotted\",\n \"double\", \"down\", \"e-resize\", \"ease\", \"ease-in\", \"ease-in-out\", \"ease-out\",\n \"element\", \"ellipse\", \"ellipsis\", \"embed\", \"end\", \"ethiopic\", \"ethiopic-abegede\",\n \"ethiopic-abegede-am-et\", \"ethiopic-abegede-gez\", \"ethiopic-abegede-ti-er\",\n \"ethiopic-abegede-ti-et\", \"ethiopic-halehame-aa-er\",\n \"ethiopic-halehame-aa-et\", \"ethiopic-halehame-am-et\",\n \"ethiopic-halehame-gez\", \"ethiopic-halehame-om-et\",\n \"ethiopic-halehame-sid-et\", \"ethiopic-halehame-so-et\",\n \"ethiopic-halehame-ti-er\", \"ethiopic-halehame-ti-et\",\n \"ethiopic-halehame-tig\", \"ew-resize\", \"expanded\", \"extra-condensed\",\n \"extra-expanded\", \"fantasy\", \"fast\", \"fill\", \"fixed\", \"flat\", \"footnotes\",\n \"forwards\", \"from\", \"geometricPrecision\", \"georgian\", \"graytext\", \"groove\",\n \"gujarati\", \"gurmukhi\", \"hand\", \"hangul\", \"hangul-consonant\", \"hebrew\",\n \"help\", \"hidden\", \"hide\", \"higher\", \"highlight\", \"highlighttext\",\n \"hiragana\", \"hiragana-iroha\", \"horizontal\", \"hsl\", \"hsla\", \"icon\", \"ignore\",\n \"inactiveborder\", \"inactivecaption\", \"inactivecaptiontext\", \"infinite\",\n \"infobackground\", \"infotext\", \"inherit\", \"initial\", \"inline\", \"inline-axis\",\n \"inline-block\", \"inline-table\", \"inset\", \"inside\", \"intrinsic\", \"invert\",\n \"italic\", \"justify\", \"kannada\", \"katakana\", \"katakana-iroha\", \"keep-all\", \"khmer\",\n \"landscape\", \"lao\", \"large\", \"larger\", \"left\", \"level\", \"lighter\",\n \"line-through\", \"linear\", \"lines\", \"list-item\", \"listbox\", \"listitem\",\n \"local\", \"logical\", \"loud\", \"lower\", \"lower-alpha\", \"lower-armenian\",\n \"lower-greek\", \"lower-hexadecimal\", \"lower-latin\", \"lower-norwegian\",\n \"lower-roman\", \"lowercase\", \"ltr\", \"malayalam\", \"match\",\n \"media-controls-background\", \"media-current-time-display\",\n \"media-fullscreen-button\", \"media-mute-button\", \"media-play-button\",\n \"media-return-to-realtime-button\", \"media-rewind-button\",\n \"media-seek-back-button\", \"media-seek-forward-button\", \"media-slider\",\n \"media-sliderthumb\", \"media-time-remaining-display\", \"media-volume-slider\",\n \"media-volume-slider-container\", \"media-volume-sliderthumb\", \"medium\",\n \"menu\", \"menulist\", \"menulist-button\", \"menulist-text\",\n \"menulist-textfield\", \"menutext\", \"message-box\", \"middle\", \"min-intrinsic\",\n \"mix\", \"mongolian\", \"monospace\", \"move\", \"multiple\", \"myanmar\", \"n-resize\",\n \"narrower\", \"ne-resize\", \"nesw-resize\", \"no-close-quote\", \"no-drop\",\n \"no-open-quote\", \"no-repeat\", \"none\", \"normal\", \"not-allowed\", \"nowrap\",\n \"ns-resize\", \"nw-resize\", \"nwse-resize\", \"oblique\", \"octal\", \"open-quote\",\n \"optimizeLegibility\", \"optimizeSpeed\", \"oriya\", \"oromo\", \"outset\",\n \"outside\", \"outside-shape\", \"overlay\", \"overline\", \"padding\", \"padding-box\",\n \"painted\", \"page\", \"paused\", \"persian\", \"plus-darker\", \"plus-lighter\", \"pointer\",\n \"polygon\", \"portrait\", \"pre\", \"pre-line\", \"pre-wrap\", \"preserve-3d\", \"progress\", \"push-button\",\n \"radio\", \"read-only\", \"read-write\", \"read-write-plaintext-only\", \"rectangle\", \"region\",\n \"relative\", \"repeat\", \"repeat-x\", \"repeat-y\", \"reset\", \"reverse\", \"rgb\", \"rgba\",\n \"ridge\", \"right\", \"round\", \"row-resize\", \"rtl\", \"run-in\", \"running\",\n \"s-resize\", \"sans-serif\", \"scroll\", \"scrollbar\", \"se-resize\", \"searchfield\",\n \"searchfield-cancel-button\", \"searchfield-decoration\",\n \"searchfield-results-button\", \"searchfield-results-decoration\",\n \"semi-condensed\", \"semi-expanded\", \"separate\", \"serif\", \"show\", \"sidama\",\n \"single\", \"skip-white-space\", \"slide\", \"slider-horizontal\",\n \"slider-vertical\", \"sliderthumb-horizontal\", \"sliderthumb-vertical\", \"slow\",\n \"small\", \"small-caps\", \"small-caption\", \"smaller\", \"solid\", \"somali\",\n \"source-atop\", \"source-in\", \"source-out\", \"source-over\", \"space\", \"square\",\n \"square-button\", \"start\", \"static\", \"status-bar\", \"stretch\", \"stroke\",\n \"sub\", \"subpixel-antialiased\", \"super\", \"sw-resize\", \"table\",\n \"table-caption\", \"table-cell\", \"table-column\", \"table-column-group\",\n \"table-footer-group\", \"table-header-group\", \"table-row\", \"table-row-group\",\n \"telugu\", \"text\", \"text-bottom\", \"text-top\", \"textarea\", \"textfield\", \"thai\",\n \"thick\", \"thin\", \"threeddarkshadow\", \"threedface\", \"threedhighlight\",\n \"threedlightshadow\", \"threedshadow\", \"tibetan\", \"tigre\", \"tigrinya-er\",\n \"tigrinya-er-abegede\", \"tigrinya-et\", \"tigrinya-et-abegede\", \"to\", \"top\",\n \"transparent\", \"ultra-condensed\", \"ultra-expanded\", \"underline\", \"up\",\n \"upper-alpha\", \"upper-armenian\", \"upper-greek\", \"upper-hexadecimal\",\n \"upper-latin\", \"upper-norwegian\", \"upper-roman\", \"uppercase\", \"urdu\", \"url\",\n \"vertical\", \"vertical-text\", \"visible\", \"visibleFill\", \"visiblePainted\",\n \"visibleStroke\", \"visual\", \"w-resize\", \"wait\", \"wave\", \"wider\",\n \"window\", \"windowframe\", \"windowtext\", \"x-large\", \"x-small\", \"xor\",\n \"xx-large\", \"xx-small\"\n ], valueKeywords = keySet(valueKeywords_);\n\n var fontProperties_ = [\n \"font-family\", \"src\", \"unicode-range\", \"font-variant\", \"font-feature-settings\",\n \"font-stretch\", \"font-weight\", \"font-style\"\n ], fontProperties = keySet(fontProperties_);\n\n var allWords = mediaTypes_.concat(mediaFeatures_).concat(propertyKeywords_)\n .concat(nonStandardPropertyKeywords_).concat(colorKeywords_).concat(valueKeywords_);\n CodeMirror.registerHelper(\"hintWords\", \"css\", allWords);\n\n function tokenCComment(stream, state) {\n var maybeEnd = false, ch;\n while ((ch = stream.next()) != null) {\n if (maybeEnd && ch == \"/\") {\n state.tokenize = null;\n break;\n }\n maybeEnd = (ch == \"*\");\n }\n return [\"comment\", \"comment\"];\n }\n\n function tokenSGMLComment(stream, state) {\n if (stream.skipTo(\"-->\")) {\n stream.match(\"-->\");\n state.tokenize = null;\n } else {\n stream.skipToEnd();\n }\n return [\"comment\", \"comment\"];\n }\n\n CodeMirror.defineMIME(\"text/css\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n tokenHooks: {\n \"<\": function(stream, state) {\n if (!stream.match(\"!--\")) return false;\n state.tokenize = tokenSGMLComment;\n return tokenSGMLComment(stream, state);\n },\n \"/\": function(stream, state) {\n if (!stream.eat(\"*\")) return false;\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n }\n },\n name: \"css\"\n });\n\n CodeMirror.defineMIME(\"text/x-scss\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \":\": function(stream) {\n if (stream.match(/\\s*\\{/))\n return [null, \"{\"];\n return false;\n },\n \"$\": function(stream) {\n stream.match(/^[\\w-]+/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"#\": function(stream) {\n if (!stream.eat(\"{\")) return false;\n return [null, \"interpolation\"];\n }\n },\n name: \"css\",\n helperType: \"scss\"\n });\n\n CodeMirror.defineMIME(\"text/x-less\", {\n mediaTypes: mediaTypes,\n mediaFeatures: mediaFeatures,\n propertyKeywords: propertyKeywords,\n nonStandardPropertyKeywords: nonStandardPropertyKeywords,\n colorKeywords: colorKeywords,\n valueKeywords: valueKeywords,\n fontProperties: fontProperties,\n allowNested: true,\n tokenHooks: {\n \"/\": function(stream, state) {\n if (stream.eat(\"/\")) {\n stream.skipToEnd();\n return [\"comment\", \"comment\"];\n } else if (stream.eat(\"*\")) {\n state.tokenize = tokenCComment;\n return tokenCComment(stream, state);\n } else {\n return [\"operator\", \"operator\"];\n }\n },\n \"@\": function(stream) {\n if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/, false)) return false;\n stream.eatWhile(/[\\w\\\\\\-]/);\n if (stream.match(/^\\s*:/, false))\n return [\"variable-2\", \"variable-definition\"];\n return [\"variable-2\", \"variable\"];\n },\n \"&\": function() {\n return [\"atom\", \"atom\"];\n }\n },\n name: \"css\",\n helperType: \"less\"\n });\n\n});\n","created":"20141003162651180","modified":"20141003162818850","type":"application/javascript","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js","text":"/*\\\ncreated: 20140927171850335\nmodified: 20141003155657361\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/packplugin.js\ntype: application/javascript\nmodule-type: command\n\nThe packplugin command packages source tiddlers (ordinary\ntiddlers) into a plugin tiddler:\n--packplugin \n\nPlease note that the plugin tiddler must be correctly set\nup in that it is of type \"application/json\" and also\nthe plugin-type is set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"packplugin\",\n\tsynchronous: true\n};\n\n\nvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\n\nvar Command = function(params, commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 1) {\n\t\treturn \"Missing plugin title\";\n\t}\n\tvar pluginTitle = this.params[0];\n\tvar filter = this.params[1];\n\n\t// Get the plug-in self-description tiddler. If it doesn't exist,\n\t// bail out as the plugin developer needs to provide a plugin tiddler\n\t// with the required self-description.\n\tthis.logger.log(\"making plugin:\", pluginTitle);\n\tthis.logger.log(\"using filter for packing:\", filter);\n\treturn thirdflow.packagePlugin($tw.wiki, pluginTitle, filter);\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927171850335","modified":"20141003155657361","type":"application/javascript","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js","text":"/*\\\ncreated: 20180217143029574\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releasedemowiki.js\ntags:\nmodified: 20180217143211351\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n name: \"releasedemowiki\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLER = \"$:/config/ThirdFlow/demowiki\";\nvar DEFAULT_DEMOWIKI_TEMPLATE = \"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources\";\n\n\n/* Creates a new command instance to release a demo wiki. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Releases this wiki as a plugin-demo wiki. */\nCommand.prototype.execute = function() {\n var self = this;\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var path = require(\"path\");\n var fs = require(\"fs\");\n\n var config = $tw.wiki.getTiddler(RELEASE_CONFIG_TIDDLER);\n if (!config) {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_DEMOWIKI_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping demowiki\");\n } else {\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing demowiki to:\", filename);\n var content = $tw.wiki.renderTiddler(\"text/plain\", template);\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n self.logger.alert(\"cannot create file directories\");\n return err;\n }\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n }\n }\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180217143029574","type":"application/javascript","tags":"","modified":"20180217143211351","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js","text":"/*\\\ncreated: 20180212171824929\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/releaseplugins.js\ntags:\nmodified: 20180212172043868\nmodule-type: command\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Exports our --releaseplugins command, which packages all plugins marked for\n * release in this wiki, and then writes them to the local filesystem.\n */\nexports.info = {\n name: \"releaseplugins\",\n synchronous: true\n};\n\n\nvar RELEASE_CONFIG_TIDDLERS_PREFIX = \"$:/config/ThirdFlow/plugins\";\nvar RELEASE_CONFIG_FILTER = \"[prefix[\" + RELEASE_CONFIG_TIDDLERS_PREFIX + \"/]]\";\nvar DEFAULT_TID_TEMPLATE = \"$:/core/templates/tid-tiddler\";\n\n\n/* Creates a new command instance. */\nvar Command = function(params, commander) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\n/* Executes our command. */\nCommand.prototype.execute = function() {\n var self = this;\n /* check your command parameters, which you will find in this.params */\n if (self.params.length) {\n self.logger.log(\"ignoring command parameter(s)\");\n }\n\n var thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n var path = require(\"path\");\n\n // Retrieve the release configuration tiddlers, then iterate over them\n // and package and render those plugins for which release is enabled.\n // Plugin-release config tiddler fields:\n // release: must be \"yes\" to trigger release, otherwise the release config\n // data gets ignored.\n // text: mandatory name of plugin file name.\n // template: optional title of a tempplate tiddler to be used for rendering\n // the plugin output file.\n var releaseConfigs = $tw.wiki.filterTiddlers(RELEASE_CONFIG_FILTER);\n self.logger.log(\"release config tiddlers found:\", releaseConfigs.length);\n $tw.utils.each(releaseConfigs, function(title) {\n var pluginTitle = title.substr(RELEASE_CONFIG_TIDDLERS_PREFIX.length + 1);\n var config = $tw.wiki.getTiddler(title);\n if (config) {\n var release = config.fields[\"release\"] || \"\";\n var releaseName = config.fields.text.replace(/\\r?\\n|\\r/g, \"\");\n var template = config.fields[\"template\"] || DEFAULT_TID_TEMPLATE;\n\n if (!releaseName || release !== \"yes\") {\n self.logger.log(\"!!! skipping:\", pluginTitle);\n } else {\n // (1) pack the plugin tiddler\n self.logger.log(\"packaging:\", pluginTitle);\n var err = thirdflow.packagePlugin($tw.wiki, pluginTitle);\n if (!err) {\n // (2) write the plugin tiddler\n var filename = path.resolve(self.commander.outputPath, releaseName);\n self.logger.log(\"writing to:\", filename);\n err = thirdflow.renderTiddlerWithTemplate(\n self.commander.wiki, pluginTitle, template, filename\n );\n if (err) {\n self.logger.alert(\"writing failed:\", err);\n return err;\n }\n } else {\n self.logger.alert(\"packaging failed:\", err);\n return err;\n }\n }\n }\n });\n\n return null; /* no error. */\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20180212171824929","type":"application/javascript","tags":"","modified":"20180212172043868","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js","text":"/*\\\ncreated: 20140927173011680\ntitle: $:/plugins/TheDiveO/ThirdFlow/commands/rendertemplatedtiddler.js\ntype: application/javascript\nmodified: 20140927173032181\nmodule-type: command\n\nCommand to render a single tiddler using a template.\n--rendertemplatedtiddler \n\nCommand to render a single tiddler using a template to a specific file.\nIn comparism to --rendertiddler this command variant accepts a template\nbut only works on a single tiddler. This allows us to avoid having specific\ntemplate tiddlers including the filter set.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nexports.info = {\n\tname: \"rendertemplatedtiddler\",\n\tsynchronous: true\n};\n\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n};\n\n\nCommand.prototype.execute = function() {\n\tif (this.params.length < 3) {\n\t\treturn \"Missing template or filename\";\n\t}\n\tvar thirdflow = require(\"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\");\n\tvar path = require(\"path\");\n\tvar title = this.params[0];\n\tvar template = this.params[1];\n\tvar filename = path.resolve(this.commander.outputPath, this.params[2]);\n\t// Save the tiddler as a self contained templated file\n thirdflow.renderTiddlerWithTemplate(\n\t\tthis.commander.wiki,\n\t\ttitle,\n\t\ttemplate,\n\t\tfilename\n\t);\n this.logger.log(\"rendered tiddler\", title, \"to\", filename);\n\treturn null; // done fine\n};\n\n\nexports.Command = Command;\n\n})();\n","created":"20140927173011680","type":"application/javascript","modified":"20140927173032181","module-type":"command"},"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/allfilterinfix","created":"20180203172801606","modified":"20180203172814315","tags":"","type":"text/vnd.tiddlywiki","text":"filters/all"},"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/commandinfix","created":"20180203170629108","modified":"20180203170648166","tags":"","type":"text/vnd.tiddlywiki","text":"commands"},"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/filterinfix","created":"20180203172725023","modified":"20180203172738692","tags":"","type":"text/vnd.tiddlywiki","text":"filters"},"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/isfilterinfix","created":"20180203172744547","modified":"20180203172757212","tags":"","type":"text/vnd.tiddlywiki","text":"filters/is"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jslibinfix","created":"20180203173603786","modified":"20180203173625412","tags":"","type":"text/vnd.tiddlywiki","text":"libs"},"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/jsmacroinfix","created":"20180203172945642","modified":"20180203172956320","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/parserinfix","created":"20180203172818867","modified":"20180203172921843","tags":"","type":"text/vnd.tiddlywiki","text":"parsers"},"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/startupinfix","created":"20180203173103664","modified":"20180203173117022","tags":"","type":"text/vnd.tiddlywiki","text":"startups"},"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/styleinfix","created":"20180203173153198","modified":"20180203173208873","tags":"","type":"text/vnd.tiddlywiki","text":"styles"},"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/templateinfix","created":"20180203173215242","modified":"20180203173234383","tags":"","type":"text/vnd.tiddlywiki","text":"templates"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twconfiginfix","created":"20180207102757523","modified":"20180211155919528","tags":"","type":"text/vnd.tiddlywiki","text":"config"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twglobalinfix","created":"20180207102840528","modified":"20180207102855322","tags":"","type":"text/vnd.tiddlywiki","text":"globals"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twmacroinfix","created":"20180203172853288","modified":"20180203172905835","tags":"","type":"text/vnd.tiddlywiki","text":"macros"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilinfix","created":"20180207102731921","modified":"20180207103054605","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/twutilnodeinfix","created":"20180207102537150","modified":"20180207102719509","tags":"","type":"text/vnd.tiddlywiki","text":"utils"},"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/uiinfix","created":"20180203173239752","modified":"20180203173248899","tags":"","type":"text/vnd.tiddlywiki","text":"ui"},"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/widgetinfix","created":"20180203173311648","modified":"20180203173326083","tags":"","type":"text/vnd.tiddlywiki","text":"widgets"},"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix":{"title":"$:/plugins/TheDiveO/ThirdFlow/defaults/wikiparserruleinfix","created":"20180203173001192","modified":"20180205162648345","tags":"","type":"text/vnd.tiddlywiki","text":"parsers/wikiparser/rules"},"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js","text":"/*\\\ncreated: 20140927173349128\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/is/shadowinsync.js\ntype: application/javascript\nmodified: 20140927173409192\nmodule-type: isfilteroperator\n\nFilter function for [is[shadowinsync]]\n a tiddler is shadowsynced when an ordinary tiddler also has\n a shadow tiddler *AND* the shadow tiddler is the same as the\n real tiddler. This is decided on the basis of type, and the\n creation and modification dates.\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.shadowinsync = function(source,prefix,options) {\n\tvar results = [];\n\tvar invert = prefix === \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar match = invert;\n\t\tvar pluginTitle = options.wiki.getShadowSource(title);\n\t\tif(pluginTitle) {\n\t\t\tvar pluginInfo = options.wiki.getPluginInfo(pluginTitle),\n\t\t\t\tshadow = pluginInfo.tiddlers[title];\n\t\t\tif ( (tiddler.fields.type == shadow.type)\n\t\t\t && (tiddler.getFieldString(\"created\") === shadow.created)\n\t\t\t\t && (tiddler.getFieldString(\"modified\") === shadow.modified) ) {\n\t\t\t\tmatch = !match;\n\t\t\t}\n\t\t}\n\t\tif ( match ) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n","created":"20140927173349128","type":"application/javascript","modified":"20140927173409192","module-type":"isfilteroperator"},"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js","text":"/*\\\ncreated: 20141117182000659\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/filters/titlecomponents.js\nmodified: 20180217161013611\nmodule-type: filteroperator\n\nFilter operator for splitting a title containing slashes as separators\ninto its components.\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.titlecomponents = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n var components = title.split(\"/\");\n var idx;\n var l = components.length;\n for ( idx = 0; idx < l; idx++ ) {\n results.push(components[idx]);\n }\n\t});\n\treturn results;\n};\n\n})();\n","created":"20141117182000659","type":"application/javascript","modified":"20180217161013611","module-type":"filteroperator"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/autosubfolders.js\ntype: application/javascript\npriority: 0\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/enableautomaticsubfolders\";\nvar automaticSubfoldersEnabled;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tautomaticSubfoldersEnabled = $tw.wiki.getTiddlerText(configTiddler, \"yes\") === \"yes\";\n\tthis.logger.log(\"folder policy config: default: hierarchical subfolders are \" + (automaticSubfoldersEnabled ? \"enabled\" : \"disabled\"));\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(!options.draft && automaticSubfoldersEnabled) {\n\t\toptions.subfolder = this.subfoldersFromTitle(title);\n\t\toptions.name = this.leafFromTitle(title);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"0"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js","text":"/*\\\ncreated: 20141012162041927\nmodified: 20141012163305588\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/draft.js\ntype: application/javascript\npriority: 200\n\nThis folder usher places draft tiddlers flat into their own separate drafts folder.\nThe exact name of the drafts folder is configurable.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/draftfoldername\";\nvar draftFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tdraftFolderName = $tw.wiki.getTiddlerText(configTiddler, \"drafts\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: draft: draft subfolder is: \" + draftFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif(options.draft) {\n\t\toptions.subfolder = draftFolderName;\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n})();\n","created":"20141012162041927","modified":"20141012163305588","module-type":"folderpolicy","type":"application/javascript","priority":"200"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/system.js\ntype: application/javascript\npriority: 100\n\nThis folder usher handles system tiddlers and places them into their\nown separate system folder and then into hierarchical subfolders according\nto their title. The exact name of the system folder is configurable.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddler = \"$:/config/FileStorage/systemfoldername\";\nvar systemFolderName;\n\n// The configuration tiddler to monitor for changes\nexports.watch = \"[field:title[\" + configTiddler + \"]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tsystemFolderName = $tw.wiki.getTiddlerText(configTiddler, \"system\").replace(new RegExp(\"\\r?\\n\", \"mg\"), \"\");\n\tthis.logger.log(\"folder policy config: system: system subfolder is: \" + systemFolderName);\n};\n\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft && title.substr(0, 3) === \"$:/\") {\n\t\tvar posTitle = title.lastIndexOf(\"/\");\n\t\toptions.subfolder = systemFolderName + title.substr(2, posTitle - 2);\n\t\toptions.name = title.substr(posTitle + 1);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"100"},"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js","text":"/*\\\ncreated: 20141012162151347\nmodified: 20141012163255922\nmodule-type: folderpolicy\ntitle: $:/plugins/TheDiveO/ThirdFlow/folderpolicies/tag.js\ntype: application/javascript\npriority: 50\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar configTiddlerBase = \"$:/config/FileStorage/tagfolders\";\nvar tagFolders;\nvar tagList;\n\n// The configuration tiddlers to monitor for changes\nexports.watch = \"[field:title[\" + configTiddlerBase + \"]] [prefix[\" + configTiddlerBase + \"/]]\";\n\n// We get notified when our configuration tiddler was changed. Please\n// note that title is undefined during inital configuration call.\nexports.reconfig = function() {\n\tvar self = this;\n \n var cfgTiddler = $tw.wiki.getTiddler(configTiddlerBase);\n tagList = $tw.utils.parseStringArray((cfgTiddler && cfgTiddler.fields.list) || \"\");\n var cfgTags = $tw.wiki.filterTiddlers(\"[prefix[\" + configTiddlerBase + \"/]]\");\n tagFolders = {};\n \n $tw.utils.each(tagList, function(tag) {\n tagFolders[tag] = {folderName: \"\", folderMode: \"flat\"};\n });\n $tw.utils.each(cfgTags, function(tagCfg) {\n var tiddler = $tw.wiki.getTiddler(tagCfg);\n var tag = tiddler.fields[\"tag-name\"];\n var folderName = tiddler.fields[\"folder-name\"] || \"\";\n var folderMode = tiddler.fields[\"folder-mode\"] || \"flat\";\n self.logger.log(\"folder policy config: tag: for:\", \"\\\"\" + tag + \"\\\"\", \"folder:\", \"\\\"\" + folderName + \"\\\"\", \"mode:\", folderMode);\n if(tag && tagFolders[tag]) {\n tagFolders[tag].folderName = folderName;\n tagFolders[tag].folderMode = folderMode;\n }\n });\n};\n\n// We are asked to apply our folder policy...\nexports.folderpolicy = function(title, options) {\n\tif( !options.draft ) {\n\t\tvar tags = options.tiddler.fields.tags;\n\t\tif ($tw.utils.isArray(tags)) {\n\t\t\tthis.logger.log(\"Tags: \"+tags.toString());\n for (var t=0; t= 0) {\n var info = tagFolders[tagList[t]];\n var subfolder = info.folderName;\n if(info.folderMode !== \"flat\") {\n options.subfolder = subfolder + \"/\" + this.subfoldersFromTitle(title);\n options.name = this.leafFromTitle(title);\n } else {\n options.subfolder = subfolder;\n options.title = title;\n }\n return true;\n }\n }\n\t\t}\n\t}\n\treturn false;\n};\n\t\n})();\n","created":"20141012162151347","modified":"20141012163255922","module-type":"folderpolicy","type":"application/javascript","priority":"50"},"$:/plugins/TheDiveO/ThirdFlow/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/history","created":"20140902083720188","modified":"20180311173125103","type":"text/vnd.tiddlywiki","text":"* ''1.2.3''\n** makes ThirdFlow plugin available as npm package `tw5-thirdflow`.\n** the development wiki now opens the \"Plugin Sources\" sidebar tab by default; this can be changed in the Control Panel \"Settings\" tab. Please note that TiddlyWiki 5.1.16+ will have this feature anyway.\n\n* ''1.2.2''\n** supports showing the \"Plugin Sources\" tab within the More sidebar tab at start for ~TiddlyWiki 5.1.16+.\n\n* ''1.2.1''\n** fixes new plugin template so its text content is of (mime) type `application/json`.\n** fixes error reporting in `--releaseplugins` and `--releasedemowiki`.\n\n* ''1.2.0''\n** brings a new automated release mechanism for plugins and plugin-demo wikis that simplifies maintaining what is to be released. The new system especially makes releasing multiple different plugins from the same development wiki much easier -- because there is no more need to tweak the release `tiddlywiki.info` configuration (however, this old release mechanism is still available).\n*** new \"''Release''\" tab in control panel, which configures which plugin(s) to release under which name, as well as whether to additionally release a plugin-demo wiki.\n*** new commands `--releaseplugins` and `--releasedemowiki` which use the configuration set from the control panel to package your plugins, write them to files, as well as writing the plugin-demo wiki (when enabled in configuration).\n*** upgrades `release/tiddlywiki.info` to use the new automated release mechanism, so plugin developers don't need to edit this file anymore in the future. To upgrade an existing plugin development wiki, simply upgrade your local `release/tiddlywiki.info` with this new one: [[editions/release/tiddlywiki.info]].\n*** upgrades skeleton `release/tiddlywiki.info` to also use the new automated release mechanism.\n*** refactors internal Javascript code.\n** removes released(!) plugins from the \"Plugin Sources\" view, as well as from the \"Releases\" tab in the Control Panel. This keeps the display cleaner, avoiding confusion.\n\n* ''1.1.1''\n** fixes plugin tiddler templates incorrectly setting `moduleType` instead of `module-type`.\n\n* ''1.1.0''\n** fixes //Plugin Sources// sidebar tab previously not sorting plugins alphabetically.\n** now shows number of tiddlers inside a plugin next to the plugin publisher/name.\n** adds a new <$button class=<> >{{$:/core/images/down-arrow}}$button> popup menu to each plugin listed in the //Plugin Sources// sidebar tab. This menu offers to create new tiddlers inside a plugin, from an assortion of type-specific templates. Templates included cover new Javascript macro modules, filter modules, and many more.\n** shows \"add plugin boilerplate tiddlers\" for empty plugins; clicking it opens the standard `readme`, `license` and `history` tiddlers ready for editing. Additionally, these three tiddlers get added to the plugin tiddlers `list` field.\n** adds a new //~ThirdFlow// tab to the control panel. This tab allows developers to configure the places inside plugins where they want to add new tiddlers of a certain type (such as macro modules, filter modules, et cetera).\n** now shows more plugin meta data than before when //viewing// a plugin tiddler:\n*** `core-version` dependency field,\n*** `plugin-priority` field controlling the order of unpacking (where plugin tiddlers \"explode\" into their shadow tiddlers).\n** adds a new //edit// template to edit plugin meta data:\n*** the edit template shows the same plugin meta data as the plugin //view// template, but additionally allows //editing// most fields.\n*** two plugin meta data elements cannot be edited: the plugin publisher and plugin name elements, as these are derived from the plugin title.\n** removes (annoying) wikilink-ification when displaying or editing plugin meta data.\n\n* ''1.0.14''\n** adds npm package and (development) script support.\n** after cloning the ThirdFlow repository, first run `npm install tiddlywiki` inside the project directory.\n*** `npm run develop` starts the development TiddlyWiki server. Use Ctrl-C to stop the server.\n*** `npm run release` creates the release files.\n*** `nmp start` starts the development TiddlyWiki server. Use `npm stop` to stop it.\n\n* ''1.0.13''\n** fixes a bug in the hierarchical filesystem sync adapter related to evaluation of the `disable-hfs` configuration option.\n\n* ''1.0.12''\n** minor internal optimization: in filter expressions use `[all[current]]` instead of `[is[current]]`.\n\n* ''1.0.11''\n** fixes the import tiddler activating the plugin view template when it shouldn't.\n\n* ''1.0.10''\n** the <> plugin is not dead yet.\n** fixes `HierarchicalFileSystemAdaptor` to make it work with recent TW5 releases: adds missing `isReady()` method that was introduced some time ago to TW sync adaptors.\n** fixes `editions/develop/tiddlywiki.info` to load the -- now required -- `tiddlywiki/filesystem` plugin.\n** supports node-webkit; thanks to Eucaly for this fix.\n** fixes handling of filetypes not defined in `$tw.config.typeTemplates`; again, thanks to Eucaly for this fix.\n** updated documentation to properly reflect the correct configuration required with recent TiddlyWiki 5 releases.\n** minor textual tweaks.\n\n* ''1.0.9''\n** upgraded the tag-based folder storage user interface to use the new core tag-pill template ([[$:/core/ui/TagTemplate]]).\n\n* ''1.0.8'' -- fixes and usability improvements.\n** fixed broken handling of Javascript tiddlers when creating them: they are now correctly created as .js files. Also corrected file name handling to avoid duplicated file endings in case the title already contains the extension (as it is custom for Javascript tiddlers).\n** added \"new plugin source tiddler here\" to the \"plugin sources\" sidebar tab.\n** added new plugin view template part: it shows the meta information associated with the plugin and is shown before the core's stock plugin view template that (only) lists the contents of a plugin.\n\n* ''1.0.7'' -- minor fix release and core upgrade.\n** fixed the add tag button not working.\n** upgraded the release demo wiki core to 5.1.3.\n\n* ''1.0.6'' -- improved tag-based folders release.\n** the tags configured for organizing tiddler storage into folders now have a well-defined natural order. Tags earlier in the tag list take precedence over later ones. The new UI makes setting precedence easy, please see the next item.\n** revamped UI for configuring tag-based folders. The new UI allows tags to be sorted earlier in the list so that those earlier tags take precedence over latter tags.\n\n* ''1.0.5'' -- lots of new stuff release.\n** a new \"Plugin Sources\" UI in the sidebar under the \"More\" tab. Lists only plugins and their original source code tiddlers.\n** an enhanced file system sync adaptor that is now configurable through its own control panel UI extension, under the new tab [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]].\n*** configure the folder names for system tiddlers and drafts.\n*** organize your tiddlers neatly into their own subfolders based on tags. Unfortunately, tag priority cannot be controlled at this time.\n** more editing and highlight support.\n*** towards a (mostly) unified syntax highlighting in both static rendering as well as when editing tiddlers.\n*** added more codemirror features: current line highlighting, CSS syntax support.\n*** added support for TW5's native ~JavaScript storage format when creating ~JavaScript tiddlers directly inside ~TiddlyWiki 5. Tiddler meta-data gets correctly inserted into a (special) comment section.\n* ''1.0.4'' -- fix and more documentation.\n** fixed a typo in the (empty) source plugin tiddler itself which caused hiccups in ~TiddlyWiki's control panel plugin tab.\n** added more background information about plugins, modules, and the crazy stuff the <> plugin is made of.\n\n* ''1.0.3'' -- upgraded to work with the final ~TiddlyWiki 5.1.x releases.\n** fixed using deprecated regular expression when packing plugin tiddlers.\n\n* ''1.0.2'' -- fix and polishing release.\n** fixes a problem in the hierarchical filesystem sync adaptor that previously caused server aborts when adding JPEG tiddlers. The sync adaptor now defaults to the \"~~binary~~base64\" encoding whenever a meta file is required.\n** added two illustrations to the demo documentation showing the develop and release phases.\n** further minor documentation fixes and improvements.\n\n* ''1.0.1'' -- fix and polishing release.\n** fixes an issue where the user plugin demonstration wikis contained still the plugin source in addition to the plugin itself.\n** included polishing documentation from pmario (thanks!).\n\n* ''1.0.0'' -- this marks the first public release of the <> plugin. Of course, the <> eats its own dog food: this plugin has been developed with itself. Sweet, isn't it?\n** the ``--makeplugin`` command for creating plugins in headless TW5 instances running under Node.js.\n** the ``hierarchicalfilesystemadaptor`` sync adapter that stores tiddlers according to their hierarchical names into folders and subfolders.\n"},"$:/plugins/TheDiveO/ThirdFlow/icon":{"title":"$:/plugins/TheDiveO/ThirdFlow/icon","created":"20140902083115519","modified":"20140902083155746","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/down-arrow-filled","created":"20141018212934861","modified":"20141018213600106","type":"text/vnd.tiddlywiki","text":"\n"},"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled":{"title":"$:/plugins/TheDiveO/ThirdFlow/images/up-arrow-filled","created":"20141018213823637","modified":"20141018213933115","type":"text/vnd.tiddlywiki","text":"\n"},"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js","text":"/*\\\ncreated: 20180212163414709\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/libs/thirdflow.js\nmodified: 20180212163710081\ntags:\nmodule-type: library\n\nA library of (reusable) ThirdFlow plugin tiddler functions. These\nfunctions can be used, for instance, through TW server commands.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\n/* Good Stuff(tm) we need */\nif ($tw.node) {\n var fs = require(\"fs\");\n var path = require(\"path\");\n}\n\n\n/* Packages a plugin tiddler from its constituent individual tiddlers that exist\n * inside the title sub-namespace of the plugin tiddler.\n *\n * Parameters:\n * wiki: TW instance.\n * pluginTitle: the plugin tiddler to be packed; this must be a valid\n * plugin tiddler which has its plugin-type correctly set, as well\n * as a type of \"application/json\".\n * filterExpression: optional TW filter expression to be used to decide\n * which tiddlers need to be packed into the plugin. If left unspecified,\n * it defaults to all sub-tiddlers of the plugin title.\n *\n * Result:\n * returns undefined when the plugin tiddler specified in pluginTitle has\n * been packed without issues. Otherwise, an error string is returned,\n * detailing what went wrong.\n */\nexports.packagePlugin = function(wiki, pluginTitle, filterExpression) {\n // Prepare input parameters...\n if (pluginTitle.substr(-1) === \"/\") {\n pluginTitle = pluginTitle.substr(0, pluginTitle.length - 1);\n }\n filterExpression = filterExpression\n || \"[all[tiddlers]prefix[\" + pluginTitle + \"/]]\";\n // Plugin tiddler sanity checks...\n var pluginTiddler = wiki.getTiddler(pluginTitle);\n\tif (!pluginTiddler) {\n\t\treturn \"missing plugin tiddler: \" + pluginTitle;\n\t}\n\tif (pluginTiddler.fields.type !== \"application/json\"\n || !pluginTiddler.hasField(\"plugin-type\")) {\n\t\treturn \"not a plugin (skeleton) tiddler: \" + pluginTitle;\n\t}\n\t// Update the plugin content to contain all the tiddlers that match\n\t// the filter expression.\n\tvar filteredTiddlers = wiki.filterTiddlers(filterExpression);\n\tvar pluginTiddlers = {};\n\t$tw.utils.each(filteredTiddlers, function(title) {\n\t\tvar tiddler = wiki.getTiddler(title);\n\t\tvar fields = {};\n\t\t$tw.utils.each(tiddler.fields, function(value, fieldname) {\n\t\t\tfields[fieldname] = tiddler.getFieldString(fieldname);\n\t\t});\n\t\tpluginTiddlers[title] = fields;\n\t});\n\tvar plugin = new $tw.Tiddler(\n pluginTiddler,\n {\n \"text\": JSON.stringify({ \"tiddlers\": pluginTiddlers })\n });\n\twiki.addTiddler(plugin);\n\t// We need to update the plugin info that TW had built up during boot...\n\twiki.readPluginInfo();\n\t// ...and we need to re-unpack the plugins into their shadow tiddlers in\n\t// order to make [is[shadow]] work correctly. Yes, that causes the plugin\n // tiddlers to exist two times: the original source tiddler, as well as\n // a corresponding shadow tiddler. However, this is just during release,\n // but never in a development wiki nor in a user wiki deploying this plugin.\n\twiki.unpackPluginTiddlers();\n return;\n};\n\n\n/* Renders a single tiddler using a template to a file. Please note that\n * this function automatically creates the required subdirectories needed\n * to contain the output file.\n *\n * Parameters:\n * wiki: TW instance.\n * title: the tiddler to be rendered.\n * template: the title of the template to be used for rendering.\n * filename: the output filename to which the tiddler gets rendered.\n *\n * Result:\n * returns undefined when the rendering and writing process finished\n * successfully. Otherwise, an error string is returned, detailing what\n * went wrong.\n */\nexports.renderTiddlerWithTemplate = function(wiki, title, template, filename) {\n var err = $tw.utils.createFileDirectories(filename);\n if (typeof err === \"string\") {\n return err;\n }\n var content = wiki.renderTiddler(\n \"text/plain\", template, { variables: { currentTiddler: title } });\n fs.writeFileSync(filename, content, { encoding: \"utf8\" });\n return;\n};\n\n\n})();\n","created":"20180212163414709","type":"application/javascript","modified":"20180212163710081","tags":"","module-type":"library"},"$:/plugins/TheDiveO/ThirdFlow/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/license","created":"20140902084022063","modified":"20140902090843205","type":"text/vnd.tiddlywiki","text":"The //Third Flow// plugin is covered by the following licenses:\n\n* The ''Third Flow plugin'' is licensed under the [[MIT license|http://opensource.org/licenses/MIT]].\n* The ''hierarchical file system adapter'' is licensed under the [[TiddlyWiki 5 license|https://raw.githubusercontent.com/Jermolene/TiddlyWiki5/master/licenses/copyright.md]] (links to ~GitHub TW5 repository). It bases on ``plugins/tiddlywiki/filesystem/filesystemadaptor.js`` and brings in storing tiddlers into hierarchical folder structures according to their titles.\n* Other content of this ~TiddlyWiki which is not part of the plugin or ~TiddlyWiki 5 is covered by the [[CC BY 3.0|http://creativecommons.org/licenses/by/3.0/]] license."},"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/ConfigLocations","created":"20180203171654847","modified":"20180205195031010","tags":"$:/tags/Macro","type":"text/vnd.tiddlywiki","text":"\\define tf-config-base() $:/config/ThirdFlow/\n\n\\define tf-config-base-default() $:/plugins/TheDiveO/ThirdFlow/defaults/\n"},"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/hashify.js","text":"/*\\\ncreated: 20141020111828333\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/hashify.js\ntype: application/javascript\nmodified: 20141020111837899\nmodule-type: macro\n\nMacro to hash a tiddler title into a (mostly) unique number.\nThis avoids problems when using titles (from tags, et cetera)\nas path elements of a system tiddler title.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"hashify\";\n\nexports.params = [\n\t{name: \"title\"},\n {name: \"prefix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title,prefix) {\n\treturn (prefix || \"\") + $tw.utils.hashString(title);\n};\n\n})();\n","created":"20141020111828333","type":"application/javascript","modified":"20141020111837899","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js","text":"/*\\\ncreated: 20141020111845057\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/sanitizedfoldername.js\ntype: application/javascript\nmodified: 20141020111852925\nmodule-type: macro\n\nMacro to sanitize a tiddler title for use as, e.g. a folder name.\nAlso converts the title to lowercase.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"sanitizedfoldername\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title.replace(/\\<|\\>|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\").toLowerCase();\n};\n\n})();\n","created":"20141020111845057","type":"application/javascript","modified":"20141020111852925","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js","text":"/*\\\ncreated: 20180203193341374\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/macros/typedplugintiddlertitle.js\nmodified: 20180205195741652\nmodule-type: macro\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"typedplugintiddlertitle\";\n\nexports.params = [\n { name: \"pluginroot\" }, /* such as: \"$:/plugins/publisher/plugin\" */\n { name: \"configtiddler\" }, /* title of config infix tiddler (may be missing) */\n { name: \"defaulttiddler\" }, /* title of default infix tiddler (may be missing too, but should not ;) */\n { name: \"title\" } /* title (suffix) */\n];\n\nexports.run = function(pluginroot, configtiddler, defaulttiddler, title) {\n /* Start with the plugin root part, and add a trailing slash, if not already given */\n var t = pluginroot;\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* Either add a configured infix, or a default infix; handle \"\" config correctly. */\n var cfgtiddler = this.wiki.getTiddler(configtiddler);\n if (cfgtiddler) {\n t += cfgtiddler.fields.text; /* \"\" will be just fine! */\n } else {\n var deftiddler = this.wiki.getTiddler(defaulttiddler);\n if (deftiddler) {\n t += deftiddler.fields.text;\n }\n }\n if (t.length && t.substr(-1) !== \"/\") {\n t += \"/\";\n }\n\n /* End with the (suffix) title element. */\n t += title;\n \n /* Grmpf: ensure that the full title returned is unique. */\n return this.wiki.generateNewTitle(t);\n};\n\n})();","created":"20180203193341374","type":"application/javascript","modified":"20180205195741652","module-type":"macro"},"$:/plugins/TheDiveO/ThirdFlow/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/readme","created":"20140902083641711","modified":"20141020083728826","type":"text/vnd.tiddlywiki","text":"Use the //Third Flow// plugin in your Node.js-based ~TiddlyWikis to develop your customization plugins inside ~TiddlyWiki but with support for well-structured source code repository layouts.\n\nThe //Third Flow// plugin supports your plugin development in that it organizes all your tiddler source files into a clear hierarchical folder structure based on tiddler titles. An additional plugin creation command module makes it easy to create the package plugin itself as well as a demonstration ~TiddlyWiki without the hassle of having to maintain separate and even multiple ``tiddlers/`` and ``plugin/`` folders. Also, the //Third Flow// relieves you from shuffling tiddler source code files around in your source code repository.\n\nThere's only a ''single'' tiddler source code tree and it is synchronized to your tiddler's title-based structure. Thus, no more need for external editing sessions and source file shuffling.\n\nSimply install this plugin into your ~TiddlyWiki in which you are developing your customizations. For more information, please go to the [[Third Flow project website|http://thediveo.github.io/ThirdFlow]].\n\nYou can use the new [[File Storage|$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage]] control panel tab to configure how your tiddlers get organized into folders and subfolders in your source code repository.\n\nEnjoy the //Third Flow//!"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/ControlPanel","created":"20180203155550006","modified":"20180203163400275","tags":"$:/tags/Stylesheet","type":"text/css","text":".tfc-infix-setting {\n width: 100%;\n display: flex;\n align-items: center;\n}\n\n.tfc-infix-setting-prefix {\n opacity: 0.5;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginEditView","created":"20180202130047517","modified":"20180217165529786","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"td.tfc-plugin-edit-element-value {\n text-align: left;\n vertical-align: baseline;\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input {\n width: 100%;\n}\n\ntd.tfc-plugin-edit-element-value input[type=checkbox] {\n width: auto;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/ThirdFlow/PluginView","created":"20141025152245526","modified":"20180205183442633","tags":"$:/tags/Stylesheet","type":"text/vnd.tiddlywiki","text":"tr.tfc-plugin-info-element td {\n padding-top: 0.4ex;\n padding-bottom: 0.4ex;\n white-space: nowrap;\n vertical-align: baseline;\n}\n\ntd.tfc-plugin-info-element-name {\n text-align: right;\n vertical-align: baseline;\n background-color: <>;\n font-weight: bold;\n}\n\ntd.tfc-plugin-info-element-value {\n text-align: left;\n vertical-align: top;\n}\n\nspan.tfc-plugin-info-unspecified {\n font-style: italic;\n color: <>;\n}\n\nspan.tfc-plugin-info-unspecified:before {\n font-style: normal;\n content: \"(\";\n}\n\nspan.tfc-plugin-info-unspecified:after {\n font-style: normal;\n content: \")\";\n padding-left: 0.15em;\n}"},"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/codemirror/tw5","created":"20141003153100991","modified":"20141003164807749","tags":"$:/tags/Stylesheet","type":"text/css","text":"/* This CodeMirror stylesheet implements a TW5-compatible syntax coloring theme */\n\n.cm-s-tw5 span.cm-meta {color: #FF1717;}\n.cm-s-tw5 span.cm-keyword { line-height: 1em; font-weight: bold; color: #333; }\n.cm-s-tw5 span.cm-atom {color: #219;}\n.cm-s-tw5 span.cm-number {color: #008080;}\n.cm-s-tw5 span.cm-def {color: #00f;}\n.cm-s-tw5 span.cm-variable {color: black;}\n.cm-s-tw5 span.cm-variable-2 {color: #0000C0;}\n.cm-s-tw5 span.cm-variable-3 {color: #0000C0;}\n.cm-s-tw5 span.cm-property {color: #065252;}\n.cm-s-tw5 span.cm-operator {color: black;}\n.cm-s-tw5 span.cm-comment {color: #998;}\n.cm-s-tw5 span.cm-string {color: #2A00FF;}\n.cm-s-tw5 span.cm-string-2 {color: #f50;}\n.cm-s-tw5 span.cm-qualifier {color: #555;}\n.cm-s-tw5 span.cm-builtin {color: #30a;}\n.cm-s-tw5 span.cm-bracket {color: #cc7;}\n.cm-s-tw5 span.cm-tag {color: #000080; font-weight: bold;}\n.cm-s-tw5 span.cm-attribute {color: #00c;}\n.cm-s-tw5 span.cm-link {color: #219;}\n.cm-s-tw5 span.cm-error {color: #f00;}\n\n.cm-s-tw5 span.cm-underlined { text-decoration: underline; }\n.cm-s-tw5 span.cm-strikethrough { text-decoration: line-through; }\n.cm-s-tw5 span.cm-brace { color: #170; font-weight: bold; }\n.cm-s-tw5 span.cm-table { color: blue; font-weight: bold; }\n\n.cm-s-tw5 .CodeMirror-activeline-background {background: #F0F3F7 !important;}\n.cm-s-tw5 .CodeMirror-matchingbracket {outline:1px solid #c00; color:black !important;}\n"},"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5":{"title":"$:/plugins/TheDiveO/ThirdFlow/styles/highlight/tw5","created":"20141003155429576","modified":"20141003164730907","tags":"$:/tags/Stylesheet","type":"text/css","text":"/*\n\ngithub.com style (c) Vasily Polovnyov \n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #333;\n background: #f8f8f8;\n -webkit-text-size-adjust: none;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n color: #998;\n font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n color: #333;\n font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n color: #008080;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.hljs-dartdoc,\n.tex .hljs-formula {\n color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.scss .hljs-preprocessor {\n color: #900;\n font-weight: bold;\n}\n\n.javascript .hljs-title,\n.hljs-list .hljs-keyword,\n.hljs-subst {\n font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n color: #458;\n font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n color: #000080;\n font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n color: #065252;\n}\n\n.hljs-regexp {\n color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.clojure .hljs-keyword,\n.scheme .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n color: #990073;\n}\n\n.hljs-built_in {\n color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n color: #999;\n font-weight: bold;\n}\n\n.hljs-deletion {\n background: #fdd;\n}\n\n.hljs-addition {\n background: #dfd;\n}\n\n.diff .hljs-change {\n background: #0086b3;\n}\n\n.hljs-chunk {\n color: #aaa;\n}\n"},"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js","text":"/*\\\ncreated: 20141015190317579\ntitle: $:/plugins/TheDiveO/ThirdFlow/syncadapters/hierarchicalfilesystemadaptor.js\ntype: application/javascript\nmodified: 20141015190324904\nmodule-type: syncadaptor\n\nA sync adaptor module for synchronising with the local filesystem via node.js APIs\n...in contrast to filesystemadaptor.js this variant understands forward slashes \"/\"\nin tiddler titles and stores tiddlers appropriately in the file system by mapping\nthe hierarchy in the title to a (sub) directory structure.\n\nIn addition, this sync adaptor understands the concept of system tiddlers (starting\ntheir titles with \"$:/\") and stores them inside a \"special\" system branch.\n\nMoreover, this sync adaptor also understands the concept of draft tiddlers (based\non the presence of the \"draft.of\" field) and stores all draft tiddlers in a flat\nsingle \"drafts\" folder. The makes cleanup and (git) repository syncing easier to do.\n\nIn order to realize good modularity and to allow this sync adaptor to be enhanced\nat any time later in an easy manner, it supports so-called folder policy modules.\nThese are module tiddlers with a module-type of \"folderpolicy\". Folder policy modules\nneed to export a method named \"folderpolicy\". In addition, folder policy modules\ncan be assigned a priority value. Normally, the priority of a folder policy should\nbe between 199 and 1, inclusively. Priority 200 is currently used for the draft\ntiddler policy. Priority 0 is assigned to the default policy.\n\nThe code for this sync adaptor comes from filesystemadaptor.js and has been enhanced\nto support hierarchical tiddler storage as well as folder policies.\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 and path tools;\n// support node.js and nodejs-webkit\nvar fs = $tw.node ? require(\"fs\") : null,\n\tpath = $tw.node ? require(\"path\") : null;\n\nfunction HierarchicalFileSystemAdaptor(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.logger = new $tw.utils.Logger(\"HierarchicalFileSystem\");\n\t// Create the /tiddlers folder if it doesn't exist\n\t$tw.utils.createDirectory($tw.boot.wikiTiddlersPath);\n\t\n\tthis.config = {\n\t\tdisabled: false\n\t};\n\t\n\t// retrieve all folder policy modules and sort them according\n\t// to their priority, with higher priority values sorted towards\n\t// the beginning of our folder policy modules list. Policy modules\n\t// more to the beginning are getting an earlier chance of applying\n\t// their policy.\n\tvar fpModules = [];\n\tvar fpcWatching = [];\n\t$tw.modules.forEachModuleOfType(\"folderpolicy\", function(title, exports) {\n\t\t// prepare folder policy information for later sorting and calling\n\t\tfpModules.push({\n\t\t\ttitle: title, // just for logging\n\t\t\tpriority: options.wiki.getTiddler(title).fields.priority || 100,\n\t\t\tpolicy: exports.folderpolicy || function() { return false; }\n\t\t});\n\t\t// get the information to monitor for configuration changes\n\t\tif ( exports.watch && exports.reconfig ) {\n\t\t\tfpcWatching.push({\n\t\t\t\tfilter: self.wiki.compileFilter(exports.watch),\n\t\t\t\treconfig: exports.reconfig\n\t\t\t});\n\t\t}\n\t\t// initial configuration call\n\t\tif ( exports.reconfig ) {\n\t\t\texports.reconfig.call(self);\n\t\t}\n\t});\n\tthis.fpcWatching = fpcWatching;\n\tfpModules.sort(function(policyA, policyB) {\n\t\treturn policyB.priority - policyA.priority;\n\t});\n\tthis.logger.log(fpModules.length + \" folder policies active\");\n\tthis.policyModules = fpModules;\n\t\n\tif($tw.boot.wikiInfo.config && $tw.boot.wikiInfo.config[\"disable-hfs\"]) {\n\t\tthis.config.disabled = true;\n\t\tthis.logger.log(\"plugin disabled; no saving and deleting\");\n\t}\n}\n \nHierarchicalFileSystemAdaptor.prototype.isReady = \"hfs\";\n\n// Are we ready? Are we ready?? We're always ready!\nHierarchicalFileSystemAdaptor.prototype.isReady = function() {\n\treturn true;\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerInfo = function(tiddler) {\n\treturn {};\n};\n\n//\n// file type-specific templates\n//\n$tw.config.typeTemplates = {\n\t\"application/x-tiddler\": \"$:/core/templates/tid-tiddler\",\n\t\"application/javascript\": \"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler\"\n};\n\nHierarchicalFileSystemAdaptor.prototype.getTiddlerFileInfo = function(tiddler,callback) {\n\t// See if we've already got information about this file\n\tvar self = this,\n\t\ttitle = tiddler.fields.title,\n\t\tfileInfo = $tw.boot.files[title],\n\t\tdraftOf = tiddler.fields[\"draft.of\"];\n\t// Get information about how to save tiddlers of this type\n\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\ttypeInfo = $tw.config.contentTypeInfo[type];\n\tif(!typeInfo) {\n typeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n\t}\n if (!($tw.config.typeTemplates[typeInfo.fileType || tiddler.fields.type])) {\n \ttypeInfo = $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"];\n \t\ttypeInfo.fileType = \"application/x-tiddler\";\n\t}\n\tvar extension = typeInfo.extension || \"\";\n\tif(!fileInfo) {\n\t\t// If not, we'll need to generate it\n // Handle case where the title already ends in the file extension:\n // in this case we remove the extension from the suggested title.\n var suggestedName = title;\n if(suggestedName.substr(-extension.length) === extension) {\n suggestedName = suggestedName.substr(0,suggestedName.length - extension.length);\n }\n\t\tvar paf = self.generateTiddlerPathAndFilename(tiddler, suggestedName, draftOf);\n\t\tvar folder = $tw.boot.wikiTiddlersPath+path.sep+paf.subfolder;\n\t\t$tw.utils.createDirectory(folder);\n\t\t// Start by getting a list of the existing files in the directory\n\t\tfs.readdir(folder,function(err,files) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Assemble the new fileInfo\n\t\t\tfileInfo = {};\n\t\t\t\n\t\t\tfileInfo.filepath = folder + path.sep + self.generateUniqueTiddlerFilename(paf.name,draftOf,extension,files);\n\t\t\tfileInfo.type = typeInfo.fileType || tiddler.fields.type;\n\t\t\tfileInfo.hasMetaFile = typeInfo.hasMetaFile;\n\t\t\t// Save the newly created fileInfo\n\t\t\t$tw.boot.files[title] = fileInfo;\n\t\t\t// Pass it to the callback\n\t\t\tcallback(null,fileInfo);\n\t\t});\n\t} else {\n\t\t// Otherwise just invoke the callback\n\t\tcallback(null,fileInfo);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.subfoldersFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<=0) {\n\t\treturn \"\";\n\t} else {\n\t\treturn title.substr(0,lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.leafFromTitle = function(title) {\n\tvar lastSlash = title.lastIndexOf(\"/\");\n\tif (lastSlash<0) {\n\t\treturn title;\n\t} else {\n\t\treturn title.substr(lastSlash+1);\n\t}\n};\n\nHierarchicalFileSystemAdaptor.prototype.generateTiddlerPathAndFilename = function(tiddler, suggestedTitle, draftOf) {\n\t// set up the policy method options such that if in a rare circumstance no policy\n\t// should fire, then we fall back to plain old flat storage in the main wiki folder.\n\tvar options = {\n\t\ttiddler: tiddler, // in: tiddler object we're trying a policy to find for\n\t\tdraft: !!draftOf, // in: is this a draft tiddler?\n\t\tsubfolder: \"\", // in/out: folder into which to place the tiddler file\n\t\tname: suggestedTitle // in/out: name of tiddler file\n\t};\n\t\n\t// run through our ordered list of folder policies and wait for one of them\n\t// to return true because its folder policy should be applied.\n\tfor (var i=0; i|\\:|\\\"|\\/|\\\\|\\||\\?|\\*|\\^/g,\"_\");\n\t// For the subfolder path we are converting hierarchy slashes into the proper\n\t// platform-specific separators.\n\toptions.subfolder = options.subfolder.replace(/\\<|\\>|\\:|\\\"|\\\\|\\||\\?|\\*|\\^/g,\"_\").replace(/\\//g, path.sep);\n\n\treturn options;\n};\n\n/*\nGiven a tiddler title and an array of existing filenames, generate a new legal filename for the title, case insensitively avoiding the array of existing filenames\n*/\nHierarchicalFileSystemAdaptor.prototype.generateUniqueTiddlerFilename = function(baseFilename,draftOf,extension,existingFilenames) {\n\t// Truncate the filename if it is too long\n\tif(baseFilename.length > 200) {\n\t\tbaseFilename = baseFilename.substr(0,200);\n\t}\n\t// Start with the base filename plus the extension\n\tvar filename = baseFilename + extension,\n\t\tcount = 1;\n\t// Add a discriminator if we're clashing with an existing filename\n\twhile(existingFilenames.indexOf(filename) !== -1) {\n\t\tfilename = baseFilename + \" \" + (count++) + extension;\n\t}\n\treturn filename;\n};\n\n/*\nSave a tiddler and invoke the callback with (err,adaptorInfo,revision)\n*/\nHierarchicalFileSystemAdaptor.prototype.saveTiddler = function(tiddler,callback) {\n\tvar self = this;\n\n\t// Monitor for configuration changes and then trigger the folder\n\t// policy modules affected from configuration changes.\n\t$tw.utils.each(this.fpcWatching, function(watch, title, obj) {\n\t\tvar changes = watch.filter.call(self.wiki, function(filterCallback) {\n\t\t\tfilterCallback(tiddler, tiddler.fields.title);\n\t\t});\n\t\tif ( changes.length > 0 ) {\n\t\t\twatch.reconfig.call(self, tiddler.fields.title);\n\t\t}\n\t});\n\t\n\t// Proceed with saving the tiddler\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"saving disabled\");\n\t\treturn callback(null, {}, 0);\n\t}\n\t\n\tthis.getTiddlerFileInfo(tiddler,function(err,fileInfo) {\n\t\tvar template, content, encoding;\n\t\tfunction _finish() {\n\t\t\tcallback(null, {}, 0);\n\t\t}\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(fileInfo.hasMetaFile) {\n\t\t\t// Save the tiddler as a separate body and meta file\n\t\t\tvar typeInfo = $tw.config.contentTypeInfo[fileInfo.type],\n\t\t\t\tencoding = typeInfo.encoding || \"base64\"; // makes sense for TW\n\t\t\tself.logger.log(\"saving type\", fileInfo.type, \"with meta file and encoding\", encoding);\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,{encoding: encoding},function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",\"$:/core/templates/tiddler-metadata\",{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",content,{encoding: \"utf8\"},function (err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t\t_finish();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\t// Save the tiddler as a self contained templated file\n\t\t\ttemplate = $tw.config.typeTemplates[fileInfo.type];\n\t\t\tcontent = self.wiki.renderTiddler(\"text/plain\",template,{variables: {currentTiddler: tiddler.fields.title}});\n\t\t\tfs.writeFile(fileInfo.filepath,content,{encoding: \"utf8\"},function (err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\tself.logger.log(\"Saved file\",fileInfo.filepath);\n\t\t\t\t_finish();\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*/\nHierarchicalFileSystemAdaptor.prototype.loadTiddler = function(title,callback) {\n\tcallback(null,null);\n};\n\n/*\nDelete a tiddler and invoke the callback with (err)\n*/\nHierarchicalFileSystemAdaptor.prototype.deleteTiddler = function(title,callback,options) {\n\tif(this.config.disabled) {\n\t\tthis.logger.log(\"deleting disabled\");\n\t\treturn callback(null);\n\t}\n\n\tvar self = this,\n\t\tfileInfo = $tw.boot.files[title];\n\t// Only delete the tiddler if we have writable information for the file\n\tif(fileInfo) {\n\t\t// Delete the file\n\t\tfs.unlink(fileInfo.filepath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.logger.log(\"Deleted file\",fileInfo.filepath);\n\t\t\t// Delete the metafile if present\n\t\t\tif(fileInfo.hasMetaFile) {\n\t\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\t\tcallback(null);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdelete $tw.boot.files[title];\n\t\t\t\tcallback(null);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null);\n\t}\n};\n\nif(fs) {\n\texports.adaptorClass = HierarchicalFileSystemAdaptor;\n}\n\n})();\n","created":"20141015190317579","type":"application/javascript","modified":"20141015190324904","module-type":"syncadaptor"},"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction":{"title":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","created":"20180204194231803","list":"","modified":"20180204194242455","tags":"","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/javascript-tiddler","created":"20140927173431490","modified":"20140927173434365","type":"text/vnd.tiddlywiki","text":"<$metafy/>"},"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources":{"title":"$:/plugins/TheDiveO/ThirdFlow/templates/save-all-wo-plugin-sources","created":"20140902113827798","modified":"20140927173615299","type":"text/vnd.tiddlywiki","text":"\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[prefix[$:/temp/]] -[is[shadowinsync]] -[[$:/plugins/TheDiveO/ThirdFlow/readme]is[shadow]!is[tiddler]removesuffix[/readme]] -[prefix[$:/plugins/TheDiveO/BrokenPlugin]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Basic","caption":"Basic","created":"20141013144648552","modified":"20141013190842095","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"|Folder for system tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/systemfoldername\" default=\"system\" tag=\"input\"/>|\n|Folder for draft tiddlers:|<$edit-text tiddler=\"$:/config/FileStorage/draftfoldername\" default=\"drafts\" tag=\"input\"/>|\n\n!! How to store ordinary tiddlers into (sub) folders\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"yes\"> Organize ordinary tiddlers into hierarchical subfolders.$radio>\n\n<$radio tiddler=\"$:/config/FileStorage/enableautomaticsubfolders\" value=\"no\"> Store ordinary tiddlers ''flat'' in the top-level wiki folder.$radio>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage/Tags","caption":"Tag-based Folders","created":"20141013152809952","modified":"20141203202326182","tags":"$:/tags/HFS/ControlPanel","type":"text/vnd.tiddlywiki","text":"\\define config-tiddler() $:/config/FileStorage/tagfolders\n\n\\define config-tiddler-list() [list[$(config-tiddler)$]]\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n\n\\define config-defaults() {\"tag-name\": \"$(currentListElement)$\", \"folder-name\": \"$(folder)$\", \"folder-mode\": \"flat\"}\n\n\\define tag-folder-editor()\n <$set name=\"tagConfigTiddler\" value=<>>\n <$set name=\"folder\" value=<>>\n <$list filter=\"[is[missing]]\">\n <$ensuretiddler title=<> default=<>/>\n <$link title=<> format=\"text\"><$text text=<>/>$link>\n $list>\n
\n\n$listmangler>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/FileStorage","caption":"File Storage","created":"20141013143730660","modified":"20170222203526611","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"Control how a Node.js-server TiddlyWiki organizes your tiddlers into hierarchical folders and subfolders inside your file system. Any configuration changes you make here will immediately become live, even on your TiddlyWiki server.\n
\n\\end\n\nSettings to customize //your// ''plugin development'' in TiddlyWiki.\n\nConfigure the places where you want to add new tiddlers of a certain type when developing your plugins. These settings only apply when adding new tiddlers to a plugin, never afterwards.\n\n* Simply leave a place empty when you don't want tiddlers of a specific type to be organized into their own sub title-namespace, but instead \"//flat//\" directly within the plugin.\n* Press {{$:/core/images/refresh-button}} in order to reset a place for a specific type of plugin tiddler to its default setting.\n* Press {{$:/core/images/file}} to see -- and optionally edit -- the template for a specific plugin tiddler type.\n\n
\n\\end\n\n\\define release-plugin-item(itemdesc, itemconfig, defaultfilename, templateplaceholder)\n<<$macrocall $name=\"plain\" text=\"$itemdesc$\" $output=\"text/plain\"/>$link>' \"$itemconfig$\" \"$defaultfilename$\" \"$templateplaceholder$\">>\n\\end\n\nSettings to customize your ''plugin(s) release'', including an optional plugin-demo wiki.\n\n> ''Note:'' To ''create'' the release files, run `npm run release` on your development ~TiddlyWiki in a terminal session.\n\n!! Plugins\n\n<$list filter=\"[prefix[$:/plugins/]has[plugin-type]removeprefix[$:/plugins/]!prefix[tiddlywiki/]!regexp:title[^.+/.+/]sort[]] -[all[shadows]prefix[$:/plugins/]shadowsource[]removeprefix[$:/plugins/]]\" variable=\"plugin-name\">\n <$set name=\"plugin-config\" filter=\"[addprefix[$:/config/ThirdFlow/plugins/$:/plugins/]]\">\n <$set name=\"plugin-filename\" filter=\"[titlecomponents[]last[]addsuffix[.tid]]\">\n <$macrocall $name=\"release-plugin-item\" itemdesc=<> itemconfig=<> defaultfilename=<> templateplaceholder=\"$:/core/templates/tid-tiddler\" />\n $set>\n $set>\n$list>\n\n\n!! Plugin-Demo Wiki\n\n<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow","caption":"ThirdFlow","created":"20180203154413491","list":"$:/plugins/TheDiveO/ThirdFlow/ui/ControlPanel/ThirdFlow/Locations","modified":"20180217150140183","tags":"$:/tags/ControlPanel","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/EditTemplates/PluginMetaData","created":"20180202124221987","list-before":"$:/core/ui/EditTemplate/body","modified":"20180205194150923","tags":"$:/tags/EditTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-info-row(name, value, output:\"html\")\n\\rules except wikilink\n
\n$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/allfilter.js\ntags: \nmodified: 20180207103459780\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [all[XXX]] filter operator function. Such\n * all-filter operators return all tiddlers of a certain \"category\". The parameters\n * to this all-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step. Not of much use here, ignore it for most usecases.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foos = function(source, prefix, options) {\n return [\"foo\", \"bar\", \"baz\"];\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207103459780"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/command.js\ntags: \nmodified: 20180207092452733\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our command and tells TiddlyWiki whether to run it\n * synchronously or asynchronously. The latter use a callback to signal\n * finish or failure (see below).\n */\nexports.info = {\n name: \"foobarbaz\",\n synchronous: true\n};\n\n/* Creates a new command instance. Please note that asynchronous commands will\n * receive a third \"callback\" parameter, which we should store for later use;\n * see below how to use it.\n */\nvar Command = function(params, commander /*, callback */) {\n this.params = params;\n this.commander = commander;\n this.logger = new $tw.utils.Logger(\"--\" + exports.info.name);\n /* this.callback = callback; */\n};\n\n/* Executes our command. For synchronous commands return either null (success)\n * or an error string. For asynchronous commands use the callback instead which\n * we'd receive in the constructor call.\n */\nCommand.prototype.execute = function() {\n /* check your command parameters, which you will find in this.params */\n if (this.params.length < 1) {\n return \"Missing foo parameter\";\n }\n\n /* ... */\n\n return null; /* no error. */\n /* this.callback(); // for async commands */\n};\n\nexports.Command = Command;\n\n})();\n","created":"20180205162715434","type":"application/javascript","tags":"","modified":"20180207092452733"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/cssstyle.css","created":"20180205162715434","modified":"20180207092942425","type":"text/css","text":"/* add your CSS rules here */\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/filter.js\nmodified: 20180207103213628\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and and exports our filter operator function. The parameters\n * to operator functions are as follows:\n *\n * source: a tiddler iterator that represents the resoluts of the previous\n * filter step.\n * operator: the arguments to this filter operator...\n * .operator: name of the filter operator.\n * .operand: the operand as a string; text references and variable names\n * have already been resolved at this point.\n * .prefix: an optional \"!\" if the filter is to be negated.\n * .suffix: an optional string containing an additional filter argument.\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's allowed to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.dofoo = function(source, operator, options) {\n\tvar results = [];\n\tsource(function(tiddler, title) {\n\t\tresults.push(\"foo\" + title);\n\t});\n\treturn results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103213628"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history","created":"20180202212229406","modified":"20180202212958716","tags":"","type":"text/vnd.tiddlywiki","text":"* ''0.0.1'' -- my first plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/isfilter.js\nmodified: 20180207103529498\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to and exports our [is[XXX]] filter operator function. Such\n * is-filter operators filter tiddlers by a certain \"category\". The parameters\n * to this is-operator function are as follows; they slightly differ from the\n * \"generic\" filter operators:\n *\n * source: a tiddler iterator that represents the results of the previous\n * filter step, which we now need to filter.\n * prefix: an optional \"!\" if the all-filter is to be negated (if supported).\n * options:\n * .wiki: wiki object reference.\n * .widget: an optional widget node object reference.\n *\n * It's possible to return either an array of titles or a tiddler iterator,\n * depending on your needs.\n */\nexports.foo = function(source, prefix, options) {\n var results = [];\n\n if (prefix !== \"!\") {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) >= 0) {\n results.push(title);\n }\n });\n } else {\n source(function(tiddler, title) {\n if([\"foo\", \"bar\", \"baz\"].indexOf(title) < 0) {\n results.push(title);\n }\n });\n }\n\n return results;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207103529498"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/jsmacro.js\nmodified: 20180207100549039\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Tells TiddlyWiki the name of our macro through the export mechanism. */\nexports.name = \"foObAr\";\n\n/* Lists of macro parameters; leave this array empty if you need none, or\n * want all supplied macro call parameters to be passed to the run() method.\n */\nexports.params = [\n { name: \"foo\" }, /* 1st parameter name */\n { name: \"bar\", default: \"bar\" }\n];\n\n/* Executes (runs) our macro when it requires evaluation; returns a string\n * value.\n */\nexports.run = function(foo, bar) {\n return foo + bar;\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207100549039"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js","text":"/*\\\ncreated: 20180205162715434\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/library.js\nmodified: 20180207095013968\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports/exposes symbols that users of this library can later use\n * after require()'ing a reference to this library.\n */\nexports.dofoo = function () {\n};\n\n})();\n","created":"20180205162715434","type":"application/javascript","modified":"20180207095013968"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license","created":"20180202222709213","modified":"20180202222730979","tags":"","type":"text/vnd.tiddlywiki","text":"This plugin is licensed under the ..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/parser.js\nmodule-type: parser\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Parses blocks of source text into a parse tree. The parameters to the\n * constructor are as follows:\n *\n * type: the (mime type) of the text to parse.\n * text: the text to parse.\n * options:\n * .wiki: TiddlyWiki object reference.\n * ._canonical_uri: ...\n */\nvar Parser = function(type, text, options) {\n this.tree = [{\n \"type\": \"element\", \"tag\": \"code\", \"children\": [{\n \"type\": \"text\", \"text\": text\n }]\n }];\n};\n\n/* Declares the (document) mime types this parser is able to handle; multiple\n * export declarations are supported.\n */\nexports[\"application/x-foo-ducument\"] = Parser;\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"parser"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/plugin","created":"20180202203909068","modified":"20180218193839795","plugin-type":"plugin","tags":"","type":"application/json","text":"{\"tiddlers\": {}}"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme","created":"20180202222539879","modified":"20180202222703851","tags":"","type":"text/vnd.tiddlywiki","text":"Tell your users about your plugin: what is it good for? How can it be used? And so on..."},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js","text":"/*\\\ncreated: 20180205163726933\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/startup.js\nmodified: 20180205164120901\ntype: application/javascript\nmodule-type: startup\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Names this startup module and tells TiddlyWiki to run it either\n * synchronously or asynchronously.\n */\nexports.name = \"foostartup\";\nexports.synchronous = true;\n\n/* Optionally set the order of startup execution */\n/* exports.after = [\"story\"]; */\n/* Optionally set the platforms on which to be executed */\n/* exports.platforms = [\"browser\"]; */\n\n/* Runs this function during startup */\nexports.startup = function() {\n /* do something here... */\n};\n \n})();","created":"20180205163726933","modified":"20180205164120901","type":"application/javascript","module-type":"startup"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/template","created":"20180205164155065","modified":"20180205164212763","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js","text":"/*\\\ncreated: 20180211152629856\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twconfig.js\nmodified: 20180211155735719\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to $tw.config */\nexports.foofoo = 42;\nexports.foobar = {};\n \n})();","created":"20180211152629856","type":"application/javascript","modified":"20180211155735719","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js","text":"/*\\\ncreated: 20180211153224637\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twglobal.js\nmodified: 20180211153304692\ntags: \n\\*/\nfunction(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Exports to be added to the global $tw */\nexports.foofoo = 42;\n \n})();","created":"20180211153224637","type":"application/javascript","modified":"20180211153304692","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/twmacro","created":"20180205162715434","modified":"20180207101427201","type":"text/vnd.tiddlywiki","text":"\\define fOObARbAZ()\nfOObARBaZong!\n\\end"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/ui","created":"20180205164236165","modified":"20180205164237226","type":"text/vnd.tiddlywiki","text":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js","text":"/*\\\ncreated: 20180205164319473\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/util.js\nmodified: 20180211153602323\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180205164319473","type":"application/javascript","modified":"20180211153602323"},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js","text":"/*\\\ncreated: 20180211153526427\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/utilnode.js\nmodified: 20180211153817740\ntags: \n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Only when running inside a Node.js-based TiddlyWiki server,\n * this creates a new Foo tool, which can be used as in:\n * var fool = new $tw.utils.Foo();\n * You don't need to export a constructor function, instead\n * you can also export an ordinary utility function which just\n * does something and may return something else. Such as in:\n * $tw.utils.doSomething(false);\n */\nvar Fooooo = function() {\n /* ... */\n};\n \n/* Add methods as necessary */\nFooooo.prototype.bar = function() {\n /* ... */\n};\n\n/* Exports the (constructor) function */\nexports.Fooooo = Fooooo;\n \n})();","created":"20180211153526427","type":"application/javascript","modified":"20180211153817740","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js","text":"/*\\\ncreated: 20180211154125055\ntype: application/javascript\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/widget.js\nmodified: 20180211154857371\ntags: \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\n/* Creates a new <$foo> widget. */\nvar FooWidget = function(parseTreeNode, options) {\n this.initialise(parseTreeNode, options);\n};\n \n/* \"Inherits\" from the Widget base \"class\" in order to get all\n * the basic widget functionality.\n */\nFooWidget.prototype = new Widget();\n\n/* Renders this widget into the DOM. */\nFooWidget.prototype.render = function(parent,nextSibling) {\n this.parentDomNode = parent;\n this.computeAttributes();\n this.execute();\n /* ... */\n};\n\n/* Computes the internal state of this widget. */\nFooWidget.prototype.execute = function() {\n /* ... */\n this.makeChildWidgets();\n}; \n \n/* Selectively refreshes this widget if needed and returns\n * true if either this widget itself or one of its children\n * needs to be re-rendered.\n */\nFooWidget.prototype.refresh = function(changedTiddlers) {\n var changedAttributes = this.computeAttributes(),\n hasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n if (hasChangedAttributes) {\n /* ... */\n }\n return this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\n/* Finally exports the widget constructor. */\nexports.foo = FooWidget;\n\n})();","created":"20180211154125055","type":"application/javascript","modified":"20180211154857371","tags":""},"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js","text":"/*\\\ncreated: 20180205162715434\nmodified: 20180205163131597\ntitle: $:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/wikirule.js\ntype: application/javascript\nmodule-type: wikirule\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/* Gives a name to our wikiparser rule and exports it */\nexports.name = \"dash\";\n/* Export the type(s) of rule, can be \"inline: true\" or/and \"block: true\" */\nexports.types = { inline: true };\n\n/* Initializes the rule and tells the parser when to match */\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /fOO!/mg;\n};\n\n/* Parses markup after the parser has matched out rule. It then returns\n * a parse tree.\n */\nexports.parse = function() {\n\t/* Move past this match */\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: \"foo\"\n\t}];\n};\n\n})();\n","created":"20180205162715434","modified":"20180205163131597","type":"application/javascript","module-type":"wikirule"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/allfilteroperator","caption":"new [all[...]] filter operator","created":"20180207103416636","modified":"20180207103625598","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/boilerplate","caption":"add plugin boilerplate tiddlers","created":"20180202210615976","modified":"20180211162427574","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"\\define plugin-tiddler-within(title) $:/plugins/$(plugin-name)$/$title$\n\n<$set name=\"old-list\" tiddler=<> field=\"list\">\n<$set name=\"list\" filter=\"[enlist] -[[readme]] -[[license]] -[[history]]\">\n<$set name=\"new-list\" filter=\"readme license history [enlist]\">\n<$button class=<> >\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/history\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/license\" />\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<> $param=\"$:/plugins/TheDiveO/ThirdFlow/ui/MoreSideBar/templates/new/readme\" />\n<$action-setfield $tiddler=<> list=<> />\n<>{{!!caption}}\n$button>\n$set>\n$set>\n$set>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/command","caption":"new command module","created":"20180202223504033","modified":"20180207100039540","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/config","caption":"new $tw.config module","created":"20180211155634174","modified":"20180211155728819","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/cssstyle","caption":"new CSS tiddler","created":"20180202223710863","modified":"20180207100321397","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/filteroperator","caption":"new [...[]] filter operator","created":"20180207103225047","modified":"20180207103715611","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/isfilteroperator","caption":"new [is[...]] filter operator","created":"20180207103539461","modified":"20180207103611302","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/jsmacro","caption":"new Javascript macro","created":"20180204191504018","modified":"20180207100731291","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/library","caption":"new Javascript library","created":"20180202223038045","modified":"20180207100520908","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/tiddler","caption":"new wikitext tiddler","created":"20180202224303945","modified":"20180207100850748","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twglobal","caption":"new $tw globals module","created":"20180211155502716","modified":"20180211155620374","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/twmacro","caption":"new wikitext macro","created":"20180202223619732","modified":"20180207101828276","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/util","caption":"new $tw.utils module","created":"20180211155355001","modified":"20180211155426871","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/utilnode","caption":"new Nodejs-only $tw.utils module","created":"20180211155116031","modified":"20180211155445679","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/PluginSources/actions/new/widget","caption":"new widget module","created":"20180202223929415","modified":"20180211155035989","tags":"$:/plugins/TheDiveO/ThirdFlow/tags/ThirdFlow/PluginAction","type":"text/vnd.tiddlywiki","text":"<>\n"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/PluginMetaData","created":"20141025150024301","list-before":"$:/core/ui/ViewTemplate/plugin","modified":"20180205194450156","tags":"$:/tags/ViewTemplate","type":"text/vnd.tiddlywiki","text":"\\define plugin-type-infotiddler(tiddler)\n <$transclude tiddler=\"$tiddler$\">\n <$transclude tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined\"/>\n $transclude>\n\\end\n\n\\define plugin-type-info(type)\n <$macrocall $name=\"plugin-type-infotiddler\" tiddler=\"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/$type$\"/>\n\\end\n\n\\define plugin-info-row(name, value)\n\\rules except wikilink\n
\n\n$list>"},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/import","created":"20141025175537027","modified":"20180205194514922","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`import` -- is a special plugin type only used internally by the TiddlyWiki 5 core when importing tiddlers. No ordinary plugin should ever use a plugin type of `import`."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/language","created":"20141025180244406","modified":"20141025180805600","type":"text/vnd.tiddlywiki","text":"`language` -- this plugin is a language package for the language \"{{!!name}}\". This language plugin will automatically be used when you select this language in the [[basic settings|$:/core/ui/ControlPanel/Basics]] of the [[control panel|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/plugin","created":"20141025155451829","modified":"20180205194504314","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`plugin` -- this is the most general form of a TiddlyWiki 5 plugin."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/theme","created":"20141025174630240","modified":"20180205194533069","type":"text/vnd.tiddlywiki","text":"\\rules except wikilink\n`theme` -- contains a TiddlyWiki 5 theme. You can select this theme through the [[theme switcher|$:/core/ui/ControlPanel/Theme]] in the [[control pane|$:/ControlPanel]]."},"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined":{"title":"$:/plugins/TheDiveO/ThirdFlow/ui/ViewTemplates/plugin/types/undefined","created":"20141025155725392","modified":"20141117190958706","type":"text/vnd.tiddlywiki","text":"<$view field=\"plugin-type\"/> -- is an ''unknown plugin type''."},"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js","text":"/*\\\ncreated: 20141020111918405\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/ensuretiddler.js\ntype: application/javascript\nmodified: 20141020111927394\nmodule-type: widget\n\nDefault widget: if a particular tiddler is not present,\nthen it gets created using the default values specified.\nIn contrast to the new tiddler creation message, we don't\nuse a static template but instead accept the default values\nin form of a JSON string that may be the result of some\nmacro invokation.\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 EnsureTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEnsureTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEnsureTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEnsureTiddlerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.ensureTitle = this.getAttribute(\"title\",\"currentTiddler\");\n\tthis.ensureDefault = this.getAttribute(\"default\");\n\n var tiddler = this.wiki.getTiddler(this.ensureTitle);\n if(!tiddler) {\n var defaults;\n try {\n defaults = JSON.parse(this.ensureDefault);\n } catch(ex) {\n defaults = {};\n }\n defaults[\"title\"] = this.ensureTitle;\n var mods = this.wiki.getModificationFields();\n this.wiki.addTiddler(new $tw.Tiddler(defaults,mods));\n }\n \n // Construct the 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*/\nEnsureTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.title || changedAttributes.default) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.ensuretiddler = EnsureTiddlerWidget;\n\n})();\n","created":"20141020111918405","type":"application/javascript","modified":"20141020111927394","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js","text":"/*\\\ncreated: 20141015190230115\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/jsonmangler.js\ntype: application/javascript\nmodified: 20141015190236275\nmodule-type: widget\n\nThe JSON mangler widget -- similar to the fieldmangler widget,\nbut for mangling JSON data in a data tiddler instead of\nmangling the fields of a tiddler.\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\n// The JSON mangler widget understands the following events:\n// * tm-add-json-index: add a new index to a JSON data tiddler, the\n// index name to add is in the event param parameter.\n// * tm-remove-json-index: remove an existing index from a JSON data\n// tiddler, as specified in the event param parameter.\nvar JsonManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-json-index\", handler: \"handleAddJsonIndexEvent\"},\n\t\t{type: \"tm-remove-json-index\", handler: \"handleRemoveJsonIndexEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nJsonManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nJsonManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nJsonManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nJsonManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Add a new index (as specified in the event param parameter) to a JSON\n// data tiddler (specified in the widget title parameter). It is also possible\n// to specify a default value; the event param parameter then needs to be a hashmap\n// with the elements \"index\" (name of index) and \"default\" (default value).\nJsonManglerWidget.prototype.handleAddJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tvar def = (typeof event.param === \"string\") ? \"\" : event.param[\"default\"];\n\tif ( index ) {\n\t\tvar data = tiddler ? this.wiki.getTiddlerData(tiddler, {}) : {};\n\t\tdata[index] = \"\";\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\n// Remove an existing index (as specified in the event param parameter) from a JSON\n// data tiddler (specified in the widget title parameter).\nJsonManglerWidget.prototype.handleRemoveJsonIndexEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tvar index = (typeof event.param === \"string\") ? event.param : event.param[\"index\"];\n\tif ( tiddler && index ) {\n\t\tvar data = this.wiki.getTiddlerData(tiddler, {});\n\t\tdelete data[index];\n\t\tthis.wiki.setTiddlerData(this.mangleTitle, data, tiddler);\n\t}\n\treturn true;\n};\n\nexports.jsonmangler = JsonManglerWidget;\n\n})();\n","created":"20141015190230115","type":"application/javascript","modified":"20141015190236275","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js","text":"/*\\\ncreated: 20141020111936183\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/listmangler.js\ntype: application/javascript\nmodified: 20141020111942403\nmodule-type: widget\n\nThe list mangler widget -- mangles the list field of a\ntiddler. It supports the following parameters:\n* tiddler: the tiddler to work on, default is currentTiddler.\n* field: the field to mangle as a list, default is the list field.\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\n// The list mangler widget understands the following events:\n// * tm-add-list-element\n// * tm-remove-list-element\n// * tm-back-list-element\n// * tm-forward-list-element\nvar ListManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-add-list-element\", handler: \"handleAddListElementEvent\"},\n\t\t{type: \"tm-remove-list-element\", handler: \"handleRemoveListElementEvent\"},\n\t\t{type: \"tm-shift-forward-list-element\", handler: \"handleShiftForwardListElementEvent\"},\n\t\t{type: \"tm-shift-back-list-element\", handler: \"handleShiftBackListElementEvent\"}\n\t]);\n};\n\n// Inherit from the base widget class\nListManglerWidget.prototype = new Widget();\n\n// Render this widget into the DOM\nListManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\n// Compute the internal state of the widget\nListManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n this.mangleField = this.getAttribute(\"field\",\"list\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n// Selectively refreshes the widget if needed. Returns true if the widget\n// or any of its children needed re-rendering\nListManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n// Appends a new element to the list field (or other anspecified field) of\n// the given tiddler. Ensures that the same element never gets added twice.\n// If the tiddler doesn't exist yet, it will be created.\nListManglerWidget.prototype.handleAddListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle) || new $tw.Tiddler({title: this.mangleTitle});\n var addElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(addElement);\n if(where<0) {\n list.push(addElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n return true;\n};\n\n// Removes an existing element from the list field (or another specified field)\n// of the given tiddler.\nListManglerWidget.prototype.handleRemoveListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var remElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(remElement);\n if(where>=0) {\n list.splice(where,1);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\n// Moves an existing element from the list field (or another specified field)\n// one position forward towards the end of the list of the given tiddler.\nListManglerWidget.prototype.handleShiftForwardListElementEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n if(tiddler) {\n var shiftElement = event.param;\n var list = $tw.utils.parseStringArray(tiddler.fields[this.mangleField] || \"\").slice(0);\n var where = list.indexOf(shiftElement);\n if((where>=0) && (where=1) {\n var swapElement = list[where-1];\n list.splice(where-1,2,shiftElement,swapElement);\n var mods = this.wiki.getModificationFields();\n mods[this.mangleField] = list;\n this.wiki.addTiddler(new $tw.Tiddler(tiddler,mods));\n }\n }\n return true;\n};\n\nexports.listmangler = ListManglerWidget;\n\n})();\n","created":"20141020111936183","type":"application/javascript","modified":"20141020111942403","module-type":"widget"},"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js":{"title":"$:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js","text":"/*\\\ncreated: 20140927173129833\ntitle: $:/plugins/TheDiveO/ThirdFlow/widgets/metafy.js\ntype: application/javascript\nmodified: 20140927173153432\nmodule-type: widget\n\nmetafy widget\n\nUsed to dump javascript tiddlers correctly as .js files as opposed to .js.tid\nfiles.\n\nwidget attributes:\n* tiddler: defaults to the widget variable currentTiddler.\n* detect: regular expression detecting a meta data section (which may be\n empty). Its parameter #2 indicates where to replace/insert meta data\n when such a section is present. Otherwise, the template parameter will\n be used instead. For instance, the following regular expression composed\n of these elements:\n \"(^\\/\\*\\\\(?:\\r?\\n))\"\n -- the special comment marker at the section beginning on its own line.\n \"((?:^[^\\r\\n]+(?:\\r?\\n))*)\"\n -- matches all meta data field lines.\n \"(?:(?:^[^\\r\\n]*(?:\\r?\\n))*)\"\n -- matches a trailing normal comment text.\n \"(?:^\\\\\\*\\/(?:\\r?\\n)?)\"\n -- the special comment marker at the section end on its own line.\n* exclude: the fields to exclude; defaults to \"text bag revision\".\n* template: template to use to establish meta data section if not yet present.\n $fields$ is used to indicate where to insert the fields (meta) data section of\n \"field: value\\n\" pairs. For instance, \"/*\\\\\\n$fields$\\\\*\"+\"/\\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\n/*\nConstructor\n */\nvar MetafyWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n\n/*\nInherit from the base widget class\n*/\nMetafyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMetafyWidget.prototype.render = function(parent, nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode, nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMetafyWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.metafyTitle = this.getAttribute(\"tiddler\", this.getVariable(\"currentTiddler\"));\n\tthis.metafyDetect = this.getAttribute(\"match\",\n\t\t \"(^\\\\/\\\\*\\\\\\\\(?:\\\\r?\\\\n))\" // special comment marker beginning\n\t\t+ \"((?:^[^\\\\r\\\\n]+(?:\\\\r?\\\\n))*)\" // field name-value pairs\n\t\t+ \"(?:(?:^[^\\\\r\\\\n]*(?:\\\\r?\\\\n))*)\" // remaining comment section\n\t\t+ \"(?:^\\\\\\\\\\\\*\\\\/(?:\\\\r?\\\\n)?)\" // special comment marker end\n\t);\n\tvar exclude = this.getAttribute(\"exclude\", \"text bag revision\");\n\texclude = exclude.split(\" \");\n\tthis.metafyExclude = exclude;\n\tthis.metafyTemplate = this.getAttribute(\"template\", \"/*\\\\\\n$fields$\\\\*/\\n\");\n\t\n\tvar tiddler = this.wiki.getTiddler(this.metafyTitle);\n\tvar text = \"\";\n\tif (tiddler) {\n\t\ttext = this.wiki.getTiddlerText(this.metafyTitle);\n\t}\n\t\n\tvar fields = \"\";\n\tfor(var field in tiddler.fields) {\n\t\tif (exclude.indexOf(field) === -1) {\n\t\t\tfields += field + \": \" + tiddler.getFieldString(field) + \"\\n\";\n\t\t}\n\t}\n\t\n\tvar match = new RegExp(this.metafyDetect, \"mg\").exec(text);\n\tif (match) {\n\t\tvar start = match.index + match[1].length;\n\t\ttext = text.substr(0, start) + fields + text.substr(start + match[2].length);\n\t} else {\n\t\tconsole.log(\"no match\");\n\t\ttext = this.metafyTemplate.replace(\"$fields$\", fields) + text;\n\t}\n\t\n\tthis.text = text;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMetafyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.detect || changedAttributes.exclude || changedAttributes.template || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nExport the metafy widget\n */\nexports.metafy = MetafyWidget;\n\n})();\n","created":"20140927173129833","type":"application/javascript","modified":"20140927173153432","module-type":"widget"}}}
\ No newline at end of file
diff --git a/package.json b/package.json
index 3190def..ab3a7a4 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,15 @@
{
- "name": "thirdflow",
- "version": "1.2.1",
- "author": "TheDiveO",
- "description": "Third Flow in-TW plugin development process support",
+ "name": "tw5-thirdflow",
+ "version": "1.2.3",
+ "author": "TheDiveO ",
+ "description": "Third Flow plugin development process support for TiddlyWiki5",
"homepage": "https://github.com/TheDiveO/ThirdFlow",
"license": "(MIT OR CC-BY-3.0)",
"bugs": "https://github.com/TheDiveO/ThirdFlow/issues",
-
+ "keywords": [
+ "tiddlywiki", "tiddlywiki5", "plugin", "thirdflow"
+ ],
"main": "thirdflow.js",
-
"scripts": {
"start": "tiddlywiki editions/develop --verbose --server 8080 $:/core/save/all text/plain text/html & echo $! > tw.pid",
"stop": "kill `cat tw.pid` && rm tw.pid",
@@ -16,12 +17,10 @@
"release": "tiddlywiki editions/release --verbose --build release",
"test": "tiddlywiki editions/release --verbose"
},
-
"repository": {
"type": "git",
"url": "https://github.com/TheDiveO/ThirdFlow.git"
},
-
"dependencies": {
"tiddlywiki": ">=5.1.15"
},
diff --git a/src/tiddlers/system/config/DefaultMoreSidebarTab.tid b/src/tiddlers/system/config/DefaultMoreSidebarTab.tid
index 3ec6e38..98c5362 100644
--- a/src/tiddlers/system/config/DefaultMoreSidebarTab.tid
+++ b/src/tiddlers/system/config/DefaultMoreSidebarTab.tid
@@ -1,5 +1,5 @@
-created: 20180224212919108
-modified: 20180224213020854
+created: 20180311171949231
+modified: 20180311172437118
tags:
title: $:/config/DefaultMoreSidebarTab
type: text/vnd.tiddlywiki
diff --git a/src/tiddlers/system/config/DefaultSidebarTab.tid b/src/tiddlers/system/config/DefaultSidebarTab.tid
new file mode 100644
index 0000000..88790a1
--- /dev/null
+++ b/src/tiddlers/system/config/DefaultSidebarTab.tid
@@ -0,0 +1,6 @@
+created: 20180311172447146
+modified: 20180311172448368
+title: $:/config/DefaultSidebarTab
+type: text/vnd.tiddlywiki
+
+$:/core/ui/SideBar/More
\ No newline at end of file
diff --git a/src/tiddlers/system/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab.tid b/src/tiddlers/system/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab.tid
new file mode 100644
index 0000000..5f29e3d
--- /dev/null
+++ b/src/tiddlers/system/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab.tid
@@ -0,0 +1,16 @@
+caption: {{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}
+created: 20180311171546924
+modified: 20180311171658348
+tags: $:/tags/ControlPanel/Settings
+title: $:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab
+type: text/vnd.tiddlywiki
+
+\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/
+
+<$link to="$:/config/DefaultMoreSidebarTab"><>$link>
+
+<$select tiddler="$:/config/DefaultMoreSidebarTab">
+<$list filter="[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]">
+
+$list>
+$select>
\ No newline at end of file
diff --git a/src/tiddlers/system/core/ui/SideBar/More.tid b/src/tiddlers/system/core/ui/SideBar/More.tid
new file mode 100644
index 0000000..03165b7
--- /dev/null
+++ b/src/tiddlers/system/core/ui/SideBar/More.tid
@@ -0,0 +1,10 @@
+caption: {{$:/language/SideBar/More/Caption}}
+created: 20180311171848964
+modified: 20180311171906478
+tags: $:/tags/SideBar
+title: $:/core/ui/SideBar/More
+type: text/vnd.tiddlywiki
+
+
\ No newline at end of file
diff --git a/src/tiddlers/system/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption.tid b/src/tiddlers/system/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption.tid
new file mode 100644
index 0000000..ef2fef9
--- /dev/null
+++ b/src/tiddlers/system/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption.tid
@@ -0,0 +1,7 @@
+created: 20180311172640903
+modified: 20180311172810388
+tags:
+title: $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption
+type: text/vnd.tiddlywiki
+
+Default More Sidebar Tab
\ No newline at end of file
diff --git a/src/tiddlers/system/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint.tid b/src/tiddlers/system/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint.tid
new file mode 100644
index 0000000..c34707a
--- /dev/null
+++ b/src/tiddlers/system/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint.tid
@@ -0,0 +1,7 @@
+created: 20180311172813678
+modified: 20180311172839276
+tags:
+title: $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint
+type: text/vnd.tiddlywiki
+
+Specify which More sidebar tab is displayed by default
\ No newline at end of file
diff --git a/src/tiddlers/system/plugins/TheDiveO/ThirdFlow.tid b/src/tiddlers/system/plugins/TheDiveO/ThirdFlow.tid
index 5ec5eef..450cf9b 100644
--- a/src/tiddlers/system/plugins/TheDiveO/ThirdFlow.tid
+++ b/src/tiddlers/system/plugins/TheDiveO/ThirdFlow.tid
@@ -8,6 +8,6 @@ plugin-type: plugin
source: http://thediveo.github.io/ThirdFlow
title: $:/plugins/TheDiveO/ThirdFlow
type: application/json
-version: 1.2.1
+version: 1.2.2
-{"tiddlers": {}}
\ No newline at end of file
+{"tiddlers": {}}
diff --git a/src/tiddlers/system/plugins/TheDiveO/ThirdFlow/history.tid b/src/tiddlers/system/plugins/TheDiveO/ThirdFlow/history.tid
index 90c2af6..1af787d 100644
--- a/src/tiddlers/system/plugins/TheDiveO/ThirdFlow/history.tid
+++ b/src/tiddlers/system/plugins/TheDiveO/ThirdFlow/history.tid
@@ -1,8 +1,12 @@
created: 20140902083720188
-modified: 20180224213249509
+modified: 20180311173125103
title: $:/plugins/TheDiveO/ThirdFlow/history
type: text/vnd.tiddlywiki
+* ''1.2.3''
+** makes ThirdFlow plugin available as npm package `tw5-thirdflow`.
+** the development wiki now opens the "Plugin Sources" sidebar tab by default; this can be changed in the Control Panel "Settings" tab. Please note that TiddlyWiki 5.1.16+ will have this feature anyway.
+
* ''1.2.2''
** supports showing the "Plugin Sources" tab within the More sidebar tab at start for ~TiddlyWiki 5.1.16+.