inmysocks inmysocks@fastmail.com inmysocks@gmail.com
OokTech
What did you expect?
{{question}}\define NamePlate() <$text text='<Name Plate>'/> \end
<div class="github-fork-ribbon-wrapper right"> <div class="github-fork-ribbon" style="background-color:#DF4848;"> <a href="http://tiddlywiki.com">Powered by ~TiddlyWiki</a> </div> </div>
/*\ title: $:/.tb/macros/calc.js type: application/javascript module-type: macro Computes a (Field) value +,-,*,/ a provided value. \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; /* Information about this macro */ exports.name = "calc"; exports.params = [ {name: "value"}, {name: "operation"}, {name: "until"}, {name: "beyond"}, {name: "decimals"}, {name: "tiddler"} ]; /* Run the macro */ exports.run = function(value, operation, until, beyond, decimals, tiddler) { if(!value) { return; } if("" == operation){ operation = "0"; } var curr,dec,op,r,result,val, ops = ["+","-","*","/"]; curr = parseFloat( 0 > value.indexOf('!!') ? value : this.wiki.getTextReference(value, "NaN", tiddler || this.getVariable("currentTiddler")) ); until = parseFloat(until); decimals = parseInt(decimals); op = operation.charAt(0); val = parseFloat(0 > ops.indexOf(op) ? operation : operation.substr(1)); op = 0 > ops.indexOf(op) ? "+" : op; if(isNaN(curr)) { result = "NaN"; } else { switch (op){ case "-": result = curr - val; break; case "*": result = curr * val; break; case "/": result = curr / val; break; case "+": default: result = curr + val; } if(!isNaN(until)) { if (!( "+" == op || "*" == op ? result <= until : result >= until )) { if("true" == beyond) { result = true; } else { result = until; } } if(beyond && result !== true) { result = false; } } } if(!isNaN(result)){ r = result.toString(); dec = r.indexOf('.'); if(dec > -1){ dec = r.substr(dec).length; if( !isNaN(decimals) && dec > decimals || isNaN(decimals) && dec > 2 ){ result = result.toFixed(isNaN(decimals) ? 2 : decimals); } } } return result; }; })();
0
no
Contents
permalink
show
show
hide
hide
show
{ "tiddlers": { "$:/Acknowledgements": { "title": "$:/Acknowledgements", "type": "text/vnd.tiddlywiki", "text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n" }, "$:/core/copyright.txt": { "title": "$:/core/copyright.txt", "type": "text/plain", "text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright © Jeremy Ruston 2004-2007\nCopyright © UnaMesa Association 2007-2015\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\nRedistributions in binary form must reproduce the above copyright notice, this\nlist of conditions and the following disclaimer in the documentation and/or other\nmaterials provided with the distribution.\n\nNeither the name of the UnaMesa Association nor the names of its contributors may be\nused to endorse or promote products derived from this software without specific\nprior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\nSHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\nBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\nANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n" }, "$:/core/icon": { "title": "$:/core/icon", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>" }, "$:/core/images/advanced-search-button": { "title": "$:/core/images/advanced-search-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-advanced-search-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M74.5651535,87.9848361 C66.9581537,93.0488876 57.8237115,96 48,96 C21.490332,96 0,74.509668 0,48 C0,21.490332 21.490332,0 48,0 C74.509668,0 96,21.490332 96,48 C96,57.8541369 93.0305793,67.0147285 87.9377231,74.6357895 L122.284919,108.982985 C125.978897,112.676963 125.973757,118.65366 122.284271,122.343146 C118.593975,126.033442 112.613238,126.032921 108.92411,122.343793 L74.5651535,87.9848361 Z M48,80 C65.673112,80 80,65.673112 80,48 C80,30.326888 65.673112,16 48,16 C30.326888,16 16,30.326888 16,48 C16,65.673112 30.326888,80 48,80 Z\"></path>\n <circle cx=\"48\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"28\" cy=\"48\" r=\"8\"></circle>\n <circle cx=\"68\" cy=\"48\" r=\"8\"></circle>\n </g>\n</svg>" }, "$:/core/images/blank": { "title": "$:/core/images/blank", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\"></svg>" }, "$:/core/images/cancel-button": { "title": "$:/core/images/cancel-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n\t<g fill-rule=\"evenodd\">\n\t <path d=\"M64,76.3137085 L47.0294734,93.2842351 C43.9038742,96.4098343 38.8399231,96.4084656 35.7157288,93.2842712 C32.5978915,90.166434 32.5915506,85.0947409 35.7157649,81.9705266 L52.6862915,65 L35.7157649,48.0294734 C32.5901657,44.9038742 32.5915344,39.8399231 35.7157288,36.7157288 C38.833566,33.5978915 43.9052591,33.5915506 47.0294734,36.7157649 L64,53.6862915 L80.9705266,36.7157649 C84.0961258,33.5901657 89.1600769,33.5915344 92.2842712,36.7157288 C95.4021085,39.833566 95.4084494,44.9052591 92.2842351,48.0294734 L75.3137085,65 L92.2842351,81.9705266 C95.4098343,85.0961258 95.4084656,90.1600769 92.2842712,93.2842712 C89.166434,96.4021085 84.0947409,96.4084494 80.9705266,93.2842351 L64,76.3137085 Z M64,129 C99.346224,129 128,100.346224 128,65 C128,29.653776 99.346224,1 64,1 C28.653776,1 1.13686838e-13,29.653776 1.13686838e-13,65 C1.13686838e-13,100.346224 28.653776,129 64,129 Z M64,113 C90.509668,113 112,91.509668 112,65 C112,38.490332 90.509668,17 64,17 C37.490332,17 16,38.490332 16,65 C16,91.509668 37.490332,113 64,113 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/chevron-down": { "title": "$:/core/images/chevron-down", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-chevron-down tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 40.500000) rotate(-270.000000) translate(-64.000000, -40.500000) translate(-22.500000, -26.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>" }, "$:/core/images/chevron-left": { "title": "$:/core/images/chevron-left", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-chevron-left tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\" version=\"1.1\">\n <g fill-rule=\"evenodd\" transform=\"translate(92.500000, 64.000000) rotate(-180.000000) translate(-92.500000, -64.000000) translate(6.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>" }, "$:/core/images/chevron-right": { "title": "$:/core/images/chevron-right", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-chevron-right tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-48.000000, -3.000000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n </g>\n</svg>" }, "$:/core/images/chevron-up": { "title": "$:/core/images/chevron-up", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-chevron-up tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n\t<g fill-rule=\"evenodd\" transform=\"translate(64.000000, 89.500000) rotate(-90.000000) translate(-64.000000, -89.500000) translate(-22.500000, 22.500000)\">\n <path d=\"M112.743107,112.12741 C111.310627,113.561013 109.331747,114.449239 107.145951,114.449239 L27.9777917,114.449239 C23.6126002,114.449239 20.0618714,110.904826 20.0618714,106.532572 C20.0618714,102.169214 23.6059497,98.6159054 27.9777917,98.6159054 L99.2285381,98.6159054 L99.2285381,27.365159 C99.2285381,22.9999675 102.77295,19.4492387 107.145205,19.4492387 C111.508562,19.4492387 115.061871,22.993317 115.061871,27.365159 L115.061871,106.533318 C115.061871,108.71579 114.175869,110.694669 112.743378,112.127981 Z\" transform=\"translate(67.561871, 66.949239) rotate(-45.000000) translate(-67.561871, -66.949239) \"></path>\n <path d=\"M151.35638,112.12741 C149.923899,113.561013 147.94502,114.449239 145.759224,114.449239 L66.5910645,114.449239 C62.225873,114.449239 58.6751442,110.904826 58.6751442,106.532572 C58.6751442,102.169214 62.2192225,98.6159054 66.5910645,98.6159054 L137.841811,98.6159054 L137.841811,27.365159 C137.841811,22.9999675 141.386223,19.4492387 145.758478,19.4492387 C150.121835,19.4492387 153.675144,22.993317 153.675144,27.365159 L153.675144,106.533318 C153.675144,108.71579 152.789142,110.694669 151.356651,112.127981 Z\" transform=\"translate(106.175144, 66.949239) rotate(-45.000000) translate(-106.175144, -66.949239) \"></path>\n\t</g>\n</svg>" }, "$:/core/images/clone-button": { "title": "$:/core/images/clone-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-clone-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M32.2650915,96 L32.2650915,120.002359 C32.2650915,124.419334 35.8432884,128 40.2627323,128 L120.002359,128 C124.419334,128 128,124.421803 128,120.002359 L128,40.2627323 C128,35.8457573 124.421803,32.2650915 120.002359,32.2650915 L96,32.2650915 L96,48 L108.858899,48 C110.519357,48 111.853018,49.3405131 111.853018,50.9941198 L111.853018,108.858899 C111.853018,110.519357 110.512505,111.853018 108.858899,111.853018 L50.9941198,111.853018 C49.333661,111.853018 48,110.512505 48,108.858899 L48,96 L32.2650915,96 Z\"></path>\n <path d=\"M40,56 L32.0070969,56 C27.5881712,56 24,52.418278 24,48 C24,43.5907123 27.5848994,40 32.0070969,40 L40,40 L40,32.0070969 C40,27.5881712 43.581722,24 48,24 C52.4092877,24 56,27.5848994 56,32.0070969 L56,40 L63.9929031,40 C68.4118288,40 72,43.581722 72,48 C72,52.4092877 68.4151006,56 63.9929031,56 L56,56 L56,63.9929031 C56,68.4118288 52.418278,72 48,72 C43.5907123,72 40,68.4151006 40,63.9929031 L40,56 Z M7.9992458,0 C3.58138434,0 0,3.5881049 0,7.9992458 L0,88.0007542 C0,92.4186157 3.5881049,96 7.9992458,96 L88.0007542,96 C92.4186157,96 96,92.4118951 96,88.0007542 L96,7.9992458 C96,3.58138434 92.4118951,0 88.0007542,0 L7.9992458,0 Z M19.0010118,16 C17.3435988,16 16,17.336731 16,19.0010118 L16,76.9989882 C16,78.6564012 17.336731,80 19.0010118,80 L76.9989882,80 C78.6564012,80 80,78.663269 80,76.9989882 L80,19.0010118 C80,17.3435988 78.663269,16 76.9989882,16 L19.0010118,16 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/close-all-button": { "title": "$:/core/images/close-all-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-close-all-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\" transform=\"translate(-23.000000, -23.000000)\">\n <path d=\"M43,131 L22.9976794,131 C18.5827987,131 15,127.418278 15,123 C15,118.590712 18.5806831,115 22.9976794,115 L43,115 L43,94.9976794 C43,90.5827987 46.581722,87 51,87 C55.4092877,87 59,90.5806831 59,94.9976794 L59,115 L79.0023206,115 C83.4172013,115 87,118.581722 87,123 C87,127.409288 83.4193169,131 79.0023206,131 L59,131 L59,151.002321 C59,155.417201 55.418278,159 51,159 C46.5907123,159 43,155.419317 43,151.002321 L43,131 Z\" transform=\"translate(51.000000, 123.000000) rotate(-45.000000) translate(-51.000000, -123.000000) \"></path>\n <path d=\"M43,59 L22.9976794,59 C18.5827987,59 15,55.418278 15,51 C15,46.5907123 18.5806831,43 22.9976794,43 L43,43 L43,22.9976794 C43,18.5827987 46.581722,15 51,15 C55.4092877,15 59,18.5806831 59,22.9976794 L59,43 L79.0023206,43 C83.4172013,43 87,46.581722 87,51 C87,55.4092877 83.4193169,59 79.0023206,59 L59,59 L59,79.0023206 C59,83.4172013 55.418278,87 51,87 C46.5907123,87 43,83.4193169 43,79.0023206 L43,59 Z\" transform=\"translate(51.000000, 51.000000) rotate(-45.000000) translate(-51.000000, -51.000000) \"></path>\n <path d=\"M115,59 L94.9976794,59 C90.5827987,59 87,55.418278 87,51 C87,46.5907123 90.5806831,43 94.9976794,43 L115,43 L115,22.9976794 C115,18.5827987 118.581722,15 123,15 C127.409288,15 131,18.5806831 131,22.9976794 L131,43 L151.002321,43 C155.417201,43 159,46.581722 159,51 C159,55.4092877 155.419317,59 151.002321,59 L131,59 L131,79.0023206 C131,83.4172013 127.418278,87 123,87 C118.590712,87 115,83.4193169 115,79.0023206 L115,59 Z\" transform=\"translate(123.000000, 51.000000) rotate(-45.000000) translate(-123.000000, -51.000000) \"></path>\n <path d=\"M115,131 L94.9976794,131 C90.5827987,131 87,127.418278 87,123 C87,118.590712 90.5806831,115 94.9976794,115 L115,115 L115,94.9976794 C115,90.5827987 118.581722,87 123,87 C127.409288,87 131,90.5806831 131,94.9976794 L131,115 L151.002321,115 C155.417201,115 159,118.581722 159,123 C159,127.409288 155.419317,131 151.002321,131 L131,131 L131,151.002321 C131,155.417201 127.418278,159 123,159 C118.590712,159 115,155.419317 115,151.002321 L115,131 Z\" transform=\"translate(123.000000, 123.000000) rotate(-45.000000) translate(-123.000000, -123.000000) \"></path>\n </g>\n</svg>" }, "$:/core/images/close-button": { "title": "$:/core/images/close-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M65.0864256,75.4091629 L14.9727349,125.522854 C11.8515951,128.643993 6.78104858,128.64922 3.65685425,125.525026 C0.539017023,122.407189 0.5336324,117.334539 3.65902635,114.209145 L53.7727171,64.0954544 L3.65902635,13.9817637 C0.537886594,10.8606239 0.532659916,5.79007744 3.65685425,2.6658831 C6.77469148,-0.451954124 11.8473409,-0.457338747 14.9727349,2.66805521 L65.0864256,52.7817459 L115.200116,2.66805521 C118.321256,-0.453084553 123.391803,-0.458311231 126.515997,2.6658831 C129.633834,5.78372033 129.639219,10.8563698 126.513825,13.9817637 L76.4001341,64.0954544 L126.513825,114.209145 C129.634965,117.330285 129.640191,122.400831 126.515997,125.525026 C123.39816,128.642863 118.32551,128.648248 115.200116,125.522854 L65.0864256,75.4091629 L65.0864256,75.4091629 Z\"></path>\n </g>\n</svg>\n" }, "$:/core/images/close-others-button": { "title": "$:/core/images/close-others-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-close-others-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z M64,96 C81.673112,96 96,81.673112 96,64 C96,46.326888 81.673112,32 64,32 C46.326888,32 32,46.326888 32,64 C32,81.673112 46.326888,96 64,96 Z M64,80 C72.836556,80 80,72.836556 80,64 C80,55.163444 72.836556,48 64,48 C55.163444,48 48,55.163444 48,64 C48,72.836556 55.163444,80 64,80 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/delete-button": { "title": "$:/core/images/delete-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\" transform=\"translate(12.000000, 0.000000)\">\n <rect x=\"0\" y=\"11\" width=\"105\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"28\" y=\"0\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"8\" y=\"112\" width=\"88\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"56\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n <rect x=\"32\" y=\"16\" width=\"16\" height=\"112\" rx=\"8\"></rect>\n </g>\n</svg>" }, "$:/core/images/done-button": { "title": "$:/core/images/done-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M3.52445141,76.8322939 C2.07397484,75.3828178 1.17514421,73.3795385 1.17514421,71.1666288 L1.17514421,23.1836596 C1.17514421,18.7531992 4.75686621,15.1751442 9.17514421,15.1751442 C13.5844319,15.1751442 17.1751442,18.7606787 17.1751442,23.1836596 L17.1751442,63.1751442 L119.173716,63.1751442 C123.590457,63.1751442 127.175144,66.7568662 127.175144,71.1751442 C127.175144,75.5844319 123.592783,79.1751442 119.173716,79.1751442 L9.17657227,79.1751442 C6.96796403,79.1751442 4.9674142,78.279521 3.51911285,76.8315312 Z\" id=\"Rectangle-285\" transform=\"translate(64.175144, 47.175144) rotate(-45.000000) translate(-64.175144, -47.175144) \"></path>\n </g>\n</svg>" }, "$:/core/images/down-arrow": { "title": "$:/core/images/down-arrow", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <path d=\"M109.35638,81.3533152 C107.923899,82.7869182 105.94502,83.6751442 103.759224,83.6751442 L24.5910645,83.6751442 C20.225873,83.6751442 16.6751442,80.1307318 16.6751442,75.7584775 C16.6751442,71.3951199 20.2192225,67.8418109 24.5910645,67.8418109 L95.8418109,67.8418109 L95.8418109,-3.40893546 C95.8418109,-7.77412698 99.3862233,-11.3248558 103.758478,-11.3248558 C108.121835,-11.3248558 111.675144,-7.78077754 111.675144,-3.40893546 L111.675144,75.7592239 C111.675144,77.9416955 110.789142,79.9205745 109.356651,81.3538862 Z\" transform=\"translate(64.175144, 36.175144) rotate(45.000000) translate(-64.175144, -36.175144) \"></path>\n</svg>" }, "$:/core/images/download-button": { "title": "$:/core/images/download-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-download-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path class=\"tc-image-download-button-ring\" d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"/><path d=\"M34.3496823,66.4308767 L61.2415823,93.634668 C63.0411536,95.4551107 65.9588502,95.4551107 67.7584215,93.634668 L94.6503215,66.4308767 C96.4498928,64.610434 96.4498928,61.6588981 94.6503215,59.8384554 C93.7861334,58.9642445 92.6140473,58.4731195 91.3919019,58.4731195 L82.9324098,58.4731195 C80.3874318,58.4731195 78.3243078,56.3860674 78.3243078,53.8115729 L78.3243078,38.6615466 C78.3243078,36.0870521 76.2611837,34 73.7162058,34 L55.283798,34 C52.7388201,34 50.675696,36.0870521 50.675696,38.6615466 L50.675696,38.6615466 L50.675696,53.8115729 C50.675696,56.3860674 48.612572,58.4731195 46.0675941,58.4731195 L37.608102,58.4731195 C35.063124,58.4731195 33,60.5601716 33,63.134666 C33,64.3709859 33.4854943,65.5566658 34.3496823,66.4308767 L34.3496823,66.4308767 Z\"/></g></svg>" }, "$:/core/images/edit-button": { "title": "$:/core/images/edit-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M116.870058,45.3431458 L108.870058,45.3431458 L108.870058,45.3431458 L108.870058,61.3431458 L116.870058,61.3431458 L116.870058,45.3431458 Z M124.870058,45.3431458 L127.649881,45.3431458 C132.066101,45.3431458 135.656854,48.9248678 135.656854,53.3431458 C135.656854,57.7524334 132.07201,61.3431458 127.649881,61.3431458 L124.870058,61.3431458 L124.870058,45.3431458 Z M100.870058,45.3431458 L15.6638275,45.3431458 C15.5064377,45.3431458 15.3501085,45.3476943 15.1949638,45.3566664 L15.1949638,45.3566664 C15.0628002,45.3477039 14.928279,45.3431458 14.7913977,45.3431458 C6.68160973,45.3431458 -8.34314575,53.3431458 -8.34314575,53.3431458 C-8.34314575,53.3431458 6.85614548,61.3431458 14.7913977,61.3431458 C14.9266533,61.3431458 15.0596543,61.3384973 15.190398,61.3293588 C15.3470529,61.3385075 15.5049057,61.3431458 15.6638275,61.3431458 L100.870058,61.3431458 L100.870058,45.3431458 L100.870058,45.3431458 Z\" transform=\"translate(63.656854, 53.343146) rotate(-45.000000) translate(-63.656854, -53.343146) \"></path>\n <path d=\"M35.1714596,124.189544 C41.9594858,123.613403 49.068777,121.917633 58.85987,118.842282 C60.6854386,118.268877 62.4306907,117.705515 65.1957709,116.802278 C81.1962861,111.575575 87.0734839,109.994907 93.9414474,109.655721 C102.29855,109.242993 107.795169,111.785371 111.520478,118.355045 C112.610163,120.276732 115.051363,120.951203 116.97305,119.861518 C118.894737,118.771832 119.569207,116.330633 118.479522,114.408946 C113.146151,105.003414 104.734907,101.112919 93.5468356,101.66546 C85.6716631,102.054388 79.4899908,103.716944 62.7116783,109.197722 C59.9734132,110.092199 58.2519873,110.64787 56.4625698,111.20992 C37.002649,117.322218 25.6914684,118.282267 16.8654804,112.957098 C14.9739614,111.815848 12.5154166,112.424061 11.3741667,114.31558 C10.2329168,116.207099 10.84113,118.665644 12.7326489,119.806894 C19.0655164,123.627836 26.4866335,124.926678 35.1714596,124.189544 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/export-button": { "title": "$:/core/images/export-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-export-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00348646,127.999999 C8.00464867,128 8.00581094,128 8.00697327,128 L119.993027,128 C122.205254,128 124.207939,127.101378 125.657096,125.651198 L125.656838,125.65759 C127.104563,124.210109 128,122.21009 128,119.999949 L128,56.0000511 C128,51.5817449 124.409288,48 120,48 C115.581722,48 112,51.5797863 112,56.0000511 L112,112 L16,112 L16,56.0000511 C16,51.5817449 12.4092877,48 8,48 C3.581722,48 7.10542736e-15,51.5797863 7.10542736e-15,56.0000511 L7.10542736e-15,119.999949 C7.10542736e-15,124.418255 3.59071231,128 8,128 C8.00116233,128 8.0023246,128 8.00348681,127.999999 Z M56.6235633,27.3113724 L47.6580188,36.2769169 C44.5333664,39.4015692 39.4634864,39.4061295 36.339292,36.2819351 C33.2214548,33.1640979 33.2173444,28.0901742 36.3443103,24.9632084 L58.9616908,2.34582788 C60.5248533,0.782665335 62.5748436,0.000361191261 64.624516,2.38225238e-14 L64.6193616,0.00151809229 C66.6695374,0.000796251595 68.7211167,0.781508799 70.2854358,2.34582788 L92.9028163,24.9632084 C96.0274686,28.0878607 96.0320289,33.1577408 92.9078345,36.2819351 C89.7899973,39.3997724 84.7160736,39.4038827 81.5891078,36.2769169 L72.6235633,27.3113724 L72.6235633,88.5669606 C72.6235633,92.9781015 69.0418413,96.5662064 64.6235633,96.5662064 C60.2142756,96.5662064 56.6235633,92.984822 56.6235633,88.5669606 L56.6235633,27.3113724 L56.6235633,27.3113724 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/full-screen-button": { "title": "$:/core/images/full-screen-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-full-screen-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g>\n <g>\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 104.000000) rotate(-180.000000) translate(-104.000000, -104.000000) translate(80.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(24.000000, 104.000000) rotate(-90.000000) translate(-24.000000, -104.000000) translate(0.000000, 80.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n <g transform=\"translate(104.000000, 24.000000) rotate(90.000000) translate(-104.000000, -24.000000) translate(80.000000, 0.000000)\">\n <path d=\"M5.29777586e-31,8 C1.59060409e-15,3.581722 3.581722,0 8,0 L40,0 C44.418278,0 48,3.581722 48,8 C48,12.418278 44.418278,16 40,16 L16,16 L16,40 C16,44.418278 12.418278,48 8,48 C3.581722,48 -3.55271368e-15,44.418278 0,40 L3.55271368e-15,8 Z\"></path>\n </g>\n </g>\n</svg>" }, "$:/core/images/github": { "title": "$:/core/images/github", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-github tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M63.9383506,1.60695328 C28.6017227,1.60695328 -0.055756057,30.2970814 -0.055756057,65.6906208 C-0.055756057,94.003092 18.2804728,118.019715 43.7123154,126.493393 C46.9143781,127.083482 48.0812647,125.104717 48.0812647,123.405261 C48.0812647,121.886765 48.02626,117.85449 47.9948287,112.508284 C30.1929317,116.379268 26.4368926,103.916587 26.4368926,103.916587 C23.5255693,96.5129372 19.3294921,94.5420399 19.3294921,94.5420399 C13.5186324,90.5687739 19.7695302,90.6474524 19.7695302,90.6474524 C26.1933001,91.099854 29.5721638,97.2525155 29.5721638,97.2525155 C35.2808718,107.044059 44.5531024,104.215566 48.1991321,102.575118 C48.7806109,98.4366275 50.4346826,95.612068 52.2616263,94.0109598 C38.0507543,92.3941159 23.1091047,86.8944862 23.1091047,62.3389152 C23.1091047,55.3443933 25.6039634,49.6205298 29.6978889,45.1437211 C29.0378318,43.5229433 26.8415704,37.0044266 30.3265147,28.1845627 C30.3265147,28.1845627 35.6973364,26.4615028 47.9241083,34.7542205 C53.027764,33.330139 58.5046663,32.6220321 63.9462084,32.5944947 C69.3838216,32.6220321 74.856795,33.330139 79.9683085,34.7542205 C92.1872225,26.4615028 97.5501864,28.1845627 97.5501864,28.1845627 C101.042989,37.0044266 98.8467271,43.5229433 98.190599,45.1437211 C102.292382,49.6205298 104.767596,55.3443933 104.767596,62.3389152 C104.767596,86.9574291 89.8023734,92.3744463 75.5482834,93.9598188 C77.8427675,95.9385839 79.8897303,99.8489072 79.8897303,105.828476 C79.8897303,114.392635 79.8111521,121.304544 79.8111521,123.405261 C79.8111521,125.120453 80.966252,127.114954 84.2115327,126.489459 C109.623731,117.996111 127.944244,93.9952241 127.944244,65.6906208 C127.944244,30.2970814 99.2867652,1.60695328 63.9383506,1.60695328\"></path>\n </g>\n </svg>\n" }, "$:/core/images/globe": { "title": "$:/core/images/globe", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-globe tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M72.8111354,37.1275855 C72.8111354,37.9789875 72.8111354,38.8303894 72.8111354,39.6817913 C72.8111354,41.8784743 73.7885604,46.5631866 72.8111354,48.5143758 C71.3445471,51.4420595 68.1617327,52.0543531 66.4170946,54.3812641 C65.2352215,55.9575873 61.7987417,64.9821523 62.7262858,67.3005778 C66.6959269,77.2228204 74.26087,70.4881886 80.6887657,76.594328 C81.5527211,77.415037 83.5758191,78.8666631 83.985137,79.8899578 C87.2742852,88.1128283 76.4086873,94.8989524 87.7419325,106.189751 C88.9872885,107.430443 91.555495,102.372895 91.8205061,101.575869 C92.6726866,99.0129203 98.5458765,96.1267309 100.908882,94.5234439 C102.928056,93.1534443 105.782168,91.8557166 107.236936,89.7775886 C109.507391,86.5342557 108.717505,82.2640435 110.334606,79.0328716 C112.473794,74.7585014 114.163418,69.3979002 116.332726,65.0674086 C120.230862,57.2857361 121.054075,67.1596684 121.400359,67.5059523 C121.757734,67.8633269 122.411167,67.5059523 122.916571,67.5059523 C123.011132,67.5059523 124.364019,67.6048489 124.432783,67.5059523 C125.0832,66.5705216 123.390209,49.5852316 123.114531,48.2089091 C121.710578,41.1996597 116.17083,32.4278331 111.249523,27.7092761 C104.975994,21.6942076 104.160516,11.5121686 92.9912146,12.7547535 C92.7872931,12.7774397 87.906794,22.9027026 85.2136766,26.2672064 C81.486311,30.9237934 82.7434931,22.1144904 78.6876623,22.1144904 C78.6065806,22.1144904 77.5045497,22.0107615 77.4353971,22.1144904 C76.8488637,22.9942905 75.9952305,26.0101404 75.1288269,26.5311533 C74.8635477,26.6906793 73.4071369,26.2924966 73.2826811,26.5311533 C71.0401728,30.8313939 81.5394677,28.7427264 79.075427,34.482926 C76.7225098,39.9642538 72.747373,32.4860199 72.747373,43.0434079\"></path>\n <path d=\"M44.4668556,7.01044608 C54.151517,13.1403033 45.1489715,19.2084878 47.1611905,23.2253896 C48.8157833,26.5283781 51.4021933,28.6198851 48.8753629,33.038878 C46.8123257,36.6467763 42.0052989,37.0050492 39.251679,39.7621111 C36.2115749,42.8060154 33.7884281,48.7028116 32.4624592,52.6732691 C30.8452419,57.5158356 47.0088721,59.5388126 44.5246867,63.6811917 C43.1386839,65.9923513 37.7785192,65.1466282 36.0880227,63.8791519 C34.9234453,63.0059918 32.4946425,63.3331166 31.6713597,62.0997342 C29.0575851,58.1839669 29.4107339,54.0758543 28.0457962,49.9707786 C27.1076833,47.1493864 21.732611,47.8501656 20.2022714,49.3776393 C19.6790362,49.8998948 19.8723378,51.1703278 19.8723378,51.8829111 C19.8723378,57.1682405 26.9914913,55.1986414 26.9914913,58.3421973 C26.9914913,72.9792302 30.9191897,64.8771867 38.1313873,69.6793121 C48.1678018,76.3618966 45.9763926,76.981595 53.0777543,84.0829567 C56.7511941,87.7563965 60.8192437,87.7689005 62.503478,93.3767069 C64.1046972,98.7081071 53.1759798,98.7157031 50.786754,100.825053 C49.663965,101.816317 47.9736094,104.970571 46.5680513,105.439676 C44.7757187,106.037867 43.334221,105.93607 41.6242359,107.219093 C39.1967302,109.040481 37.7241465,112.151588 37.6034934,112.030935 C35.4555278,109.88297 34.0848666,96.5511248 33.7147244,93.7726273 C33.1258872,89.3524817 28.1241923,88.2337027 26.7275443,84.7420826 C25.1572737,80.8164061 28.2518481,75.223612 25.599097,70.9819941 C19.0797019,60.557804 13.7775712,56.4811506 10.2493953,44.6896152 C9.3074899,41.5416683 13.5912267,38.1609942 15.1264825,35.8570308 C17.0029359,33.0410312 17.7876232,30.0028946 19.8723378,27.2224065 C22.146793,24.1888519 40.8551166,9.46076832 43.8574051,8.63490613 L44.4668556,7.01044608 Z\"></path>\n <path d=\"M64,126 C98.2416545,126 126,98.2416545 126,64 C126,29.7583455 98.2416545,2 64,2 C29.7583455,2 2,29.7583455 2,64 C2,98.2416545 29.7583455,126 64,126 Z M64,120 C94.927946,120 120,94.927946 120,64 C120,33.072054 94.927946,8 64,8 C33.072054,8 8,33.072054 8,64 C8,94.927946 33.072054,120 64,120 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/help": { "title": "$:/core/images/help", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-help tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M36.0548906,111.44117 C30.8157418,115.837088 20.8865444,118.803477 9.5,118.803477 C7.86465619,118.803477 6.25937294,118.742289 4.69372699,118.624467 C12.612543,115.984876 18.7559465,110.02454 21.0611049,102.609942 C8.74739781,92.845129 1.04940554,78.9359851 1.04940554,63.5 C1.04940554,33.9527659 29.2554663,10 64.0494055,10 C98.8433448,10 127.049406,33.9527659 127.049406,63.5 C127.049406,93.0472341 98.8433448,117 64.0494055,117 C53.9936953,117 44.48824,114.999337 36.0548906,111.44117 L36.0548906,111.44117 Z M71.4042554,77.5980086 C71.406883,77.2865764 71.4095079,76.9382011 71.4119569,76.5610548 C71.4199751,75.3262169 71.4242825,74.0811293 71.422912,72.9158546 C71.4215244,71.736154 71.4143321,70.709635 71.4001396,69.8743525 C71.4078362,68.5173028 71.9951951,67.7870427 75.1273009,65.6385471 C75.2388969,65.5619968 76.2124091,64.8981068 76.5126553,64.6910879 C79.6062455,62.5580654 81.5345849,60.9050204 83.2750652,58.5038955 C85.6146327,55.2762841 86.8327108,51.426982 86.8327108,46.8554323 C86.8327108,33.5625756 76.972994,24.9029551 65.3778484,24.9029551 C54.2752771,24.9029551 42.8794554,34.5115163 41.3121702,47.1975534 C40.9043016,50.4989536 43.2499725,53.50591 46.5513726,53.9137786 C49.8527728,54.3216471 52.8597292,51.9759763 53.2675978,48.6745761 C54.0739246,42.1479456 60.2395837,36.9492759 65.3778484,36.9492759 C70.6427674,36.9492759 74.78639,40.5885487 74.78639,46.8554323 C74.78639,50.4892974 73.6853224,52.008304 69.6746221,54.7736715 C69.4052605,54.9593956 68.448509,55.6118556 68.3131127,55.7047319 C65.6309785,57.5445655 64.0858213,58.803255 62.6123358,60.6352315 C60.5044618,63.2559399 59.3714208,66.3518252 59.3547527,69.9487679 C59.3684999,70.8407274 59.3752803,71.8084521 59.3765995,72.9300232 C59.3779294,74.0607297 59.3737237,75.2764258 59.36589,76.482835 C59.3634936,76.8518793 59.3609272,77.1924914 59.3583633,77.4963784 C59.3568319,77.6778944 59.3556368,77.8074256 59.3549845,77.8730928 C59.3219814,81.1994287 61.9917551,83.9227111 65.318091,83.9557142 C68.644427,83.9887173 71.3677093,81.3189435 71.4007124,77.9926076 C71.4014444,77.9187458 71.402672,77.7856841 71.4042554,77.5980086 Z M65.3778489,102.097045 C69.5359735,102.097045 72.9067994,98.7262189 72.9067994,94.5680944 C72.9067994,90.4099698 69.5359735,87.0391439 65.3778489,87.0391439 C61.2197243,87.0391439 57.8488984,90.4099698 57.8488984,94.5680944 C57.8488984,98.7262189 61.2197243,102.097045 65.3778489,102.097045 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/home-button": { "title": "$:/core/images/home-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M112.9847,119.501583 C112.99485,119.336814 113,119.170705 113,119.003406 L113,67.56802 C116.137461,70.5156358 121.076014,70.4518569 124.133985,67.3938855 C127.25818,64.2696912 127.260618,59.2068102 124.131541,56.0777326 L70.3963143,2.34250601 C68.8331348,0.779326498 66.7828947,-0.000743167069 64.7337457,1.61675364e-05 C62.691312,-0.00409949529 60.6426632,0.777559815 59.077717,2.34250601 L33,28.420223 L33,28.420223 L33,8.00697327 C33,3.58484404 29.4092877,0 25,0 C20.581722,0 17,3.59075293 17,8.00697327 L17,44.420223 L5.3424904,56.0777326 C2.21694607,59.2032769 2.22220878,64.2760483 5.34004601,67.3938855 C8.46424034,70.5180798 13.5271213,70.5205187 16.6561989,67.3914411 L17,67.04764 L17,119.993027 C17,119.994189 17.0000002,119.995351 17.0000007,119.996514 C17.0000002,119.997675 17,119.998838 17,120 C17,124.418278 20.5881049,128 24.9992458,128 L105.000754,128 C109.418616,128 113,124.409288 113,120 C113,119.832611 112.99485,119.666422 112.9847,119.501583 Z M97,112 L97,51.5736087 L97,51.5736087 L64.7370156,19.3106244 L33,51.04764 L33,112 L97,112 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/import-button": { "title": "$:/core/images/import-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-import-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M105.449437,94.2138951 C105.449437,94.2138951 110.049457,94.1897106 110.049457,99.4026111 C110.049457,104.615512 105.163246,104.615511 105.163246,104.615511 L45.0075072,105.157833 C45.0075072,105.157833 0.367531803,106.289842 0.367532368,66.6449212 C0.367532934,27.0000003 45.0428249,27.0000003 45.0428249,27.0000003 L105.532495,27.0000003 C105.532495,27.0000003 138.996741,25.6734987 138.996741,55.1771866 C138.996741,84.6808745 105.727102,82.8457535 105.727102,82.8457535 L56.1735087,82.8457535 C56.1735087,82.8457535 22.6899229,85.1500223 22.6899229,66.0913753 C22.6899229,47.0327282 56.1735087,49.3383013 56.1735087,49.3383013 L105.727102,49.3383013 C105.727102,49.3383013 111.245209,49.3383024 111.245209,54.8231115 C111.245209,60.3079206 105.727102,60.5074524 105.727102,60.5074524 L56.1735087,60.5074524 C56.1735087,60.5074524 37.48913,60.5074528 37.48913,66.6449195 C37.48913,72.7823862 56.1735087,71.6766023 56.1735087,71.6766023 L105.727102,71.6766029 C105.727102,71.6766029 127.835546,73.1411469 127.835546,55.1771866 C127.835546,35.5304025 105.727102,38.3035317 105.727102,38.3035317 L45.0428249,38.3035317 C45.0428249,38.3035317 11.5287276,38.3035313 11.5287276,66.6449208 C11.5287276,94.9863103 45.0428244,93.9579678 45.0428244,93.9579678 L105.449437,94.2138951 Z\" transform=\"translate(69.367532, 66.000000) rotate(-45.000000) translate(-69.367532, -66.000000) \"></path>\n </g>\n</svg>" }, "$:/core/images/info-button": { "title": "$:/core/images/info-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <g transform=\"translate(0.049406, 0.000000)\">\n <path d=\"M64,128 C99.346224,128 128,99.346224 128,64 C128,28.653776 99.346224,0 64,0 C28.653776,0 0,28.653776 0,64 C0,99.346224 28.653776,128 64,128 Z M64,112 C90.509668,112 112,90.509668 112,64 C112,37.490332 90.509668,16 64,16 C37.490332,16 16,37.490332 16,64 C16,90.509668 37.490332,112 64,112 Z\"></path>\n <circle cx=\"64\" cy=\"32\" r=\"8\"></circle>\n <rect x=\"56\" y=\"48\" width=\"16\" height=\"56\" rx=\"8\"></rect>\n </g>\n </g>\n </g>\n</svg>" }, "$:/core/images/left-arrow": { "created": "20150315234410875", "modified": "20150315235324760", "tags": "$:/tags/Image", "title": "$:/core/images/left-arrow", "text": "<svg class=\"tc-image-left-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path transform=\"rotate(135, 63.8945, 64.1752)\" d=\"m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25075c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056z\"/>\n</svg>\n" }, "$:/core/images/locked-padlock": { "title": "$:/core/images/locked-padlock", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-locked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M96.4723753,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L32.0000269,64 C32.0028554,48.2766389 32.3030338,16.2688026 64.1594984,16.2688041 C95.9543927,16.2688056 96.4648869,48.325931 96.4723753,64 Z M80.5749059,64 L48.4413579,64 C48.4426205,47.71306 48.5829272,31.9999996 64.1595001,31.9999996 C79.8437473,31.9999996 81.1369461,48.1359182 80.5749059,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/mail": { "title": "$:/core/images/mail", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-mail tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M122.826782,104.894066 C121.945525,105.22777 120.990324,105.41043 119.993027,105.41043 L8.00697327,105.41043 C7.19458381,105.41043 6.41045219,105.289614 5.67161357,105.064967 L5.67161357,105.064967 L39.8346483,70.9019325 L60.6765759,91.7438601 C61.6118278,92.679112 62.8865166,93.0560851 64.0946097,92.8783815 C65.2975108,93.0473238 66.5641085,92.6696979 67.4899463,91.7438601 L88.5941459,70.6396605 C88.6693095,70.7292352 88.7490098,70.8162939 88.8332479,70.9005321 L122.826782,104.894066 Z M127.903244,98.6568194 C127.966933,98.2506602 128,97.8343714 128,97.4103789 L128,33.410481 C128,32.7414504 127.917877,32.0916738 127.763157,31.4706493 L94.2292399,65.0045665 C94.3188145,65.0797417 94.4058701,65.1594458 94.4901021,65.2436778 L127.903244,98.6568194 Z M0.205060636,99.2178117 C0.0709009529,98.6370366 0,98.0320192 0,97.4103789 L0,33.410481 C0,32.694007 0.0944223363,31.9995312 0.27147538,31.3387595 L0.27147538,31.3387595 L34.1777941,65.2450783 L0.205060636,99.2178117 L0.205060636,99.2178117 Z M5.92934613,25.6829218 C6.59211333,25.5051988 7.28862283,25.4104299 8.00697327,25.4104299 L119.993027,25.4104299 C120.759109,25.4104299 121.500064,25.5178649 122.201605,25.7184927 L122.201605,25.7184927 L64.0832611,83.8368368 L5.92934613,25.6829218 L5.92934613,25.6829218 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/menu-button": { "title": "$:/core/images/menu-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <rect x=\"0\" y=\"16\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"56\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n <rect x=\"0\" y=\"96\" width=\"128\" height=\"16\" rx=\"8\"></rect>\n</svg>" }, "$:/core/images/new-button": { "title": "$:/core/images/new-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M56,72 L8.00697327,72 C3.59075293,72 0,68.418278 0,64 C0,59.5907123 3.58484404,56 8.00697327,56 L56,56 L56,8.00697327 C56,3.59075293 59.581722,0 64,0 C68.4092877,0 72,3.58484404 72,8.00697327 L72,56 L119.993027,56 C124.409247,56 128,59.581722 128,64 C128,68.4092877 124.415156,72 119.993027,72 L72,72 L72,119.993027 C72,124.409247 68.418278,128 64,128 C59.5907123,128 56,124.415156 56,119.993027 L56,72 L56,72 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/new-here-button": { "title": "$:/core/images/new-here-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-new-here-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n \t<g transform=\"translate(52.233611, 64.389922) rotate(75.000000) translate(-52.233611, -64.389922) translate(-7.734417, 3.702450)\">\n\t <path d=\"M18.9270186,45.959338 L18.9080585,49.6521741 C18.8884833,53.4648378 21.0574548,58.7482162 23.7526408,61.4434022 L78.5671839,116.257945 C81.2617332,118.952495 85.6348701,118.950391 88.3334363,116.251825 L115.863237,88.7220241 C118.555265,86.0299959 118.564544,81.6509578 115.869358,78.9557717 L61.0548144,24.1412286 C58.3602652,21.4466794 53.0787224,19.2788426 49.2595808,19.3006519 L25.9781737,19.4336012 C22.1633003,19.4553862 19.0471195,22.5673232 19.0275223,26.3842526 L18.9871663,34.2443819 C19.0818862,34.255617 19.1779758,34.2665345 19.2754441,34.2771502 C22.6891275,34.6489512 27.0485594,34.2348566 31.513244,33.2285542 C31.7789418,32.8671684 32.075337,32.5211298 32.4024112,32.1940556 C34.8567584,29.7397084 38.3789778,29.0128681 41.4406288,30.0213822 C41.5958829,29.9543375 41.7503946,29.8866669 41.9041198,29.8183808 L42.1110981,30.2733467 C43.1114373,30.6972371 44.0473796,31.3160521 44.8614145,32.1300869 C48.2842088,35.5528813 48.2555691,41.130967 44.7974459,44.5890903 C41.4339531,47.952583 36.0649346,48.0717177 32.6241879,44.9262969 C27.8170558,45.8919233 23.0726921,46.2881596 18.9270186,45.959338 Z\"></path>\n\t <path d=\"M45.4903462,38.8768094 C36.7300141,42.6833154 26.099618,44.7997354 18.1909048,43.9383587 C7.2512621,42.7468685 1.50150083,35.8404432 4.66865776,24.7010202 C7.51507386,14.6896965 15.4908218,6.92103848 24.3842626,4.38423012 C34.1310219,1.60401701 42.4070208,6.15882777 42.4070209,16.3101169 L34.5379395,16.310117 C34.5379394,11.9285862 31.728784,10.3825286 26.5666962,11.8549876 C20.2597508,13.6540114 14.3453742,19.4148216 12.2444303,26.8041943 C10.4963869,32.9523565 12.6250796,35.5092726 19.0530263,36.2093718 C25.5557042,36.9176104 35.0513021,34.9907189 42.7038419,31.5913902 L42.7421786,31.6756595 C44.3874154,31.5384763 47.8846101,37.3706354 45.9274416,38.6772897 L45.9302799,38.6835285 C45.9166992,38.6895612 45.9031139,38.6955897 45.8895238,38.7016142 C45.8389288,38.7327898 45.7849056,38.7611034 45.7273406,38.7863919 C45.6506459,38.8200841 45.571574,38.8501593 45.4903462,38.8768094 Z\"></path>\n </g>\n <rect x=\"96\" y=\"80\" width=\"16\" height=\"48\" rx=\"8\"></rect>\n <rect x=\"80\" y=\"96\" width=\"48\" height=\"16\" rx=\"8\"></rect>\n </g>\n </g>\n</svg>" }, "$:/core/images/new-journal-button": { "title": "$:/core/images/new-journal-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-new-journal-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M102.545455,112.818182 L102.545455,124.636364 L102.545455,124.636364 L102.545455,124.636364 C102.545455,125.941761 103.630828,127 104.969697,127 L111.030303,127 C112.369172,127 113.454545,125.941761 113.454545,124.636364 L113.454545,112.818182 L125.575758,112.818182 C126.914626,112.818182 128,111.759982 128,110.454545 L128,104.545455 C128,103.240018 126.914626,102.181818 125.575758,102.181818 L113.454545,102.181818 L113.454545,90.3636364 C113.454545,89.0582 112.369172,88 111.030303,88 L104.969697,88 L104.969697,88 C103.630828,88 102.545455,89.0582 102.545455,90.3636364 L102.545455,102.181818 L90.4242424,102.181818 L90.4242424,102.181818 C89.0853705,102.181818 88,103.240018 88,104.545455 L88,110.454545 L88,110.454545 L88,110.454545 C88,111.759982 89.0853705,112.818182 90.4242424,112.818182 L102.545455,112.818182 Z\"></path>\n <g transform=\"translate(59.816987, 64.316987) rotate(30.000000) translate(-59.816987, -64.316987) translate(20.316987, 12.816987)\">\n <g transform=\"translate(0.000000, 0.000000)\">\n <path d=\"M9.99631148,0 C4.4755011,0 -2.27373675e-13,4.48070044 -2.27373675e-13,9.99759461 L-2.27373675e-13,91.6128884 C-2.27373675e-13,97.1344074 4.46966773,101.610483 9.99631148,101.610483 L68.9318917,101.610483 C74.4527021,101.610483 78.9282032,97.1297826 78.9282032,91.6128884 L78.9282032,9.99759461 C78.9282032,4.47607557 74.4585355,0 68.9318917,0 L9.99631148,0 Z M20.8885263,26 C24.2022348,26 26.8885263,23.3137085 26.8885263,20 C26.8885263,16.6862915 24.2022348,14 20.8885263,14 C17.5748178,14 14.8885263,16.6862915 14.8885263,20 C14.8885263,23.3137085 17.5748178,26 20.8885263,26 Z M57.3033321,25.6783342 C60.6170406,25.6783342 63.3033321,22.9920427 63.3033321,19.6783342 C63.3033321,16.3646258 60.6170406,13.6783342 57.3033321,13.6783342 C53.9896236,13.6783342 51.3033321,16.3646258 51.3033321,19.6783342 C51.3033321,22.9920427 53.9896236,25.6783342 57.3033321,25.6783342 Z\"></path>\n <text font-family=\"Helvetica\" font-size=\"47.1724138\" font-weight=\"bold\" fill=\"#FFFFFF\">\n <tspan x=\"42\" y=\"77.4847912\" text-anchor=\"middle\"><<now \"DD\">></tspan>\n </text>\n </g>\n </g>\n </g>\n</svg>" }, "$:/core/images/open-window": { "title": "$:/core/images/open-window", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-open-window tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M16,112 L104.993898,112 C108.863261,112 112,115.590712 112,120 C112,124.418278 108.858091,128 104.993898,128 L7.00610161,128 C3.13673853,128 0,124.409288 0,120 C0,119.998364 4.30952878e-07,119.996727 1.29273572e-06,119.995091 C4.89579306e-07,119.993456 0,119.99182 0,119.990183 L0,24.0098166 C0,19.586117 3.59071231,16 8,16 C12.418278,16 16,19.5838751 16,24.0098166 L16,112 Z\"></path>\n <path d=\"M96,43.1959595 L96,56 C96,60.418278 99.581722,64 104,64 C108.418278,64 112,60.418278 112,56 L112,24 C112,19.5907123 108.415101,16 103.992903,16 L72.0070969,16 C67.5881712,16 64,19.581722 64,24 C64,28.4092877 67.5848994,32 72.0070969,32 L84.5685425,32 L48.2698369,68.2987056 C45.1421332,71.4264093 45.1434327,76.4904296 48.267627,79.614624 C51.3854642,82.7324612 56.4581306,82.7378289 59.5835454,79.6124141 L96,43.1959595 Z M32,7.9992458 C32,3.58138434 35.5881049,0 39.9992458,0 L120.000754,0 C124.418616,0 128,3.5881049 128,7.9992458 L128,88.0007542 C128,92.4186157 124.411895,96 120.000754,96 L39.9992458,96 C35.5813843,96 32,92.4118951 32,88.0007542 L32,7.9992458 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/options-button": { "title": "$:/core/images/options-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-options-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M110.48779,76.0002544 C109.354214,80.4045063 107.611262,84.5641217 105.354171,88.3838625 L105.354171,88.3838625 L112.07833,95.1080219 C115.20107,98.2307613 115.210098,103.299824 112.089164,106.420759 L106.420504,112.089418 C103.301049,115.208874 98.2346851,115.205502 95.1077675,112.078585 L88.3836082,105.354425 C84.5638673,107.611516 80.4042519,109.354468 76,110.488045 L76,110.488045 L76,119.993281 C76,124.409501 72.4220153,128.000254 68.0083475,128.000254 L59.9916525,128.000254 C55.5800761,128.000254 52,124.41541 52,119.993281 L52,110.488045 C47.5957481,109.354468 43.4361327,107.611516 39.6163918,105.354425 L32.8922325,112.078585 C29.7694931,115.201324 24.7004301,115.210353 21.5794957,112.089418 L15.9108363,106.420759 C12.7913807,103.301303 12.7947522,98.2349395 15.9216697,95.1080219 L22.6458291,88.3838625 C20.3887383,84.5641217 18.6457859,80.4045063 17.5122098,76.0002544 L8.00697327,76.0002544 C3.59075293,76.0002544 2.19088375e-16,72.4222697 4.89347582e-16,68.0086019 L9.80228577e-16,59.9919069 C1.25035972e-15,55.5803305 3.58484404,52.0002544 8.00697327,52.0002544 L17.5122098,52.0002544 C18.6457859,47.5960025 20.3887383,43.4363871 22.6458291,39.6166462 L15.9216697,32.8924868 C12.7989304,29.7697475 12.7899019,24.7006845 15.9108363,21.5797501 L21.5794957,15.9110907 C24.6989513,12.7916351 29.7653149,12.7950065 32.8922325,15.9219241 L39.6163918,22.6460835 C43.4361327,20.3889927 47.5957481,18.6460403 52,17.5124642 L52,8.00722764 C52,3.5910073 55.5779847,0.000254375069 59.9916525,0.000254375069 L68.0083475,0.000254375069 C72.4199239,0.000254375069 76,3.58509841 76,8.00722764 L76,17.5124642 C80.4042519,18.6460403 84.5638673,20.3889927 88.3836082,22.6460835 L95.1077675,15.9219241 C98.2305069,12.7991848 103.29957,12.7901562 106.420504,15.9110907 L112.089164,21.5797501 C115.208619,24.6992057 115.205248,29.7655693 112.07833,32.8924868 L105.354171,39.6166462 L105.354171,39.6166462 C107.611262,43.4363871 109.354214,47.5960025 110.48779,52.0002544 L119.993027,52.0002544 C124.409247,52.0002544 128,55.5782391 128,59.9919069 L128,68.0086019 C128,72.4201783 124.415156,76.0002544 119.993027,76.0002544 L110.48779,76.0002544 L110.48779,76.0002544 Z M64,96.0002544 C81.673112,96.0002544 96,81.6733664 96,64.0002544 C96,46.3271424 81.673112,32.0002544 64,32.0002544 C46.326888,32.0002544 32,46.3271424 32,64.0002544 C32,81.6733664 46.326888,96.0002544 64,96.0002544 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/palette": { "title": "$:/core/images/palette", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-palette tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M80.2470434,39.1821571 C75.0645698,38.2680897 69.6261555,37.7814854 64.0193999,37.7814854 C28.6624616,37.7814854 0,57.1324214 0,81.0030106 C0,90.644534 4.67604329,99.5487133 12.5805659,106.738252 C23.5031767,91.1899067 26.3405471,72.3946229 36.8885698,63.5622337 C52.0716764,50.8486559 63.4268694,55.7343343 63.4268694,55.7343343 L80.2470434,39.1821571 Z M106.781666,48.8370714 C119.830962,56.749628 128.0388,68.229191 128.0388,81.0030106 C128.0388,90.3534932 128.557501,98.4142085 116.165191,106.082518 C105.367708,112.763955 112.341384,99.546808 104.321443,95.1851533 C96.3015017,90.8234987 84.3749007,96.492742 86.1084305,103.091059 C89.3087234,115.272303 105.529892,114.54645 92.4224435,119.748569 C79.3149955,124.950687 74.2201582,124.224536 64.0193999,124.224536 C56.1979176,124.224536 48.7040365,123.277578 41.7755684,121.544216 C51.620343,117.347916 69.6563669,109.006202 75.129737,102.088562 C82.7876655,92.4099199 87.3713218,80.0000002 83.3235694,72.4837191 C83.1303943,72.1250117 94.5392656,60.81569 106.781666,48.8370714 Z M1.13430476,123.866563 C0.914084026,123.867944 0.693884185,123.868637 0.473712455,123.868637 C33.9526848,108.928928 22.6351223,59.642592 59.2924543,59.6425917 C59.6085574,61.0606542 59.9358353,62.5865065 60.3541977,64.1372318 C34.4465025,59.9707319 36.7873124,112.168427 1.13429588,123.866563 L1.13430476,123.866563 Z M1.84669213,123.859694 C40.7185279,123.354338 79.9985412,101.513051 79.9985401,79.0466836 C70.7284906,79.0466835 65.9257264,75.5670082 63.1833375,71.1051511 C46.585768,64.1019718 32.81846,116.819636 1.84665952,123.859695 L1.84669213,123.859694 Z M67.1980193,59.8524981 C62.748213,63.9666823 72.0838429,76.2846822 78.5155805,71.1700593 C89.8331416,59.8524993 112.468264,37.2173758 123.785825,25.8998146 C135.103386,14.5822535 123.785825,3.26469247 112.468264,14.5822535 C101.150703,25.8998144 78.9500931,48.9868127 67.1980193,59.8524981 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/permalink-button": { "title": "$:/core/images/permalink-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-permalink-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M80.4834582,48 L73.0956761,80 L73.0956761,80 L47.5165418,80 L54.9043239,48 L80.4834582,48 Z M84.1773493,32 L89.8007299,7.64246248 C90.7941633,3.33942958 95.0918297,0.64641956 99.3968675,1.64031585 C103.693145,2.63218977 106.385414,6.93288901 105.390651,11.2416793 L100.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L96.9043239,48 L89.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L85.8226507,96 L80.1992701,120.357538 C79.2058367,124.66057 74.9081703,127.35358 70.6031325,126.359684 C66.3068546,125.36781 63.6145865,121.067111 64.6093491,116.758321 L69.401785,96 L43.8226507,96 L38.1992701,120.357538 C37.2058367,124.66057 32.9081703,127.35358 28.6031325,126.359684 C24.3068546,125.36781 21.6145865,121.067111 22.6093491,116.758321 L27.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L31.0956761,80 L38.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L42.1773493,32 L47.8007299,7.64246248 C48.7941633,3.33942958 53.0918297,0.64641956 57.3968675,1.64031585 C61.6931454,2.63218977 64.3854135,6.93288901 63.3906509,11.2416793 L58.598215,32 L84.1773493,32 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/permaview-button": { "title": "$:/core/images/permaview-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-permaview-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M81.4834582,48 L79.6365127,56 L79.6365127,56 L74.0573784,56 L75.9043239,48 L81.4834582,48 Z M85.1773493,32 L90.8007299,7.64246248 C91.7941633,3.33942958 96.0918297,0.64641956 100.396867,1.64031585 C104.693145,2.63218977 107.385414,6.93288901 106.390651,11.2416793 L101.598215,32 L104.000754,32 C108.411895,32 112,35.581722 112,40 C112,44.4092877 108.418616,48 104.000754,48 L97.9043239,48 L96.0573784,56 L104.000754,56 C108.411895,56 112,59.581722 112,64 C112,68.4092877 108.418616,72 104.000754,72 L92.3634873,72 L90.5165418,80 L104.000754,80 C108.411895,80 112,83.581722 112,88 C112,92.4092877 108.418616,96 104.000754,96 L86.8226507,96 L81.1992701,120.357538 C80.2058367,124.66057 75.9081703,127.35358 71.6031325,126.359684 C67.3068546,125.36781 64.6145865,121.067111 65.6093491,116.758321 L70.401785,96 L64.8226507,96 L59.1992701,120.357538 C58.2058367,124.66057 53.9081703,127.35358 49.6031325,126.359684 C45.3068546,125.36781 42.6145865,121.067111 43.6093491,116.758321 L48.401785,96 L42.8226507,96 L37.1992701,120.357538 C36.2058367,124.66057 31.9081703,127.35358 27.6031325,126.359684 C23.3068546,125.36781 20.6145865,121.067111 21.6093491,116.758321 L26.401785,96 L23.9992458,96 C19.5881049,96 16,92.418278 16,88 C16,83.5907123 19.5813843,80 23.9992458,80 L30.0956761,80 L31.9426216,72 L23.9992458,72 C19.5881049,72 16,68.418278 16,64 C16,59.5907123 19.5813843,56 23.9992458,56 L35.6365127,56 L37.4834582,48 L23.9992458,48 C19.5881049,48 16,44.418278 16,40 C16,35.5907123 19.5813843,32 23.9992458,32 L41.1773493,32 L46.8007299,7.64246248 C47.7941633,3.33942958 52.0918297,0.64641956 56.3968675,1.64031585 C60.6931454,2.63218977 63.3854135,6.93288901 62.3906509,11.2416793 L57.598215,32 L63.1773493,32 L68.8007299,7.64246248 C69.7941633,3.33942958 74.0918297,0.64641956 78.3968675,1.64031585 C82.6931454,2.63218977 85.3854135,6.93288901 84.3906509,11.2416793 L79.598215,32 L85.1773493,32 Z M53.9043239,48 L52.0573784,56 L57.6365127,56 L59.4834582,48 L53.9043239,48 Z M75.9426216,72 L74.0956761,80 L74.0956761,80 L68.5165418,80 L70.3634873,72 L75.9426216,72 L75.9426216,72 Z M48.3634873,72 L46.5165418,80 L52.0956761,80 L53.9426216,72 L48.3634873,72 L48.3634873,72 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/plugin-generic-language": { "title": "$:/core/images/plugin-generic-language", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M61.2072232,68.1369825 C56.8829239,70.9319564 54.2082892,74.793177 54.2082892,79.0581634 C54.2082892,86.9638335 63.3980995,93.4821994 75.2498076,94.3940006 C77.412197,98.2964184 83.8475284,101.178858 91.5684735,101.403106 C86.4420125,100.27851 82.4506393,97.6624107 80.9477167,94.3948272 C92.8046245,93.4861461 102,86.9662269 102,79.0581634 C102,70.5281905 91.3014611,63.6132813 78.1041446,63.6132813 C71.5054863,63.6132813 65.5315225,65.3420086 61.2072232,68.1369825 Z M74.001066,53.9793443 C69.6767667,56.7743182 63.7028029,58.5030456 57.1041446,58.5030456 C54.4851745,58.5030456 51.9646095,58.2307276 49.6065315,57.7275105 C46.2945155,59.9778212 41.2235699,61.4171743 35.5395922,61.4171743 C35.4545771,61.4171743 35.3696991,61.4168523 35.2849622,61.4162104 C39.404008,60.5235193 42.7961717,58.6691298 44.7630507,56.286533 C37.8379411,53.5817651 33.2082892,48.669413 33.2082892,43.0581634 C33.2082892,34.5281905 43.9068281,27.6132812 57.1041446,27.6132812 C70.3014611,27.6132812 81,34.5281905 81,43.0581634 C81,47.3231498 78.3253653,51.1843704 74.001066,53.9793443 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/plugin-generic-plugin": { "title": "$:/core/images/plugin-generic-plugin", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M40.3972881,76.4456988 L40.3972881,95.3404069 L54.5170166,95.3404069 L54.5170166,95.3404069 C54.5165526,95.3385183 54.516089,95.3366295 54.515626,95.3347404 C54.6093153,95.3385061 54.7034848,95.3404069 54.7980982,95.3404069 C58.6157051,95.3404069 61.710487,92.245625 61.710487,88.4280181 C61.710487,86.6197822 61.01617,84.9737128 59.8795929,83.7418666 L59.8795929,83.7418666 C59.8949905,83.7341665 59.9104102,83.7265043 59.925852,83.7188798 C58.8840576,82.5086663 58.2542926,80.9336277 58.2542926,79.2114996 C58.2542926,75.3938927 61.3490745,72.2991108 65.1666814,72.2991108 C68.9842884,72.2991108 72.0790703,75.3938927 72.0790703,79.2114996 C72.0790703,81.1954221 71.2432806,82.9841354 69.9045961,84.2447446 L69.9045961,84.2447446 C69.9333407,84.2629251 69.9619885,84.281245 69.9905383,84.2997032 L69.9905383,84.2997032 C69.1314315,85.4516923 68.6228758,86.8804654 68.6228758,88.4280181 C68.6228758,91.8584969 71.1218232,94.7053153 74.3986526,95.2474079 C74.3913315,95.2784624 74.3838688,95.3094624 74.3762652,95.3404069 L95.6963988,95.3404069 L95.6963988,75.5678578 L95.6963988,75.5678578 C95.6466539,75.5808558 95.5967614,75.5934886 95.5467242,75.6057531 C95.5504899,75.5120637 95.5523907,75.4178943 95.5523907,75.3232809 C95.5523907,71.505674 92.4576088,68.4108921 88.6400019,68.4108921 C86.831766,68.4108921 85.1856966,69.105209 83.9538504,70.2417862 L83.9538504,70.2417862 C83.9461503,70.2263886 83.938488,70.2109688 83.9308636,70.1955271 C82.7206501,71.2373215 81.1456115,71.8670865 79.4234834,71.8670865 C75.6058765,71.8670865 72.5110946,68.7723046 72.5110946,64.9546976 C72.5110946,61.1370907 75.6058765,58.0423088 79.4234834,58.0423088 C81.4074059,58.0423088 83.1961192,58.8780985 84.4567284,60.2167829 L84.4567284,60.2167829 C84.4749089,60.1880383 84.4932288,60.1593906 84.511687,60.1308407 L84.511687,60.1308407 C85.6636761,60.9899475 87.0924492,61.4985032 88.6400019,61.4985032 C92.0704807,61.4985032 94.9172991,58.9995558 95.4593917,55.7227265 C95.538755,55.7414363 95.6177614,55.761071 95.6963988,55.7816184 L95.6963988,40.0412962 L74.3762652,40.0412962 L74.3762652,40.0412962 C74.3838688,40.0103516 74.3913315,39.9793517 74.3986526,39.9482971 L74.3986526,39.9482971 C71.1218232,39.4062046 68.6228758,36.5593862 68.6228758,33.1289073 C68.6228758,31.5813547 69.1314315,30.1525815 69.9905383,29.0005925 C69.9619885,28.9821342 69.9333407,28.9638143 69.9045961,28.9456339 C71.2432806,27.6850247 72.0790703,25.8963113 72.0790703,23.9123888 C72.0790703,20.0947819 68.9842884,17 65.1666814,17 C61.3490745,17 58.2542926,20.0947819 58.2542926,23.9123888 C58.2542926,25.6345169 58.8840576,27.2095556 59.925852,28.419769 L59.925852,28.419769 C59.9104102,28.4273935 59.8949905,28.4350558 59.8795929,28.4427558 C61.01617,29.674602 61.710487,31.3206715 61.710487,33.1289073 C61.710487,36.9465143 58.6157051,40.0412962 54.7980982,40.0412962 C54.7034848,40.0412962 54.6093153,40.0393953 54.515626,40.0356296 L54.515626,40.0356296 C54.516089,40.0375187 54.5165526,40.0394075 54.5170166,40.0412962 L40.3972881,40.0412962 L40.3972881,52.887664 L40.3972881,52.887664 C40.4916889,53.3430132 40.5412962,53.8147625 40.5412962,54.2980982 C40.5412962,58.1157051 37.4465143,61.210487 33.6289073,61.210487 C32.0813547,61.210487 30.6525815,60.7019313 29.5005925,59.8428245 C29.4821342,59.8713744 29.4638143,59.9000221 29.4456339,59.9287667 C28.1850247,58.5900823 26.3963113,57.7542926 24.4123888,57.7542926 C20.5947819,57.7542926 17.5,60.8490745 17.5,64.6666814 C17.5,68.4842884 20.5947819,71.5790703 24.4123888,71.5790703 C26.134517,71.5790703 27.7095556,70.9493053 28.919769,69.9075109 L28.919769,69.9075109 C28.9273935,69.9229526 28.9350558,69.9383724 28.9427558,69.95377 C30.174602,68.8171928 31.8206715,68.1228758 33.6289073,68.1228758 C37.4465143,68.1228758 40.5412962,71.2176578 40.5412962,75.0352647 C40.5412962,75.5186004 40.4916889,75.9903496 40.3972881,76.4456988 Z M64,0 L118.5596,32 L118.5596,96 L64,128 L9.44039956,96 L9.44039956,32 L64,0 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/plugin-generic-theme": { "title": "$:/core/images/plugin-generic-theme", "tags": "$:/tags/Image", "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M29.4078519,91.4716406 L51.4693474,69.4101451 L51.4646675,69.4054652 C50.5969502,68.5377479 50.5929779,67.1348725 51.4693474,66.2585029 C52.3396494,65.3882009 53.7499654,65.3874786 54.6163097,66.2538229 L64.0805963,75.7181095 C64.9483136,76.5858268 64.9522859,77.9887022 64.0759163,78.8650718 C63.2056143,79.7353737 61.7952984,79.736096 60.9289541,78.8697517 L60.9242741,78.8650718 L60.9242741,78.8650718 L38.8627786,100.926567 C36.2518727,103.537473 32.0187578,103.537473 29.4078519,100.926567 C26.796946,98.3156614 26.796946,94.0825465 29.4078519,91.4716406 Z M60.8017407,66.3810363 C58.3659178,63.6765806 56.3370667,61.2899536 54.9851735,59.5123615 C48.1295381,50.4979488 44.671561,55.2444054 40.7586738,59.5123614 C36.8457866,63.7803174 41.789473,67.2384487 38.0759896,70.2532832 C34.3625062,73.2681177 34.5917646,74.3131575 28.3243876,68.7977024 C22.0570105,63.2822473 21.6235306,61.7636888 24.5005999,58.6166112 C27.3776691,55.4695337 29.7823103,60.4247912 35.6595047,54.8320442 C41.5366991,49.2392972 36.5996215,44.2825646 36.5996215,44.2825646 C36.5996215,44.2825646 48.8365511,19.267683 65.1880231,21.1152173 C81.5394952,22.9627517 59.0022276,18.7228947 53.3962199,38.3410355 C50.9960082,46.7405407 53.8429162,44.7613399 58.3941742,48.3090467 C59.7875202,49.3951602 64.4244828,52.7100463 70.1884353,56.9943417 L90.8648751,36.3179019 L92.4795866,31.5515482 L100.319802,26.8629752 L103.471444,30.0146174 L98.782871,37.8548326 L94.0165173,39.4695441 L73.7934912,59.6925702 C86.4558549,69.2403631 102.104532,81.8392557 102.104532,86.4016913 C102.104533,93.6189834 99.0337832,97.9277545 92.5695848,95.5655717 C87.8765989,93.8506351 73.8015497,80.3744087 63.8173444,69.668717 L60.9242741,72.5617873 L57.7726319,69.4101451 L60.8017407,66.3810363 L60.8017407,66.3810363 Z M63.9533761,1.42108547e-13 L118.512977,32 L118.512977,96 L63.9533761,128 L9.39377563,96 L9.39377563,32 L63.9533761,1.42108547e-13 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/refresh-button": { "title": "$:/core/images/refresh-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-refresh-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M106.369002,39.4325143 C116.529932,60.3119371 112.939592,86.1974934 95.5979797,103.539105 C73.7286194,125.408466 38.2713806,125.408466 16.4020203,103.539105 C-5.46734008,81.6697449 -5.46734008,46.2125061 16.4020203,24.3431458 C19.5262146,21.2189514 24.5915344,21.2189514 27.7157288,24.3431458 C30.8399231,27.4673401 30.8399231,32.5326599 27.7157288,35.6568542 C12.0947571,51.2778259 12.0947571,76.6044251 27.7157288,92.2253967 C43.3367004,107.846368 68.6632996,107.846368 84.2842712,92.2253967 C97.71993,78.7897379 99.5995262,58.1740623 89.9230597,42.729491 L83.4844861,54.9932839 C81.4307001,58.9052072 76.5945372,60.4115251 72.682614,58.3577391 C68.7706907,56.3039532 67.2643728,51.4677903 69.3181587,47.555867 L84.4354914,18.7613158 C86.4966389,14.8353707 91.3577499,13.3347805 95.273202,15.415792 L124.145886,30.7612457 C128.047354,32.8348248 129.52915,37.6785572 127.455571,41.5800249 C125.381992,45.4814927 120.53826,46.9632892 116.636792,44.8897102 L106.369002,39.4325143 Z M98.1470904,27.0648707 C97.9798954,26.8741582 97.811187,26.6843098 97.6409651,26.4953413 L98.6018187,26.1987327 L98.1470904,27.0648707 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/right-arrow": { "title": "$:/core/images/right-arrow", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-right-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <path d=\"M80.3563798,109.353315 C78.9238993,110.786918 76.9450203,111.675144 74.7592239,111.675144 L-4.40893546,111.675144 C-8.77412698,111.675144 -12.3248558,108.130732 -12.3248558,103.758478 C-12.3248558,99.3951199 -8.78077754,95.8418109 -4.40893546,95.8418109 L66.8418109,95.8418109 L66.8418109,24.5910645 C66.8418109,20.225873 70.3862233,16.6751442 74.7584775,16.6751442 C79.1218352,16.6751442 82.6751442,20.2192225 82.6751442,24.5910645 L82.6751442,103.759224 C82.6751442,105.941695 81.7891419,107.920575 80.3566508,109.353886 Z\" transform=\"translate(35.175144, 64.175144) rotate(-45.000000) translate(-35.175144, -64.175144) \"></path>\n</svg>" }, "$:/core/images/save-button": { "title": "$:/core/images/save-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\" width=\"22pt\" height=\"22pt\">\n <g fill-rule=\"evenodd\">\n <path d=\"M120.78304,34.329058 C125.424287,43.1924006 128.049406,53.2778608 128.049406,63.9764502 C128.049406,99.3226742 99.3956295,127.97645 64.0494055,127.97645 C28.7031816,127.97645 0.0494055385,99.3226742 0.0494055385,63.9764502 C0.0494055385,28.6302262 28.7031816,-0.0235498012 64.0494055,-0.0235498012 C82.8568763,-0.0235498012 99.769563,8.08898558 111.479045,21.0056358 L114.159581,18.3250998 C117.289194,15.1954866 122.356036,15.1939641 125.480231,18.3181584 C128.598068,21.4359957 128.601317,26.5107804 125.473289,29.6388083 L120.78304,34.329058 Z M108.72451,46.3875877 C110.870571,51.8341374 112.049406,57.767628 112.049406,63.9764502 C112.049406,90.4861182 90.5590735,111.97645 64.0494055,111.97645 C37.5397375,111.97645 16.0494055,90.4861182 16.0494055,63.9764502 C16.0494055,37.4667822 37.5397375,15.9764502 64.0494055,15.9764502 C78.438886,15.9764502 91.3495036,22.308215 100.147097,32.3375836 L58.9411255,73.5435552 L41.975581,56.5780107 C38.8486152,53.4510448 33.7746915,53.4551552 30.6568542,56.5729924 C27.5326599,59.6971868 27.5372202,64.7670668 30.6618725,67.8917192 L53.279253,90.5090997 C54.8435723,92.073419 56.8951519,92.8541315 58.9380216,92.8558261 C60.987971,92.8559239 63.0389578,92.0731398 64.6049211,90.5071765 L108.72451,46.3875877 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/star-filled": { "title": "$:/core/images/star-filled", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-star-filled tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"nonzero\">\n <path d=\"M61.8361286,96.8228569 L99.1627704,124.110219 C101.883827,126.099427 105.541968,123.420868 104.505636,120.198072 L90.2895569,75.9887263 L89.0292911,79.8977279 L126.314504,52.5528988 C129.032541,50.5595011 127.635256,46.2255025 124.273711,46.2229134 L78.1610486,46.1873965 L81.4604673,48.6032923 L67.1773543,4.41589688 C66.1361365,1.19470104 61.6144265,1.19470104 60.5732087,4.41589688 L46.2900957,48.6032923 L49.5895144,46.1873965 L3.47685231,46.2229134 C0.115307373,46.2255025 -1.28197785,50.5595011 1.43605908,52.5528988 L38.7212719,79.8977279 L37.4610061,75.9887263 L23.2449266,120.198072 C22.2085954,123.420868 25.8667356,126.099427 28.5877926,124.110219 L65.9144344,96.8228569 L61.8361286,96.8228569 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/storyview-classic": { "title": "$:/core/images/storyview-classic", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-storyview-classic tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/storyview-pop": { "title": "$:/core/images/storyview-pop", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-storyview-pop tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.5776607 16,23.9924054 L16,40.0075946 C16,44.4216782 19.5881049,48 23.9992458,48 L104.000754,48 C108.418616,48 112,44.4223393 112,40.0075946 L112,23.9924054 C112,19.5783218 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z M16.0098166,56 C11.586117,56 8,59.5776607 8,63.9924054 L8,80.0075946 C8,84.4216782 11.5838751,88 16.0098166,88 L111.990183,88 C116.413883,88 120,84.4223393 120,80.0075946 L120,63.9924054 C120,59.5783218 116.416125,56 111.990183,56 L16.0098166,56 L16.0098166,56 Z M23.9992458,96 C19.5813843,96 16,99.5907123 16,104 C16,108.418278 19.5881049,112 23.9992458,112 L104.000754,112 C108.418616,112 112,108.409288 112,104 C112,99.581722 108.411895,96 104.000754,96 L23.9992458,96 L23.9992458,96 Z M23.9992458,64 C19.5813843,64 16,67.5907123 16,72 C16,76.418278 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.4092877 112,72 C112,67.581722 108.411895,64 104.000754,64 L23.9992458,64 L23.9992458,64 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/storyview-zoomin": { "title": "$:/core/images/storyview-zoomin", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-storyview-zoomin tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M8.00697327,0 C3.58484404,0 0,3.59075293 0,8.00697327 L0,119.993027 C0,124.415156 3.59075293,128 8.00697327,128 L119.993027,128 C124.415156,128 128,124.409247 128,119.993027 L128,8.00697327 C128,3.58484404 124.409247,0 119.993027,0 L8.00697327,0 L8.00697327,0 Z M23.9992458,16 C19.5813843,16 16,19.578055 16,24.0085154 L16,71.9914846 C16,76.4144655 19.5881049,80 23.9992458,80 L104.000754,80 C108.418616,80 112,76.421945 112,71.9914846 L112,24.0085154 C112,19.5855345 108.411895,16 104.000754,16 L23.9992458,16 L23.9992458,16 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/tag-button": { "title": "$:/core/images/tag-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-tag-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M18.1643182,47.6600756 L18.1677196,51.7651887 C18.1708869,55.5878829 20.3581578,60.8623899 23.0531352,63.5573673 L84.9021823,125.406414 C87.5996731,128.103905 91.971139,128.096834 94.6717387,125.396234 L125.766905,94.3010679 C128.473612,91.5943612 128.472063,87.2264889 125.777085,84.5315115 L63.9280381,22.6824644 C61.2305472,19.9849735 55.9517395,17.801995 52.1318769,17.8010313 L25.0560441,17.7942007 C21.2311475,17.7932358 18.1421354,20.8872832 18.1452985,24.7049463 L18.1535504,34.6641936 C18.2481119,34.6754562 18.3439134,34.6864294 18.4409623,34.6971263 C22.1702157,35.1081705 26.9295004,34.6530132 31.806204,33.5444844 C32.1342781,33.0700515 32.5094815,32.6184036 32.9318197,32.1960654 C35.6385117,29.4893734 39.5490441,28.718649 42.94592,29.8824694 C43.0432142,29.8394357 43.1402334,29.7961748 43.2369683,29.7526887 L43.3646982,30.0368244 C44.566601,30.5115916 45.6933052,31.2351533 46.6655958,32.2074439 C50.4612154,36.0030635 50.4663097,42.1518845 46.6769742,45.94122 C43.0594074,49.5587868 37.2914155,49.7181264 33.4734256,46.422636 C28.1082519,47.5454734 22.7987486,48.0186448 18.1643182,47.6600756 Z\"></path>\n <path d=\"M47.6333528,39.5324628 L47.6562932,39.5834939 C37.9670934,43.9391617 26.0718874,46.3819521 17.260095,45.4107025 C5.27267473,44.0894301 -1.02778744,36.4307276 2.44271359,24.0779512 C5.56175386,12.9761516 14.3014034,4.36129832 24.0466405,1.54817001 C34.7269254,-1.53487574 43.7955833,3.51606438 43.7955834,14.7730751 L35.1728168,14.7730752 C35.1728167,9.91428944 32.0946059,8.19982862 26.4381034,9.83267419 C19.5270911,11.8276553 13.046247,18.2159574 10.7440788,26.4102121 C8.82861123,33.2280582 11.161186,36.0634845 18.2047888,36.8398415 C25.3302805,37.6252244 35.7353482,35.4884477 44.1208333,31.7188498 L44.1475077,31.7781871 C44.159701,31.7725635 44.1718402,31.7671479 44.1839238,31.7619434 C45.9448098,31.0035157 50.4503245,38.3109156 47.7081571,39.5012767 C47.6834429,39.512005 47.6585061,39.5223987 47.6333528,39.5324628 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/theme-button": { "title": "$:/core/images/theme-button", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-theme-button tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M55.854113,66.9453198 C54.3299482,65.1432292 53.0133883,63.518995 51.9542746,62.1263761 C40.8899947,47.578055 35.3091807,55.2383404 28.9941893,62.1263758 C22.6791979,69.0144112 30.6577916,74.5954741 24.6646171,79.4611023 C18.6714426,84.3267304 19.0414417,86.0133155 8.92654943,77.1119468 C-1.18834284,68.2105781 -1.88793412,65.7597832 2.7553553,60.6807286 C7.39864472,55.601674 11.2794845,63.5989423 20.7646627,54.5728325 C30.2498409,45.5467226 22.2819131,37.5470737 22.2819131,37.5470737 C22.2819131,37.5470737 42.0310399,-2.82433362 68.4206088,0.157393922 C94.8101776,3.13912147 58.4373806,-3.70356506 49.3898693,27.958066 C45.5161782,41.5139906 50.1107906,38.3197672 57.4560458,44.0453955 C59.1625767,45.3756367 63.8839488,48.777453 70.127165,53.3625321 C63.9980513,59.2416709 58.9704753,64.0315459 55.854113,66.9453198 Z M67.4952439,79.8919946 C83.5082212,96.9282402 105.237121,117.617674 112.611591,120.312493 C123.044132,124.12481 128.000001,117.170903 128,105.522947 C127.999999,98.3705516 104.170675,78.980486 84.0760493,63.7529565 C76.6683337,70.9090328 70.7000957,76.7055226 67.4952439,79.8919946 Z\"></path>\n <path d=\"M58.2852966,138.232794 L58.2852966,88.3943645 C56.318874,88.3923153 54.7254089,86.7952906 54.7254089,84.8344788 C54.7254089,82.8684071 56.3175932,81.2745911 58.2890859,81.2745911 L79.6408336,81.2745911 C81.608998,81.2745911 83.2045105,82.8724076 83.2045105,84.8344788 C83.2045105,86.7992907 81.614366,88.3923238 79.6446228,88.3943645 L79.6446228,88.3943646 L79.6446228,138.232794 C79.6446228,144.131009 74.8631748,148.912457 68.9649597,148.912457 C63.0667446,148.912457 58.2852966,144.131009 58.2852966,138.232794 Z M65.405072,-14.8423767 L72.5248474,-14.8423767 L76.0847351,-0.690681892 L72.5248474,6.51694947 L72.5248474,81.2745911 L65.405072,81.2745911 L65.405072,6.51694947 L61.8451843,-0.690681892 L65.405072,-14.8423767 Z\" transform=\"translate(68.964960, 67.035040) rotate(45.000000) translate(-68.964960, -67.035040) \"></path>\n </g>\n</svg>" }, "$:/core/images/tip": { "title": "$:/core/images/tip", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-tip tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,128.241818 C99.346224,128.241818 128,99.5880417 128,64.2418177 C128,28.8955937 99.346224,0.241817675 64,0.241817675 C28.653776,0.241817675 0,28.8955937 0,64.2418177 C0,99.5880417 28.653776,128.241818 64,128.241818 Z M75.9358659,91.4531941 C75.3115438,95.581915 70.2059206,98.8016748 64,98.8016748 C57.7940794,98.8016748 52.6884562,95.581915 52.0641341,91.4531941 C54.3299053,94.0502127 58.8248941,95.8192805 64,95.8192805 C69.1751059,95.8192805 73.6700947,94.0502127 75.9358659,91.4531941 L75.9358659,91.4531941 Z M75.9358659,95.9453413 C75.3115438,100.074062 70.2059206,103.293822 64,103.293822 C57.7940794,103.293822 52.6884562,100.074062 52.0641341,95.9453413 C54.3299053,98.5423599 58.8248941,100.311428 64,100.311428 C69.1751059,100.311428 73.6700947,98.5423599 75.9358659,95.9453413 L75.9358659,95.9453413 Z M75.9358659,100.40119 C75.3115438,104.529911 70.2059206,107.74967 64,107.74967 C57.7940794,107.74967 52.6884562,104.529911 52.0641341,100.40119 C54.3299053,102.998208 58.8248941,104.767276 64,104.767276 C69.1751059,104.767276 73.6700947,102.998208 75.9358659,100.40119 L75.9358659,100.40119 Z M75.9358659,104.893337 C75.3115438,109.022058 70.2059206,112.241818 64,112.241818 C57.7940794,112.241818 52.6884562,109.022058 52.0641341,104.893337 C54.3299053,107.490356 58.8248941,109.259423 64,109.259423 C69.1751059,109.259423 73.6700947,107.490356 75.9358659,104.893337 L75.9358659,104.893337 Z M64.3010456,24.2418177 C75.9193117,24.2418188 88.0000013,32.0619847 88,48.4419659 C87.9999987,64.8219472 75.9193018,71.7540963 75.9193021,83.5755932 C75.9193022,89.4486648 70.0521957,92.8368862 63.9999994,92.8368862 C57.947803,92.8368862 51.9731007,89.8295115 51.9731007,83.5755932 C51.9731007,71.1469799 39.9999998,65.4700602 40,48.4419647 C40.0000002,31.4138691 52.6827796,24.2418166 64.3010456,24.2418177 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/twitter": { "title": "$:/core/images/twitter", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-twitter tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M41.6263422,115.803477 C27.0279663,115.803477 13.4398394,111.540813 1.99987456,104.234833 C4.02221627,104.472643 6.08004574,104.594302 8.16644978,104.594302 C20.277456,104.594302 31.4238403,100.47763 40.270894,93.5715185 C28.9590538,93.3635501 19.4123842,85.9189246 16.1230832,75.6885328 C17.7011365,75.9892376 19.320669,76.1503787 20.9862896,76.1503787 C23.344152,76.1503787 25.6278127,75.8359011 27.7971751,75.247346 C15.9709927,72.8821073 7.06079851,62.4745062 7.06079851,49.9982394 C7.06079851,49.8898938 7.06079851,49.7820074 7.06264203,49.67458 C10.5482779,51.6032228 14.5339687,52.7615103 18.7717609,52.8951059 C11.8355159,48.277565 7.2714207,40.3958845 7.2714207,31.4624258 C7.2714207,26.7434257 8.54621495,22.3200804 10.7713439,18.5169676 C23.5211299,34.0957738 42.568842,44.3472839 64.0532269,45.4210985 C63.6126256,43.5365285 63.3835682,41.5711584 63.3835682,39.5529928 C63.3835682,25.3326379 74.95811,13.8034766 89.2347917,13.8034766 C96.6697089,13.8034766 103.387958,16.930807 108.103682,21.9353619 C113.991886,20.780288 119.52429,18.6372496 124.518847,15.6866694 C122.588682,21.6993889 118.490075,26.7457211 113.152623,29.9327334 C118.381769,29.3102055 123.363882,27.926045 127.999875,25.8780385 C124.534056,31.0418981 120.151087,35.5772616 115.100763,39.2077561 C115.150538,40.3118708 115.175426,41.4224128 115.175426,42.538923 C115.175426,76.5663154 89.1744164,115.803477 41.6263422,115.803477\"></path>\n </g>\n</svg>\n" }, "$:/core/images/unlocked-padlock": { "title": "$:/core/images/unlocked-padlock", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-unlocked-padlock tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M48.6266053,64 L105,64 L105,96.0097716 C105,113.673909 90.6736461,128 73.001193,128 L55.998807,128 C38.3179793,128 24,113.677487 24,96.0097716 L24,64 L30.136303,64 C19.6806213,51.3490406 2.77158986,28.2115132 25.8366966,8.85759246 C50.4723026,-11.8141335 71.6711028,13.2108337 81.613302,25.0594855 C91.5555012,36.9081373 78.9368488,47.4964439 69.1559674,34.9513593 C59.375086,22.4062748 47.9893192,10.8049522 35.9485154,20.9083862 C23.9077117,31.0118202 34.192312,43.2685325 44.7624679,55.8655518 C47.229397,58.805523 48.403443,61.5979188 48.6266053,64 Z M67.7315279,92.3641717 C70.8232551,91.0923621 73,88.0503841 73,84.5 C73,79.8055796 69.1944204,76 64.5,76 C59.8055796,76 56,79.8055796 56,84.5 C56,87.947435 58.0523387,90.9155206 61.0018621,92.2491029 L55.9067479,115.020857 L72.8008958,115.020857 L67.7315279,92.3641717 L67.7315279,92.3641717 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/up-arrow": { "created": "20150316000544368", "modified": "20150316000831867", "tags": "$:/tags/Image", "title": "$:/core/images/up-arrow", "text": "<svg class=\"tc-image-up-arrow tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n<path transform=\"rotate(-135, 63.8945, 64.1752)\" d=\"m109.07576,109.35336c-1.43248,1.43361 -3.41136,2.32182 -5.59717,2.32182l-79.16816,0c-4.36519,0 -7.91592,-3.5444 -7.91592,-7.91666c0,-4.36337 3.54408,-7.91667 7.91592,-7.91667l71.25075,0l0,-71.25074c0,-4.3652 3.54442,-7.91592 7.91667,-7.91592c4.36336,0 7.91667,3.54408 7.91667,7.91592l0,79.16815c0,2.1825 -0.88602,4.16136 -2.3185,5.59467l-0.00027,-0.00056l0.00001,-0.00001z\" />\n</svg>\n \n" }, "$:/core/images/video": { "title": "$:/core/images/video", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-video tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M64,12 C29.0909091,12 8.72727273,14.9166667 5.81818182,17.8333333 C2.90909091,20.75 1.93784382e-15,41.1666667 0,64.5 C1.93784382e-15,87.8333333 2.90909091,108.25 5.81818182,111.166667 C8.72727273,114.083333 29.0909091,117 64,117 C98.9090909,117 119.272727,114.083333 122.181818,111.166667 C125.090909,108.25 128,87.8333333 128,64.5 C128,41.1666667 125.090909,20.75 122.181818,17.8333333 C119.272727,14.9166667 98.9090909,12 64,12 Z M54.9161194,44.6182253 C51.102648,42.0759111 48.0112186,43.7391738 48.0112186,48.3159447 L48.0112186,79.6840553 C48.0112186,84.2685636 51.109784,85.9193316 54.9161194,83.3817747 L77.0838806,68.6032672 C80.897352,66.0609529 80.890216,61.9342897 77.0838806,59.3967328 L54.9161194,44.6182253 Z\"></path>\n </g>\n</svg>" }, "$:/core/images/warning": { "title": "$:/core/images/warning", "tags": "$:/tags/Image", "text": "<svg class=\"tc-image-warning tc-image-button\" width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\">\n <g fill-rule=\"evenodd\">\n <path d=\"M57.0717968,11 C60.1509982,5.66666667 67.8490018,5.66666667 70.9282032,11 L126.353829,107 C129.433031,112.333333 125.584029,119 119.425626,119 L8.57437416,119 C2.41597129,119 -1.43303051,112.333333 1.64617093,107 L57.0717968,11 Z M64,37 C59.581722,37 56,40.5820489 56,44.9935776 L56,73.0064224 C56,77.4211534 59.5907123,81 64,81 C68.418278,81 72,77.4179511 72,73.0064224 L72,44.9935776 C72,40.5788466 68.4092877,37 64,37 Z M64,104 C68.418278,104 72,100.418278 72,96 C72,91.581722 68.418278,88 64,88 C59.581722,88 56,91.581722 56,96 C56,100.418278 59.581722,104 64,104 Z\"></path>\n </g>\n</svg>" }, "$:/language/Buttons/AdvancedSearch/Caption": { "title": "$:/language/Buttons/AdvancedSearch/Caption", "text": "advanced search" }, "$:/language/Buttons/AdvancedSearch/Hint": { "title": "$:/language/Buttons/AdvancedSearch/Hint", "text": "Advanced search" }, "$:/language/Buttons/Cancel/Caption": { "title": "$:/language/Buttons/Cancel/Caption", "text": "cancel" }, "$:/language/Buttons/Cancel/Hint": { "title": "$:/language/Buttons/Cancel/Hint", "text": "Discard changes to this tiddler" }, "$:/language/Buttons/Clone/Caption": { "title": "$:/language/Buttons/Clone/Caption", "text": "clone" }, "$:/language/Buttons/Clone/Hint": { "title": "$:/language/Buttons/Clone/Hint", "text": "Clone this tiddler" }, "$:/language/Buttons/Close/Caption": { "title": "$:/language/Buttons/Close/Caption", "text": "close" }, "$:/language/Buttons/Close/Hint": { "title": "$:/language/Buttons/Close/Hint", "text": "Close this tiddler" }, "$:/language/Buttons/CloseAll/Caption": { "title": "$:/language/Buttons/CloseAll/Caption", "text": "close all" }, "$:/language/Buttons/CloseAll/Hint": { "title": "$:/language/Buttons/CloseAll/Hint", "text": "Close all tiddlers" }, "$:/language/Buttons/CloseOthers/Caption": { "title": "$:/language/Buttons/CloseOthers/Caption", "text": "close others" }, "$:/language/Buttons/CloseOthers/Hint": { "title": "$:/language/Buttons/CloseOthers/Hint", "text": "Close other tiddlers" }, "$:/language/Buttons/ControlPanel/Caption": { "title": "$:/language/Buttons/ControlPanel/Caption", "text": "control panel" }, "$:/language/Buttons/ControlPanel/Hint": { "title": "$:/language/Buttons/ControlPanel/Hint", "text": "Open control panel" }, "$:/language/Buttons/Delete/Caption": { "title": "$:/language/Buttons/Delete/Caption", "text": "delete" }, "$:/language/Buttons/Delete/Hint": { "title": "$:/language/Buttons/Delete/Hint", "text": "Delete this tiddler" }, "$:/language/Buttons/Edit/Caption": { "title": "$:/language/Buttons/Edit/Caption", "text": "edit" }, "$:/language/Buttons/Edit/Hint": { "title": "$:/language/Buttons/Edit/Hint", "text": "Edit this tiddler" }, "$:/language/Buttons/Encryption/Caption": { "title": "$:/language/Buttons/Encryption/Caption", "text": "encryption" }, "$:/language/Buttons/Encryption/Hint": { "title": "$:/language/Buttons/Encryption/Hint", "text": "Set or clear a password for saving this wiki" }, "$:/language/Buttons/Encryption/ClearPassword/Caption": { "title": "$:/language/Buttons/Encryption/ClearPassword/Caption", "text": "clear password" }, "$:/language/Buttons/Encryption/ClearPassword/Hint": { "title": "$:/language/Buttons/Encryption/ClearPassword/Hint", "text": "Clear the password and save this wiki without encryption" }, "$:/language/Buttons/Encryption/SetPassword/Caption": { "title": "$:/language/Buttons/Encryption/SetPassword/Caption", "text": "set password" }, "$:/language/Buttons/Encryption/SetPassword/Hint": { "title": "$:/language/Buttons/Encryption/SetPassword/Hint", "text": "Set a password for saving this wiki with encryption" }, "$:/language/Buttons/ExportPage/Caption": { "title": "$:/language/Buttons/ExportPage/Caption", "text": "export all" }, "$:/language/Buttons/ExportPage/Hint": { "title": "$:/language/Buttons/ExportPage/Hint", "text": "Export all tiddlers" }, "$:/language/Buttons/ExportTiddler/Caption": { "title": "$:/language/Buttons/ExportTiddler/Caption", "text": "export tiddler" }, "$:/language/Buttons/ExportTiddler/Hint": { "title": "$:/language/Buttons/ExportTiddler/Hint", "text": "Export tiddler" }, "$:/language/Buttons/ExportTiddlers/Caption": { "title": "$:/language/Buttons/ExportTiddlers/Caption", "text": "export tiddlers" }, "$:/language/Buttons/ExportTiddlers/Hint": { "title": "$:/language/Buttons/ExportTiddlers/Hint", "text": "Export tiddlers" }, "$:/language/Buttons/FullScreen/Caption": { "title": "$:/language/Buttons/FullScreen/Caption", "text": "full-screen" }, "$:/language/Buttons/FullScreen/Hint": { "title": "$:/language/Buttons/FullScreen/Hint", "text": "Enter or leave full-screen mode" }, "$:/language/Buttons/Help/Caption": { "title": "$:/language/Buttons/Help/Caption", "text": "help" }, "$:/language/Buttons/Help/Hint": { "title": "$:/language/Buttons/Help/Hint", "text": "Show help panel" }, "$:/language/Buttons/Import/Caption": { "title": "$:/language/Buttons/Import/Caption", "text": "import" }, "$:/language/Buttons/Import/Hint": { "title": "$:/language/Buttons/Import/Hint", "text": "Import files" }, "$:/language/Buttons/Info/Caption": { "title": "$:/language/Buttons/Info/Caption", "text": "info" }, "$:/language/Buttons/Info/Hint": { "title": "$:/language/Buttons/Info/Hint", "text": "Show information for this tiddler" }, "$:/language/Buttons/Home/Caption": { "title": "$:/language/Buttons/Home/Caption", "text": "home" }, "$:/language/Buttons/Home/Hint": { "title": "$:/language/Buttons/Home/Hint", "text": "Open the default tiddlers" }, "$:/language/Buttons/Language/Caption": { "title": "$:/language/Buttons/Language/Caption", "text": "language" }, "$:/language/Buttons/Language/Hint": { "title": "$:/language/Buttons/Language/Hint", "text": "Choose the user interface language" }, "$:/language/Buttons/More/Caption": { "title": "$:/language/Buttons/More/Caption", "text": "more" }, "$:/language/Buttons/More/Hint": { "title": "$:/language/Buttons/More/Hint", "text": "More actions" }, "$:/language/Buttons/NewHere/Caption": { "title": "$:/language/Buttons/NewHere/Caption", "text": "new here" }, "$:/language/Buttons/NewHere/Hint": { "title": "$:/language/Buttons/NewHere/Hint", "text": "Create a new tiddler tagged with this one" }, "$:/language/Buttons/NewJournal/Caption": { "title": "$:/language/Buttons/NewJournal/Caption", "text": "new journal" }, "$:/language/Buttons/NewJournal/Hint": { "title": "$:/language/Buttons/NewJournal/Hint", "text": "Create a new journal tiddler" }, "$:/language/Buttons/NewJournalHere/Caption": { "title": "$:/language/Buttons/NewJournalHere/Caption", "text": "new journal here" }, "$:/language/Buttons/NewJournalHere/Hint": { "title": "$:/language/Buttons/NewJournalHere/Hint", "text": "Create a new journal tiddler tagged with this one" }, "$:/language/Buttons/NewTiddler/Caption": { "title": "$:/language/Buttons/NewTiddler/Caption", "text": "new tiddler" }, "$:/language/Buttons/NewTiddler/Hint": { "title": "$:/language/Buttons/NewTiddler/Hint", "text": "Create a new tiddler" }, "$:/language/Buttons/OpenWindow/Caption": { "title": "$:/language/Buttons/OpenWindow/Caption", "text": "open in new window" }, "$:/language/Buttons/OpenWindow/Hint": { "title": "$:/language/Buttons/OpenWindow/Hint", "text": "Open tiddler in new window" }, "$:/language/Buttons/Palette/Caption": { "title": "$:/language/Buttons/Palette/Caption", "text": "palette" }, "$:/language/Buttons/Palette/Hint": { "title": "$:/language/Buttons/Palette/Hint", "text": "Choose the colour palette" }, "$:/language/Buttons/Permalink/Caption": { "title": "$:/language/Buttons/Permalink/Caption", "text": "permalink" }, "$:/language/Buttons/Permalink/Hint": { "title": "$:/language/Buttons/Permalink/Hint", "text": "Set browser address bar to a direct link to this tiddler" }, "$:/language/Buttons/Permaview/Caption": { "title": "$:/language/Buttons/Permaview/Caption", "text": "permaview" }, "$:/language/Buttons/Permaview/Hint": { "title": "$:/language/Buttons/Permaview/Hint", "text": "Set browser address bar to a direct link to all the tiddlers in this story" }, "$:/language/Buttons/Refresh/Caption": { "title": "$:/language/Buttons/Refresh/Caption", "text": "refresh" }, "$:/language/Buttons/Refresh/Hint": { "title": "$:/language/Buttons/Refresh/Hint", "text": "Perform a full refresh of the wiki" }, "$:/language/Buttons/Save/Caption": { "title": "$:/language/Buttons/Save/Caption", "text": "ok" }, "$:/language/Buttons/Save/Hint": { "title": "$:/language/Buttons/Save/Hint", "text": "Confirm changes to this tiddler" }, "$:/language/Buttons/SaveWiki/Caption": { "title": "$:/language/Buttons/SaveWiki/Caption", "text": "save changes" }, "$:/language/Buttons/SaveWiki/Hint": { "title": "$:/language/Buttons/SaveWiki/Hint", "text": "Save changes" }, "$:/language/Buttons/StoryView/Caption": { "title": "$:/language/Buttons/StoryView/Caption", "text": "storyview" }, "$:/language/Buttons/StoryView/Hint": { "title": "$:/language/Buttons/StoryView/Hint", "text": "Choose the story visualisation" }, "$:/language/Buttons/HideSideBar/Caption": { "title": "$:/language/Buttons/HideSideBar/Caption", "text": "hide sidebar" }, "$:/language/Buttons/HideSideBar/Hint": { "title": "$:/language/Buttons/HideSideBar/Hint", "text": "Hide sidebar" }, "$:/language/Buttons/ShowSideBar/Caption": { "title": "$:/language/Buttons/ShowSideBar/Caption", "text": "show sidebar" }, "$:/language/Buttons/ShowSideBar/Hint": { "title": "$:/language/Buttons/ShowSideBar/Hint", "text": "Show sidebar" }, "$:/language/Buttons/TagManager/Caption": { "title": "$:/language/Buttons/TagManager/Caption", "text": "tag manager" }, "$:/language/Buttons/TagManager/Hint": { "title": "$:/language/Buttons/TagManager/Hint", "text": "Open tag manager" }, "$:/language/Buttons/Theme/Caption": { "title": "$:/language/Buttons/Theme/Caption", "text": "theme" }, "$:/language/Buttons/Theme/Hint": { "title": "$:/language/Buttons/Theme/Hint", "text": "Choose the display theme" }, "$:/language/ControlPanel/Advanced/Caption": { "title": "$:/language/ControlPanel/Advanced/Caption", "text": "Advanced" }, "$:/language/ControlPanel/Advanced/Hint": { "title": "$:/language/ControlPanel/Advanced/Hint", "text": "Internal information about this TiddlyWiki" }, "$:/language/ControlPanel/Appearance/Caption": { "title": "$:/language/ControlPanel/Appearance/Caption", "text": "Appearance" }, "$:/language/ControlPanel/Appearance/Hint": { "title": "$:/language/ControlPanel/Appearance/Hint", "text": "Ways to customise the appearance of your TiddlyWiki." }, "$:/language/ControlPanel/Basics/AnimDuration/Prompt": { "title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt", "text": "Animation duration:" }, "$:/language/ControlPanel/Basics/Caption": { "title": "$:/language/ControlPanel/Basics/Caption", "text": "Basics" }, "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": { "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint", "text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>" }, "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt", "text": "Default tiddlers:" }, "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": { "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint", "text": "Choose which tiddlers are displayed at startup:" }, "$:/language/ControlPanel/Basics/Language/Prompt": { "title": "$:/language/ControlPanel/Basics/Language/Prompt", "text": "Hello! Current language:" }, "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": { "title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt", "text": "Title of new journal tiddlers" }, "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": { "title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt", "text": "Tags for new journal tiddlers" }, "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt", "text": "Number of overridden shadow tiddlers:" }, "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt", "text": "Number of shadow tiddlers:" }, "$:/language/ControlPanel/Basics/Subtitle/Prompt": { "title": "$:/language/ControlPanel/Basics/Subtitle/Prompt", "text": "Subtitle:" }, "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt", "text": "Number of system tiddlers:" }, "$:/language/ControlPanel/Basics/Tags/Prompt": { "title": "$:/language/ControlPanel/Basics/Tags/Prompt", "text": "Number of tags:" }, "$:/language/ControlPanel/Basics/Tiddlers/Prompt": { "title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt", "text": "Number of tiddlers:" }, "$:/language/ControlPanel/Basics/Title/Prompt": { "title": "$:/language/ControlPanel/Basics/Title/Prompt", "text": "Title of this ~TiddlyWiki:" }, "$:/language/ControlPanel/Basics/Username/Prompt": { "title": "$:/language/ControlPanel/Basics/Username/Prompt", "text": "Username for signing edits:" }, "$:/language/ControlPanel/Basics/Version/Prompt": { "title": "$:/language/ControlPanel/Basics/Version/Prompt", "text": "~TiddlyWiki version:" }, "$:/language/ControlPanel/EditorTypes/Caption": { "title": "$:/language/ControlPanel/EditorTypes/Caption", "text": "Editor Types" }, "$:/language/ControlPanel/EditorTypes/Editor/Caption": { "title": "$:/language/ControlPanel/EditorTypes/Editor/Caption", "text": "Editor" }, "$:/language/ControlPanel/EditorTypes/Hint": { "title": "$:/language/ControlPanel/EditorTypes/Hint", "text": "These tiddlers determine which editor is used to edit specific tiddler types." }, "$:/language/ControlPanel/EditorTypes/Type/Caption": { "title": "$:/language/ControlPanel/EditorTypes/Type/Caption", "text": "Type" }, "$:/language/ControlPanel/Info/Caption": { "title": "$:/language/ControlPanel/Info/Caption", "text": "Info" }, "$:/language/ControlPanel/Info/Hint": { "title": "$:/language/ControlPanel/Info/Hint", "text": "Information about this TiddlyWiki" }, "$:/language/ControlPanel/LoadedModules/Caption": { "title": "$:/language/ControlPanel/LoadedModules/Caption", "text": "Loaded Modules" }, "$:/language/ControlPanel/LoadedModules/Hint": { "title": "$:/language/ControlPanel/LoadedModules/Hint", "text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process." }, "$:/language/ControlPanel/Palette/Caption": { "title": "$:/language/ControlPanel/Palette/Caption", "text": "Palette" }, "$:/language/ControlPanel/Palette/Editor/Clone/Caption": { "title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption", "text": "clone" }, "$:/language/ControlPanel/Palette/Editor/Clone/Prompt": { "title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt", "text": "It is recommended that you clone this shadow palette before editing it" }, "$:/language/ControlPanel/Palette/Editor/Prompt/Modified": { "title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified", "text": "This shadow palette has been modified" }, "$:/language/ControlPanel/Palette/Editor/Prompt": { "title": "$:/language/ControlPanel/Palette/Editor/Prompt", "text": "Editing" }, "$:/language/ControlPanel/Palette/Editor/Reset/Caption": { "title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption", "text": "reset" }, "$:/language/ControlPanel/Palette/HideEditor/Caption": { "title": "$:/language/ControlPanel/Palette/HideEditor/Caption", "text": "hide editor" }, "$:/language/ControlPanel/Palette/Prompt": { "title": "$:/language/ControlPanel/Palette/Prompt", "text": "Current palette:" }, "$:/language/ControlPanel/Palette/ShowEditor/Caption": { "title": "$:/language/ControlPanel/Palette/ShowEditor/Caption", "text": "show editor" }, "$:/language/ControlPanel/Plugins/Add/Hint": { "title": "$:/language/ControlPanel/Plugins/Add/Hint", "text": "Install plugins from the official library" }, "$:/language/ControlPanel/Plugins/Add/Caption": { "title": "$:/language/ControlPanel/Plugins/Add/Caption", "text": "Get more plugins" }, "$:/language/ControlPanel/Plugins/Caption": { "title": "$:/language/ControlPanel/Plugins/Caption", "text": "Plugins" }, "$:/language/ControlPanel/Plugins/Disable/Caption": { "title": "$:/language/ControlPanel/Plugins/Disable/Caption", "text": "disable" }, "$:/language/ControlPanel/Plugins/Disable/Hint": { "title": "$:/language/ControlPanel/Plugins/Disable/Hint", "text": "Disable this plugin when reloading page" }, "$:/language/ControlPanel/Plugins/Disabled/Status": { "title": "$:/language/ControlPanel/Plugins/Disabled/Status", "text": "(disabled)" }, "$:/language/ControlPanel/Plugins/Empty/Hint": { "title": "$:/language/ControlPanel/Plugins/Empty/Hint", "text": "None" }, "$:/language/ControlPanel/Plugins/Enable/Caption": { "title": "$:/language/ControlPanel/Plugins/Enable/Caption", "text": "enable" }, "$:/language/ControlPanel/Plugins/Enable/Hint": { "title": "$:/language/ControlPanel/Plugins/Enable/Hint", "text": "Enable this plugin when reloading page" }, "$:/language/ControlPanel/Plugins/Installed/Hint": { "title": "$:/language/ControlPanel/Plugins/Installed/Hint", "text": "Currently installed plugins:" }, "$:/language/ControlPanel/Plugins/Languages/Caption": { "title": "$:/language/ControlPanel/Plugins/Languages/Caption", "text": "Languages" }, "$:/language/ControlPanel/Plugins/Languages/Hint": { "title": "$:/language/ControlPanel/Plugins/Languages/Hint", "text": "Language pack plugins" }, "$:/language/ControlPanel/Plugins/Plugins/Caption": { "title": "$:/language/ControlPanel/Plugins/Plugins/Caption", "text": "Plugins" }, "$:/language/ControlPanel/Plugins/Plugins/Hint": { "title": "$:/language/ControlPanel/Plugins/Plugins/Hint", "text": "Plugins" }, "$:/language/ControlPanel/Plugins/Themes/Caption": { "title": "$:/language/ControlPanel/Plugins/Themes/Caption", "text": "Themes" }, "$:/language/ControlPanel/Plugins/Themes/Hint": { "title": "$:/language/ControlPanel/Plugins/Themes/Hint", "text": "Theme plugins" }, "$:/language/ControlPanel/Saving/Caption": { "title": "$:/language/ControlPanel/Saving/Caption", "text": "Saving" }, "$:/language/ControlPanel/Saving/Heading": { "title": "$:/language/ControlPanel/Saving/Heading", "text": "Saving" }, "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading", "text": "Advanced Settings" }, "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir", "text": "Backup Directory" }, "$:/language/ControlPanel/Saving/TiddlySpot/Backups": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups", "text": "Backups" }, "$:/language/ControlPanel/Saving/TiddlySpot/Description": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Description", "text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server" }, "$:/language/ControlPanel/Saving/TiddlySpot/Filename": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename", "text": "Upload Filename" }, "$:/language/ControlPanel/Saving/TiddlySpot/Heading": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading", "text": "~TiddlySpot" }, "$:/language/ControlPanel/Saving/TiddlySpot/Hint": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint", "text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//" }, "$:/language/ControlPanel/Saving/TiddlySpot/Password": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/Password", "text": "Password" }, "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL", "text": "Server URL" }, "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir", "text": "Upload Directory" }, "$:/language/ControlPanel/Saving/TiddlySpot/UserName": { "title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName", "text": "Wiki Name" }, "$:/language/ControlPanel/Settings/AutoSave/Caption": { "title": "$:/language/ControlPanel/Settings/AutoSave/Caption", "text": "Autosave" }, "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": { "title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description", "text": "Do not save changes automatically" }, "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": { "title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description", "text": "Save changes automatically" }, "$:/language/ControlPanel/Settings/AutoSave/Hint": { "title": "$:/language/ControlPanel/Settings/AutoSave/Hint", "text": "Automatically save changes during editing" }, "$:/language/ControlPanel/Settings/Caption": { "title": "$:/language/ControlPanel/Settings/Caption", "text": "Settings" }, "$:/language/ControlPanel/Settings/Hint": { "title": "$:/language/ControlPanel/Settings/Hint", "text": "These settings let you customise the behaviour of TiddlyWiki." }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption", "text": "Navigation Address Bar" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint", "text": "Behaviour of the browser address bar when navigating to a tiddler:" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description", "text": "Do not update the address bar" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description", "text": "Include the target tiddler" }, "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": { "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description", "text": "Include the target tiddler and the current story sequence" }, "$:/language/ControlPanel/Settings/NavigationHistory/Caption": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption", "text": "Navigation History" }, "$:/language/ControlPanel/Settings/NavigationHistory/Hint": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint", "text": "Update browser history when navigating to a tiddler:" }, "$:/language/ControlPanel/Settings/NavigationHistory/No/Description": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description", "text": "Do not update history" }, "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": { "title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description", "text": "Update history" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption", "text": "Toolbar Button Style" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint", "text": "Choose the style for toolbar buttons:" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless", "text": "Borderless" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed", "text": "Boxed" }, "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": { "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded", "text": "Rounded" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Caption": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption", "text": "Toolbar Buttons" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Hint": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint", "text": "Default toolbar button appearance:" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description", "text": "Include icon" }, "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": { "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description", "text": "Include text" }, "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": { "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption", "text": "Default Sidebar Tab" }, "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": { "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint", "text": "Specify which sidebar tab is displayed by default" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption", "text": "Tiddler Opening Behaviour" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint", "text": "Navigation from //within// the story river" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint", "text": "Navigation from //outside// the story river" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove", "text": "Open above the current tiddler" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow", "text": "Open below the current tiddler" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop", "text": "Open at the top of the story river" }, "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": { "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom", "text": "Open at the bottom of the story river" }, "$:/language/ControlPanel/Settings/TitleLinks/Caption": { "title": "$:/language/ControlPanel/Settings/TitleLinks/Caption", "text": "Tiddler Titles" }, "$:/language/ControlPanel/Settings/TitleLinks/Hint": { "title": "$:/language/ControlPanel/Settings/TitleLinks/Hint", "text": "Optionally display tiddler titles as links" }, "$:/language/ControlPanel/Settings/TitleLinks/No/Description": { "title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description", "text": "Do not display tiddler titles as links" }, "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": { "title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description", "text": "Display tiddler titles as links" }, "$:/language/ControlPanel/StoryView/Caption": { "title": "$:/language/ControlPanel/StoryView/Caption", "text": "Story View" }, "$:/language/ControlPanel/StoryView/Prompt": { "title": "$:/language/ControlPanel/StoryView/Prompt", "text": "Current view:" }, "$:/language/ControlPanel/Theme/Caption": { "title": "$:/language/ControlPanel/Theme/Caption", "text": "Theme" }, "$:/language/ControlPanel/Theme/Prompt": { "title": "$:/language/ControlPanel/Theme/Prompt", "text": "Current theme:" }, "$:/language/ControlPanel/TiddlerFields/Caption": { "title": "$:/language/ControlPanel/TiddlerFields/Caption", "text": "Tiddler Fields" }, "$:/language/ControlPanel/TiddlerFields/Hint": { "title": "$:/language/ControlPanel/TiddlerFields/Hint", "text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)." }, "$:/language/ControlPanel/Toolbars/Caption": { "title": "$:/language/ControlPanel/Toolbars/Caption", "text": "Toolbars" }, "$:/language/ControlPanel/Toolbars/EditToolbar/Caption": { "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption", "text": "Edit Toolbar" }, "$:/language/ControlPanel/Toolbars/EditToolbar/Hint": { "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint", "text": "Choose which buttons are displayed for tiddlers in edit mode" }, "$:/language/ControlPanel/Toolbars/Hint": { "title": "$:/language/ControlPanel/Toolbars/Hint", "text": "Select which toolbar buttons are displayed" }, "$:/language/ControlPanel/Toolbars/PageControls/Caption": { "title": "$:/language/ControlPanel/Toolbars/PageControls/Caption", "text": "Page Toolbar" }, "$:/language/ControlPanel/Toolbars/PageControls/Hint": { "title": "$:/language/ControlPanel/Toolbars/PageControls/Hint", "text": "Choose which buttons are displayed on the main page toolbar " }, "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": { "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption", "text": "View Toolbar" }, "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": { "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint", "text": "Choose which buttons are displayed for tiddlers in view mode" }, "$:/language/ControlPanel/Tools/Download/Full/Caption": { "title": "$:/language/ControlPanel/Tools/Download/Full/Caption", "text": "Download full wiki" }, "$:/language/Date/DaySuffix/1": { "title": "$:/language/Date/DaySuffix/1", "text": "st" }, "$:/language/Date/DaySuffix/2": { "title": "$:/language/Date/DaySuffix/2", "text": "nd" }, "$:/language/Date/DaySuffix/3": { "title": "$:/language/Date/DaySuffix/3", "text": "rd" }, "$:/language/Date/DaySuffix/4": { "title": "$:/language/Date/DaySuffix/4", "text": "th" }, "$:/language/Date/DaySuffix/5": { "title": "$:/language/Date/DaySuffix/5", "text": "th" }, "$:/language/Date/DaySuffix/6": { "title": "$:/language/Date/DaySuffix/6", "text": "th" }, "$:/language/Date/DaySuffix/7": { "title": "$:/language/Date/DaySuffix/7", "text": "th" }, "$:/language/Date/DaySuffix/8": { "title": "$:/language/Date/DaySuffix/8", "text": "th" }, "$:/language/Date/DaySuffix/9": { "title": "$:/language/Date/DaySuffix/9", "text": "th" }, "$:/language/Date/DaySuffix/10": { "title": "$:/language/Date/DaySuffix/10", "text": "th" }, "$:/language/Date/DaySuffix/11": { "title": "$:/language/Date/DaySuffix/11", "text": "th" }, "$:/language/Date/DaySuffix/12": { "title": "$:/language/Date/DaySuffix/12", "text": "th" }, "$:/language/Date/DaySuffix/13": { "title": "$:/language/Date/DaySuffix/13", "text": "th" }, "$:/language/Date/DaySuffix/14": { "title": "$:/language/Date/DaySuffix/14", "text": "th" }, "$:/language/Date/DaySuffix/15": { "title": "$:/language/Date/DaySuffix/15", "text": "th" }, "$:/language/Date/DaySuffix/16": { "title": "$:/language/Date/DaySuffix/16", "text": "th" }, "$:/language/Date/DaySuffix/17": { "title": "$:/language/Date/DaySuffix/17", "text": "th" }, "$:/language/Date/DaySuffix/18": { "title": "$:/language/Date/DaySuffix/18", "text": "th" }, "$:/language/Date/DaySuffix/19": { "title": "$:/language/Date/DaySuffix/19", "text": "th" }, "$:/language/Date/DaySuffix/20": { "title": "$:/language/Date/DaySuffix/20", "text": "th" }, "$:/language/Date/DaySuffix/21": { "title": "$:/language/Date/DaySuffix/21", "text": "st" }, "$:/language/Date/DaySuffix/22": { "title": "$:/language/Date/DaySuffix/22", "text": "nd" }, "$:/language/Date/DaySuffix/23": { "title": "$:/language/Date/DaySuffix/23", "text": "rd" }, "$:/language/Date/DaySuffix/24": { "title": "$:/language/Date/DaySuffix/24", "text": "th" }, "$:/language/Date/DaySuffix/25": { "title": "$:/language/Date/DaySuffix/25", "text": "th" }, "$:/language/Date/DaySuffix/26": { "title": "$:/language/Date/DaySuffix/26", "text": "th" }, "$:/language/Date/DaySuffix/27": { "title": "$:/language/Date/DaySuffix/27", "text": "th" }, "$:/language/Date/DaySuffix/28": { "title": "$:/language/Date/DaySuffix/28", "text": "th" }, "$:/language/Date/DaySuffix/29": { "title": "$:/language/Date/DaySuffix/29", "text": "th" }, "$:/language/Date/DaySuffix/30": { "title": "$:/language/Date/DaySuffix/30", "text": "th" }, "$:/language/Date/DaySuffix/31": { "title": "$:/language/Date/DaySuffix/31", "text": "st" }, "$:/language/Date/Long/Day/0": { "title": "$:/language/Date/Long/Day/0", "text": "Sunday" }, "$:/language/Date/Long/Day/1": { "title": "$:/language/Date/Long/Day/1", "text": "Monday" }, "$:/language/Date/Long/Day/2": { "title": "$:/language/Date/Long/Day/2", "text": "Tuesday" }, "$:/language/Date/Long/Day/3": { "title": "$:/language/Date/Long/Day/3", "text": "Wednesday" }, "$:/language/Date/Long/Day/4": { "title": "$:/language/Date/Long/Day/4", "text": "Thursday" }, "$:/language/Date/Long/Day/5": { "title": "$:/language/Date/Long/Day/5", "text": "Friday" }, "$:/language/Date/Long/Day/6": { "title": "$:/language/Date/Long/Day/6", "text": "Saturday" }, "$:/language/Date/Long/Month/1": { "title": "$:/language/Date/Long/Month/1", "text": "January" }, "$:/language/Date/Long/Month/2": { "title": "$:/language/Date/Long/Month/2", "text": "February" }, "$:/language/Date/Long/Month/3": { "title": "$:/language/Date/Long/Month/3", "text": "March" }, "$:/language/Date/Long/Month/4": { "title": "$:/language/Date/Long/Month/4", "text": "April" }, "$:/language/Date/Long/Month/5": { "title": "$:/language/Date/Long/Month/5", "text": "May" }, "$:/language/Date/Long/Month/6": { "title": "$:/language/Date/Long/Month/6", "text": "June" }, "$:/language/Date/Long/Month/7": { "title": "$:/language/Date/Long/Month/7", "text": "July" }, "$:/language/Date/Long/Month/8": { "title": "$:/language/Date/Long/Month/8", "text": "August" }, "$:/language/Date/Long/Month/9": { "title": "$:/language/Date/Long/Month/9", "text": "September" }, "$:/language/Date/Long/Month/10": { "title": "$:/language/Date/Long/Month/10", "text": "October" }, "$:/language/Date/Long/Month/11": { "title": "$:/language/Date/Long/Month/11", "text": "November" }, "$:/language/Date/Long/Month/12": { "title": "$:/language/Date/Long/Month/12", "text": "December" }, "$:/language/Date/Period/am": { "title": "$:/language/Date/Period/am", "text": "am" }, "$:/language/Date/Period/pm": { "title": "$:/language/Date/Period/pm", "text": "pm" }, "$:/language/Date/Short/Day/0": { "title": "$:/language/Date/Short/Day/0", "text": "Sun" }, "$:/language/Date/Short/Day/1": { "title": "$:/language/Date/Short/Day/1", "text": "Mon" }, "$:/language/Date/Short/Day/2": { "title": "$:/language/Date/Short/Day/2", "text": "Tue" }, "$:/language/Date/Short/Day/3": { "title": "$:/language/Date/Short/Day/3", "text": "Wed" }, "$:/language/Date/Short/Day/4": { "title": "$:/language/Date/Short/Day/4", "text": "Thu" }, "$:/language/Date/Short/Day/5": { "title": "$:/language/Date/Short/Day/5", "text": "Fri" }, "$:/language/Date/Short/Day/6": { "title": "$:/language/Date/Short/Day/6", "text": "Sat" }, "$:/language/Date/Short/Month/1": { "title": "$:/language/Date/Short/Month/1", "text": "Jan" }, "$:/language/Date/Short/Month/2": { "title": "$:/language/Date/Short/Month/2", "text": "Feb" }, "$:/language/Date/Short/Month/3": { "title": "$:/language/Date/Short/Month/3", "text": "Mar" }, "$:/language/Date/Short/Month/4": { "title": "$:/language/Date/Short/Month/4", "text": "Apr" }, "$:/language/Date/Short/Month/5": { "title": "$:/language/Date/Short/Month/5", "text": "May" }, "$:/language/Date/Short/Month/6": { "title": "$:/language/Date/Short/Month/6", "text": "Jun" }, "$:/language/Date/Short/Month/7": { "title": "$:/language/Date/Short/Month/7", "text": "Jul" }, "$:/language/Date/Short/Month/8": { "title": "$:/language/Date/Short/Month/8", "text": "Aug" }, "$:/language/Date/Short/Month/9": { "title": "$:/language/Date/Short/Month/9", "text": "Sep" }, "$:/language/Date/Short/Month/10": { "title": "$:/language/Date/Short/Month/10", "text": "Oct" }, "$:/language/Date/Short/Month/11": { "title": "$:/language/Date/Short/Month/11", "text": "Nov" }, "$:/language/Date/Short/Month/12": { "title": "$:/language/Date/Short/Month/12", "text": "Dec" }, "$:/language/RelativeDate/Future/Days": { "title": "$:/language/RelativeDate/Future/Days", "text": "<<period>> days from now" }, "$:/language/RelativeDate/Future/Hours": { "title": "$:/language/RelativeDate/Future/Hours", "text": "<<period>> hours from now" }, "$:/language/RelativeDate/Future/Minutes": { "title": "$:/language/RelativeDate/Future/Minutes", "text": "<<period>> minutes from now" }, "$:/language/RelativeDate/Future/Months": { "title": "$:/language/RelativeDate/Future/Months", "text": "<<period>> months from now" }, "$:/language/RelativeDate/Future/Second": { "title": "$:/language/RelativeDate/Future/Second", "text": "1 second from now" }, "$:/language/RelativeDate/Future/Seconds": { "title": "$:/language/RelativeDate/Future/Seconds", "text": "<<period>> seconds from now" }, "$:/language/RelativeDate/Future/Years": { "title": "$:/language/RelativeDate/Future/Years", "text": "<<period>> years from now" }, "$:/language/RelativeDate/Past/Days": { "title": "$:/language/RelativeDate/Past/Days", "text": "<<period>> days ago" }, "$:/language/RelativeDate/Past/Hours": { "title": "$:/language/RelativeDate/Past/Hours", "text": "<<period>> hours ago" }, "$:/language/RelativeDate/Past/Minutes": { "title": "$:/language/RelativeDate/Past/Minutes", "text": "<<period>> minutes ago" }, "$:/language/RelativeDate/Past/Months": { "title": "$:/language/RelativeDate/Past/Months", "text": "<<period>> months ago" }, "$:/language/RelativeDate/Past/Second": { "title": "$:/language/RelativeDate/Past/Second", "text": "1 second ago" }, "$:/language/RelativeDate/Past/Seconds": { "title": "$:/language/RelativeDate/Past/Seconds", "text": "<<period>> seconds ago" }, "$:/language/RelativeDate/Past/Years": { "title": "$:/language/RelativeDate/Past/Years", "text": "<<period>> years ago" }, "$:/language/Docs/ModuleTypes/animation": { "title": "$:/language/Docs/ModuleTypes/animation", "text": "Animations that may be used with the RevealWidget." }, "$:/language/Docs/ModuleTypes/command": { "title": "$:/language/Docs/ModuleTypes/command", "text": "Commands that can be executed under Node.js." }, "$:/language/Docs/ModuleTypes/config": { "title": "$:/language/Docs/ModuleTypes/config", "text": "Data to be inserted into `$tw.config`." }, "$:/language/Docs/ModuleTypes/filteroperator": { "title": "$:/language/Docs/ModuleTypes/filteroperator", "text": "Individual filter operator methods." }, "$:/language/Docs/ModuleTypes/global": { "title": "$:/language/Docs/ModuleTypes/global", "text": "Global data to be inserted into `$tw`." }, "$:/language/Docs/ModuleTypes/isfilteroperator": { "title": "$:/language/Docs/ModuleTypes/isfilteroperator", "text": "Operands for the ''is'' filter operator." }, "$:/language/Docs/ModuleTypes/macro": { "title": "$:/language/Docs/ModuleTypes/macro", "text": "JavaScript macro definitions." }, "$:/language/Docs/ModuleTypes/parser": { "title": "$:/language/Docs/ModuleTypes/parser", "text": "Parsers for different content types." }, "$:/language/Docs/ModuleTypes/saver": { "title": "$:/language/Docs/ModuleTypes/saver", "text": "Savers handle different methods for saving files from the browser." }, "$:/language/Docs/ModuleTypes/startup": { "title": "$:/language/Docs/ModuleTypes/startup", "text": "Startup functions." }, "$:/language/Docs/ModuleTypes/storyview": { "title": "$:/language/Docs/ModuleTypes/storyview", "text": "Story views customise the animation and behaviour of list widgets." }, "$:/language/Docs/ModuleTypes/tiddlerdeserializer": { "title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer", "text": "Converts different content types into tiddlers." }, "$:/language/Docs/ModuleTypes/tiddlerfield": { "title": "$:/language/Docs/ModuleTypes/tiddlerfield", "text": "Defines the behaviour of an individual tiddler field." }, "$:/language/Docs/ModuleTypes/tiddlermethod": { "title": "$:/language/Docs/ModuleTypes/tiddlermethod", "text": "Adds methods to the `$tw.Tiddler` prototype." }, "$:/language/Docs/ModuleTypes/upgrader": { "title": "$:/language/Docs/ModuleTypes/upgrader", "text": "Applies upgrade processing to tiddlers during an upgrade/import." }, "$:/language/Docs/ModuleTypes/utils": { "title": "$:/language/Docs/ModuleTypes/utils", "text": "Adds methods to `$tw.utils`." }, "$:/language/Docs/ModuleTypes/utils-node": { "title": "$:/language/Docs/ModuleTypes/utils-node", "text": "Adds Node.js-specific methods to `$tw.utils`." }, "$:/language/Docs/ModuleTypes/widget": { "title": "$:/language/Docs/ModuleTypes/widget", "text": "Widgets encapsulate DOM rendering and refreshing." }, "$:/language/Docs/ModuleTypes/wikimethod": { "title": "$:/language/Docs/ModuleTypes/wikimethod", "text": "Adds methods to `$tw.Wiki`." }, "$:/language/Docs/ModuleTypes/wikirule": { "title": "$:/language/Docs/ModuleTypes/wikirule", "text": "Individual parser rules for the main WikiText parser." }, "$:/language/Docs/PaletteColours/alert-background": { "title": "$:/language/Docs/PaletteColours/alert-background", "text": "Alert background" }, "$:/language/Docs/PaletteColours/alert-border": { "title": "$:/language/Docs/PaletteColours/alert-border", "text": "Alert border" }, "$:/language/Docs/PaletteColours/alert-highlight": { "title": "$:/language/Docs/PaletteColours/alert-highlight", "text": "Alert highlight" }, "$:/language/Docs/PaletteColours/alert-muted-foreground": { "title": "$:/language/Docs/PaletteColours/alert-muted-foreground", "text": "Alert muted foreground" }, "$:/language/Docs/PaletteColours/background": { "title": "$:/language/Docs/PaletteColours/background", "text": "General background" }, "$:/language/Docs/PaletteColours/blockquote-bar": { "title": "$:/language/Docs/PaletteColours/blockquote-bar", "text": "Blockquote bar" }, "$:/language/Docs/PaletteColours/button-background": { "title": "$:/language/Docs/PaletteColours/button-background", "text": "Default button background" }, "$:/language/Docs/PaletteColours/button-border": { "title": "$:/language/Docs/PaletteColours/button-border", "text": "Default button border" }, "$:/language/Docs/PaletteColours/button-foreground": { "title": "$:/language/Docs/PaletteColours/button-foreground", "text": "Default button foreground" }, "$:/language/Docs/PaletteColours/dirty-indicator": { "title": "$:/language/Docs/PaletteColours/dirty-indicator", "text": "Unsaved changes indicator" }, "$:/language/Docs/PaletteColours/code-background": { "title": "$:/language/Docs/PaletteColours/code-background", "text": "Code background" }, "$:/language/Docs/PaletteColours/code-border": { "title": "$:/language/Docs/PaletteColours/code-border", "text": "Code border" }, "$:/language/Docs/PaletteColours/code-foreground": { "title": "$:/language/Docs/PaletteColours/code-foreground", "text": "Code foreground" }, "$:/language/Docs/PaletteColours/download-background": { "title": "$:/language/Docs/PaletteColours/download-background", "text": "Download button background" }, "$:/language/Docs/PaletteColours/download-foreground": { "title": "$:/language/Docs/PaletteColours/download-foreground", "text": "Download button foreground" }, "$:/language/Docs/PaletteColours/dragger-background": { "title": "$:/language/Docs/PaletteColours/dragger-background", "text": "Dragger background" }, "$:/language/Docs/PaletteColours/dragger-foreground": { "title": "$:/language/Docs/PaletteColours/dragger-foreground", "text": "Dragger foreground" }, "$:/language/Docs/PaletteColours/dropdown-background": { "title": "$:/language/Docs/PaletteColours/dropdown-background", "text": "Dropdown background" }, "$:/language/Docs/PaletteColours/dropdown-border": { "title": "$:/language/Docs/PaletteColours/dropdown-border", "text": "Dropdown border" }, "$:/language/Docs/PaletteColours/dropdown-tab-background-selected": { "title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected", "text": "Dropdown tab background for selected tabs" }, "$:/language/Docs/PaletteColours/dropdown-tab-background": { "title": "$:/language/Docs/PaletteColours/dropdown-tab-background", "text": "Dropdown tab background" }, "$:/language/Docs/PaletteColours/dropzone-background": { "title": "$:/language/Docs/PaletteColours/dropzone-background", "text": "Dropzone background" }, "$:/language/Docs/PaletteColours/external-link-background-hover": { "title": "$:/language/Docs/PaletteColours/external-link-background-hover", "text": "External link background hover" }, "$:/language/Docs/PaletteColours/external-link-background-visited": { "title": "$:/language/Docs/PaletteColours/external-link-background-visited", "text": "External link background visited" }, "$:/language/Docs/PaletteColours/external-link-background": { "title": "$:/language/Docs/PaletteColours/external-link-background", "text": "External link background" }, "$:/language/Docs/PaletteColours/external-link-foreground-hover": { "title": "$:/language/Docs/PaletteColours/external-link-foreground-hover", "text": "External link foreground hover" }, "$:/language/Docs/PaletteColours/external-link-foreground-visited": { "title": "$:/language/Docs/PaletteColours/external-link-foreground-visited", "text": "External link foreground visited" }, "$:/language/Docs/PaletteColours/external-link-foreground": { "title": "$:/language/Docs/PaletteColours/external-link-foreground", "text": "External link foreground" }, "$:/language/Docs/PaletteColours/foreground": { "title": "$:/language/Docs/PaletteColours/foreground", "text": "General foreground" }, "$:/language/Docs/PaletteColours/message-background": { "title": "$:/language/Docs/PaletteColours/message-background", "text": "Message box background" }, "$:/language/Docs/PaletteColours/message-border": { "title": "$:/language/Docs/PaletteColours/message-border", "text": "Message box border" }, "$:/language/Docs/PaletteColours/message-foreground": { "title": "$:/language/Docs/PaletteColours/message-foreground", "text": "Message box foreground" }, "$:/language/Docs/PaletteColours/modal-backdrop": { "title": "$:/language/Docs/PaletteColours/modal-backdrop", "text": "Modal backdrop" }, "$:/language/Docs/PaletteColours/modal-background": { "title": "$:/language/Docs/PaletteColours/modal-background", "text": "Modal background" }, "$:/language/Docs/PaletteColours/modal-border": { "title": "$:/language/Docs/PaletteColours/modal-border", "text": "Modal border" }, "$:/language/Docs/PaletteColours/modal-footer-background": { "title": "$:/language/Docs/PaletteColours/modal-footer-background", "text": "Modal footer background" }, "$:/language/Docs/PaletteColours/modal-footer-border": { "title": "$:/language/Docs/PaletteColours/modal-footer-border", "text": "Modal footer border" }, "$:/language/Docs/PaletteColours/modal-header-border": { "title": "$:/language/Docs/PaletteColours/modal-header-border", "text": "Modal header border" }, "$:/language/Docs/PaletteColours/muted-foreground": { "title": "$:/language/Docs/PaletteColours/muted-foreground", "text": "General muted foreground" }, "$:/language/Docs/PaletteColours/notification-background": { "title": "$:/language/Docs/PaletteColours/notification-background", "text": "Notification background" }, "$:/language/Docs/PaletteColours/notification-border": { "title": "$:/language/Docs/PaletteColours/notification-border", "text": "Notification border" }, "$:/language/Docs/PaletteColours/page-background": { "title": "$:/language/Docs/PaletteColours/page-background", "text": "Page background" }, "$:/language/Docs/PaletteColours/pre-background": { "title": "$:/language/Docs/PaletteColours/pre-background", "text": "Preformatted code background" }, "$:/language/Docs/PaletteColours/pre-border": { "title": "$:/language/Docs/PaletteColours/pre-border", "text": "Preformatted code border" }, "$:/language/Docs/PaletteColours/primary": { "title": "$:/language/Docs/PaletteColours/primary", "text": "General primary" }, "$:/language/Docs/PaletteColours/sidebar-button-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-button-foreground", "text": "Sidebar button foreground" }, "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": { "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover", "text": "Sidebar controls foreground hover" }, "$:/language/Docs/PaletteColours/sidebar-controls-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground", "text": "Sidebar controls foreground" }, "$:/language/Docs/PaletteColours/sidebar-foreground-shadow": { "title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow", "text": "Sidebar foreground shadow" }, "$:/language/Docs/PaletteColours/sidebar-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-foreground", "text": "Sidebar foreground" }, "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": { "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover", "text": "Sidebar muted foreground hover" }, "$:/language/Docs/PaletteColours/sidebar-muted-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground", "text": "Sidebar muted foreground" }, "$:/language/Docs/PaletteColours/sidebar-tab-background-selected": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected", "text": "Sidebar tab background for selected tabs" }, "$:/language/Docs/PaletteColours/sidebar-tab-background": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-background", "text": "Sidebar tab background" }, "$:/language/Docs/PaletteColours/sidebar-tab-border-selected": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected", "text": "Sidebar tab border for selected tabs" }, "$:/language/Docs/PaletteColours/sidebar-tab-border": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-border", "text": "Sidebar tab border" }, "$:/language/Docs/PaletteColours/sidebar-tab-divider": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-divider", "text": "Sidebar tab divider" }, "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected", "text": "Sidebar tab foreground for selected tabs" }, "$:/language/Docs/PaletteColours/sidebar-tab-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground", "text": "Sidebar tab foreground" }, "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": { "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover", "text": "Sidebar tiddler link foreground hover" }, "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": { "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground", "text": "Sidebar tiddler link foreground" }, "$:/language/Docs/PaletteColours/site-title-foreground": { "title": "$:/language/Docs/PaletteColours/site-title-foreground", "text": "Site title foreground" }, "$:/language/Docs/PaletteColours/static-alert-foreground": { "title": "$:/language/Docs/PaletteColours/static-alert-foreground", "text": "Static alert foreground" }, "$:/language/Docs/PaletteColours/tab-background-selected": { "title": "$:/language/Docs/PaletteColours/tab-background-selected", "text": "Tab background for selected tabs" }, "$:/language/Docs/PaletteColours/tab-background": { "title": "$:/language/Docs/PaletteColours/tab-background", "text": "Tab background" }, "$:/language/Docs/PaletteColours/tab-border-selected": { "title": "$:/language/Docs/PaletteColours/tab-border-selected", "text": "Tab border for selected tabs" }, "$:/language/Docs/PaletteColours/tab-border": { "title": "$:/language/Docs/PaletteColours/tab-border", "text": "Tab border" }, "$:/language/Docs/PaletteColours/tab-divider": { "title": "$:/language/Docs/PaletteColours/tab-divider", "text": "Tab divider" }, "$:/language/Docs/PaletteColours/tab-foreground-selected": { "title": "$:/language/Docs/PaletteColours/tab-foreground-selected", "text": "Tab foreground for selected tabs" }, "$:/language/Docs/PaletteColours/tab-foreground": { "title": "$:/language/Docs/PaletteColours/tab-foreground", "text": "Tab foreground" }, "$:/language/Docs/PaletteColours/table-border": { "title": "$:/language/Docs/PaletteColours/table-border", "text": "Table border" }, "$:/language/Docs/PaletteColours/table-footer-background": { "title": "$:/language/Docs/PaletteColours/table-footer-background", "text": "Table footer background" }, "$:/language/Docs/PaletteColours/table-header-background": { "title": "$:/language/Docs/PaletteColours/table-header-background", "text": "Table header background" }, "$:/language/Docs/PaletteColours/tag-background": { "title": "$:/language/Docs/PaletteColours/tag-background", "text": "Tag background" }, "$:/language/Docs/PaletteColours/tag-foreground": { "title": "$:/language/Docs/PaletteColours/tag-foreground", "text": "Tag foreground" }, "$:/language/Docs/PaletteColours/tiddler-background": { "title": "$:/language/Docs/PaletteColours/tiddler-background", "text": "Tiddler background" }, "$:/language/Docs/PaletteColours/tiddler-border": { "title": "$:/language/Docs/PaletteColours/tiddler-border", "text": "Tiddler border" }, "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": { "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover", "text": "Tiddler controls foreground hover" }, "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": { "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected", "text": "Tiddler controls foreground for selected controls" }, "$:/language/Docs/PaletteColours/tiddler-controls-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground", "text": "Tiddler controls foreground" }, "$:/language/Docs/PaletteColours/tiddler-editor-background": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-background", "text": "Tiddler editor background" }, "$:/language/Docs/PaletteColours/tiddler-editor-border-image": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image", "text": "Tiddler editor border image" }, "$:/language/Docs/PaletteColours/tiddler-editor-border": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-border", "text": "Tiddler editor border" }, "$:/language/Docs/PaletteColours/tiddler-editor-fields-even": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even", "text": "Tiddler editor background for even fields" }, "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": { "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd", "text": "Tiddler editor background for odd fields" }, "$:/language/Docs/PaletteColours/tiddler-info-background": { "title": "$:/language/Docs/PaletteColours/tiddler-info-background", "text": "Tiddler info panel background" }, "$:/language/Docs/PaletteColours/tiddler-info-border": { "title": "$:/language/Docs/PaletteColours/tiddler-info-border", "text": "Tiddler info panel border" }, "$:/language/Docs/PaletteColours/tiddler-info-tab-background": { "title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background", "text": "Tiddler info panel tab background" }, "$:/language/Docs/PaletteColours/tiddler-link-background": { "title": "$:/language/Docs/PaletteColours/tiddler-link-background", "text": "Tiddler link background" }, "$:/language/Docs/PaletteColours/tiddler-link-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-link-foreground", "text": "Tiddler link foreground" }, "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground", "text": "Tiddler subtitle foreground" }, "$:/language/Docs/PaletteColours/tiddler-title-foreground": { "title": "$:/language/Docs/PaletteColours/tiddler-title-foreground", "text": "Tiddler title foreground" }, "$:/language/Docs/PaletteColours/toolbar-new-button": { "title": "$:/language/Docs/PaletteColours/toolbar-new-button", "text": "Toolbar 'new tiddler' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-options-button": { "title": "$:/language/Docs/PaletteColours/toolbar-options-button", "text": "Toolbar 'options' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-save-button": { "title": "$:/language/Docs/PaletteColours/toolbar-save-button", "text": "Toolbar 'save' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-info-button": { "title": "$:/language/Docs/PaletteColours/toolbar-info-button", "text": "Toolbar 'info' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-edit-button": { "title": "$:/language/Docs/PaletteColours/toolbar-edit-button", "text": "Toolbar 'edit' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-close-button": { "title": "$:/language/Docs/PaletteColours/toolbar-close-button", "text": "Toolbar 'close' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-delete-button": { "title": "$:/language/Docs/PaletteColours/toolbar-delete-button", "text": "Toolbar 'delete' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-cancel-button": { "title": "$:/language/Docs/PaletteColours/toolbar-cancel-button", "text": "Toolbar 'cancel' button foreground" }, "$:/language/Docs/PaletteColours/toolbar-done-button": { "title": "$:/language/Docs/PaletteColours/toolbar-done-button", "text": "Toolbar 'done' button foreground" }, "$:/language/Docs/PaletteColours/untagged-background": { "title": "$:/language/Docs/PaletteColours/untagged-background", "text": "Untagged pill background" }, "$:/language/Docs/PaletteColours/very-muted-foreground": { "title": "$:/language/Docs/PaletteColours/very-muted-foreground", "text": "Very muted foreground" }, "$:/language/EditTemplate/Body/External/Hint": { "title": "$:/language/EditTemplate/Body/External/Hint", "text": "This is an external tiddler stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself" }, "$:/language/EditTemplate/Body/Hint": { "title": "$:/language/EditTemplate/Body/Hint", "text": "Use [[wiki text|http://tiddlywiki.com/static/WikiText.html]] to add formatting, images, and dynamic features" }, "$:/language/EditTemplate/Body/Placeholder": { "title": "$:/language/EditTemplate/Body/Placeholder", "text": "Type the text for this tiddler" }, "$:/language/EditTemplate/Body/Preview/Button/Hide": { "title": "$:/language/EditTemplate/Body/Preview/Button/Hide", "text": "hide preview" }, "$:/language/EditTemplate/Body/Preview/Button/Show": { "title": "$:/language/EditTemplate/Body/Preview/Button/Show", "text": "show preview" }, "$:/language/EditTemplate/Field/Remove/Caption": { "title": "$:/language/EditTemplate/Field/Remove/Caption", "text": "remove field" }, "$:/language/EditTemplate/Field/Remove/Hint": { "title": "$:/language/EditTemplate/Field/Remove/Hint", "text": "Remove field" }, "$:/language/EditTemplate/Fields/Add/Button": { "title": "$:/language/EditTemplate/Fields/Add/Button", "text": "add" }, "$:/language/EditTemplate/Fields/Add/Name/Placeholder": { "title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder", "text": "field name" }, "$:/language/EditTemplate/Fields/Add/Prompt": { "title": "$:/language/EditTemplate/Fields/Add/Prompt", "text": "Add a new field:" }, "$:/language/EditTemplate/Fields/Add/Value/Placeholder": { "title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder", "text": "field value" }, "$:/language/EditTemplate/Fields/Add/Dropdown/System": { "title": "$:/language/EditTemplate/Fields/Add/Dropdown/System", "text": "System fields" }, "$:/language/EditTemplate/Fields/Add/Dropdown/User": { "title": "$:/language/EditTemplate/Fields/Add/Dropdown/User", "text": "User fields" }, "$:/language/EditTemplate/Shadow/Warning": { "title": "$:/language/EditTemplate/Shadow/Warning", "text": "This is a shadow tiddler. Any changes will override the default version" }, "$:/language/EditTemplate/Shadow/OverriddenWarning": { "title": "$:/language/EditTemplate/Shadow/OverriddenWarning", "text": "This is a modified shadow tiddler. You can revert to the default version by deleting this tiddler" }, "$:/language/EditTemplate/Tags/Add/Button": { "title": "$:/language/EditTemplate/Tags/Add/Button", "text": "add" }, "$:/language/EditTemplate/Tags/Add/Placeholder": { "title": "$:/language/EditTemplate/Tags/Add/Placeholder", "text": "tag name" }, "$:/language/EditTemplate/Tags/Dropdown/Caption": { "title": "$:/language/EditTemplate/Tags/Dropdown/Caption", "text": "tag list" }, "$:/language/EditTemplate/Tags/Dropdown/Hint": { "title": "$:/language/EditTemplate/Tags/Dropdown/Hint", "text": "Show tag list" }, "$:/language/EditTemplate/Type/Dropdown/Caption": { "title": "$:/language/EditTemplate/Type/Dropdown/Caption", "text": "content type list" }, "$:/language/EditTemplate/Type/Dropdown/Hint": { "title": "$:/language/EditTemplate/Type/Dropdown/Hint", "text": "Show content type list" }, "$:/language/EditTemplate/Type/Delete/Caption": { "title": "$:/language/EditTemplate/Type/Delete/Caption", "text": "delete content type" }, "$:/language/EditTemplate/Type/Delete/Hint": { "title": "$:/language/EditTemplate/Type/Delete/Hint", "text": "Delete content type" }, "$:/language/EditTemplate/Type/Placeholder": { "title": "$:/language/EditTemplate/Type/Placeholder", "text": "content type" }, "$:/language/EditTemplate/Type/Prompt": { "title": "$:/language/EditTemplate/Type/Prompt", "text": "Type:" }, "$:/language/Exporters/StaticRiver": { "title": "$:/language/Exporters/StaticRiver", "text": "Static HTML" }, "$:/language/Exporters/JsonFile": { "title": "$:/language/Exporters/JsonFile", "text": "JSON file" }, "$:/language/Exporters/CsvFile": { "title": "$:/language/Exporters/CsvFile", "text": "CSV file" }, "$:/language/Exporters/TidFile": { "title": "$:/language/Exporters/TidFile", "text": "\".tid\" file" }, "$:/language/Docs/Fields/_canonical_uri": { "title": "$:/language/Docs/Fields/_canonical_uri", "text": "The full URI of an external image tiddler" }, "$:/language/Docs/Fields/bag": { "title": "$:/language/Docs/Fields/bag", "text": "The name of the bag from which a tiddler came" }, "$:/language/Docs/Fields/caption": { "title": "$:/language/Docs/Fields/caption", "text": "The text to be displayed on a tab or button" }, "$:/language/Docs/Fields/color": { "title": "$:/language/Docs/Fields/color", "text": "The CSS color value associated with a tiddler" }, "$:/language/Docs/Fields/component": { "title": "$:/language/Docs/Fields/component", "text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]" }, "$:/language/Docs/Fields/current-tiddler": { "title": "$:/language/Docs/Fields/current-tiddler", "text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]" }, "$:/language/Docs/Fields/created": { "title": "$:/language/Docs/Fields/created", "text": "The date a tiddler was created" }, "$:/language/Docs/Fields/creator": { "title": "$:/language/Docs/Fields/creator", "text": "The name of the person who created a tiddler" }, "$:/language/Docs/Fields/dependents": { "title": "$:/language/Docs/Fields/dependents", "text": "For a plugin, lists the dependent plugin titles" }, "$:/language/Docs/Fields/description": { "title": "$:/language/Docs/Fields/description", "text": "The descriptive text for a plugin, or a modal dialogue" }, "$:/language/Docs/Fields/draft.of": { "title": "$:/language/Docs/Fields/draft.of", "text": "For draft tiddlers, contains the title of the tiddler of which this is a draft" }, "$:/language/Docs/Fields/draft.title": { "title": "$:/language/Docs/Fields/draft.title", "text": "For draft tiddlers, contains the proposed new title of the tiddler" }, "$:/language/Docs/Fields/footer": { "title": "$:/language/Docs/Fields/footer", "text": "The footer text for a wizard" }, "$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against": { "title": "$:/language/Docs/Fields/hack-to-give-us-something-to-compare-against", "text": "A temporary storage field used in [[$:/core/templates/static.content]]" }, "$:/language/Docs/Fields/icon": { "title": "$:/language/Docs/Fields/icon", "text": "The title of the tiddler containing the icon associated with a tiddler" }, "$:/language/Docs/Fields/library": { "title": "$:/language/Docs/Fields/library", "text": "If set to \"yes\" indicates that a tiddler should be saved as a JavaScript library" }, "$:/language/Docs/Fields/list": { "title": "$:/language/Docs/Fields/list", "text": "An ordered list of tiddler titles associated with a tiddler" }, "$:/language/Docs/Fields/list-before": { "title": "$:/language/Docs/Fields/list-before", "text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty" }, "$:/language/Docs/Fields/list-after": { "title": "$:/language/Docs/Fields/list-after", "text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles" }, "$:/language/Docs/Fields/modified": { "title": "$:/language/Docs/Fields/modified", "text": "The date and time at which a tiddler was last modified" }, "$:/language/Docs/Fields/modifier": { "title": "$:/language/Docs/Fields/modifier", "text": "The tiddler title associated with the person who last modified a tiddler" }, "$:/language/Docs/Fields/name": { "title": "$:/language/Docs/Fields/name", "text": "The human readable name associated with a plugin tiddler" }, "$:/language/Docs/Fields/plugin-priority": { "title": "$:/language/Docs/Fields/plugin-priority", "text": "A numerical value indicating the priority of a plugin tiddler" }, "$:/language/Docs/Fields/plugin-type": { "title": "$:/language/Docs/Fields/plugin-type", "text": "The type of plugin in a plugin tiddler" }, "$:/language/Docs/Fields/revision": { "title": "$:/language/Docs/Fields/revision", "text": "The revision of the tiddler held at the server" }, "$:/language/Docs/Fields/released": { "title": "$:/language/Docs/Fields/released", "text": "Date of a TiddlyWiki release" }, "$:/language/Docs/Fields/source": { "title": "$:/language/Docs/Fields/source", "text": "The source URL associated with a tiddler" }, "$:/language/Docs/Fields/subtitle": { "title": "$:/language/Docs/Fields/subtitle", "text": "The subtitle text for a wizard" }, "$:/language/Docs/Fields/tags": { "title": "$:/language/Docs/Fields/tags", "text": "A list of tags associated with a tiddler" }, "$:/language/Docs/Fields/text": { "title": "$:/language/Docs/Fields/text", "text": "The body text of a tiddler" }, "$:/language/Docs/Fields/title": { "title": "$:/language/Docs/Fields/title", "text": "The unique name of a tiddler" }, "$:/language/Docs/Fields/type": { "title": "$:/language/Docs/Fields/type", "text": "The content type of a tiddler" }, "$:/language/Docs/Fields/version": { "title": "$:/language/Docs/Fields/version", "text": "Version information for a plugin" }, "$:/language/Filters/AllTiddlers": { "title": "$:/language/Filters/AllTiddlers", "text": "All tiddlers except system tiddlers" }, "$:/language/Filters/RecentSystemTiddlers": { "title": "$:/language/Filters/RecentSystemTiddlers", "text": "Recently modified tiddlers, including system tiddlers" }, "$:/language/Filters/RecentTiddlers": { "title": "$:/language/Filters/RecentTiddlers", "text": "Recently modified tiddlers" }, "$:/language/Filters/AllTags": { "title": "$:/language/Filters/AllTags", "text": "All tags except system tags" }, "$:/language/Filters/Missing": { "title": "$:/language/Filters/Missing", "text": "Missing tiddlers" }, "$:/language/Filters/Drafts": { "title": "$:/language/Filters/Drafts", "text": "Draft tiddlers" }, "$:/language/Filters/Orphans": { "title": "$:/language/Filters/Orphans", "text": "Orphan tiddlers" }, "$:/language/Filters/SystemTiddlers": { "title": "$:/language/Filters/SystemTiddlers", "text": "System tiddlers" }, "$:/language/Filters/ShadowTiddlers": { "title": "$:/language/Filters/ShadowTiddlers", "text": "Shadow tiddlers" }, "$:/language/Filters/OverriddenShadowTiddlers": { "title": "$:/language/Filters/OverriddenShadowTiddlers", "text": "Overridden shadow tiddlers" }, "$:/language/Filters/SystemTags": { "title": "$:/language/Filters/SystemTags", "text": "System tags" }, "$:/language/Filters/TypedTiddlers": { "title": "$:/language/Filters/TypedTiddlers", "text": "Non wiki-text tiddlers" }, "GettingStarted": { "title": "GettingStarted", "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is important to make sure that you can reliably save changes. See http://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n" }, "$:/language/Help/build": { "title": "$:/language/Help/build", "description": "Automatically run configured commands", "text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n" }, "$:/language/Help/clearpassword": { "title": "$:/language/Help/clearpassword", "description": "Clear a password for subsequent crypto operations", "text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n" }, "$:/language/Help/default": { "title": "$:/language/Help/default", "text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n" }, "$:/language/Help/editions": { "title": "$:/language/Help/editions", "description": "Lists the available editions of TiddlyWiki", "text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n" }, "$:/language/Help/help": { "title": "$:/language/Help/help", "description": "Display help for TiddlyWiki commands", "text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n" }, "$:/language/Help/init": { "title": "$:/language/Help/init", "description": "Initialise a new wiki folder", "text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n" }, "$:/language/Help/load": { "title": "$:/language/Help/load", "description": "Load tiddlers from a file", "text": "Load tiddlers from 2.x.x TiddlyWiki files (`.html`), `.tiddler`, `.tid`, `.json` or other files \n\n```\n--load <filepath>\n```\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n" }, "$:/language/Help/makelibrary": { "title": "$:/language/Help/makelibrary", "description": "Construct library plugin required by upgrade process", "text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n" }, "$:/language/Help/notfound": { "title": "$:/language/Help/notfound", "text": "No such help item" }, "$:/language/Help/output": { "title": "$:/language/Help/output", "description": "Set the base output directory for subsequent commands", "text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n" }, "$:/language/Help/password": { "title": "$:/language/Help/password", "description": "Set a password for subsequent crypto operations", "text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n" }, "$:/language/Help/rendertiddler": { "title": "$:/language/Help/rendertiddler", "description": "Render an individual tiddler as a specified ContentType", "text": "Render an individual tiddler as a specified ContentType, defaults to `text/html` and save it to the specified filename:\n\n```\n--rendertiddler <title> <filename> [<type>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n" }, "$:/language/Help/rendertiddlers": { "title": "$:/language/Help/rendertiddlers", "description": "Render tiddlers matching a filter to a specified ContentType", "text": "Render a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers <filter> <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers [!is[system]] $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the \"noclean\" parameter is specified. The target directory is recursively created if it is missing.\n" }, "$:/language/Help/savetiddler": { "title": "$:/language/Help/savetiddler", "description": "Saves a raw tiddler to a file", "text": "Saves an individual tiddler in its raw text or binary format to the specified filename. \n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n" }, "$:/language/Help/savetiddlers": { "title": "$:/language/Help/savetiddlers", "description": "Saves a group of raw tiddlers to a directory", "text": "Saves a group of tiddlers in their raw text or binary format to the specified directory. \n\n```\n--savetiddlers <filter> <pathname>\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the pathname are automatically created.\n" }, "$:/language/Help/server": { "title": "$:/language/Help/server", "description": "Provides an HTTP server interface to TiddlyWiki", "text": "The server built in to TiddlyWiki5 is very simple. Although compatible with TiddlyWeb it doesn't support many of the features needed for robust Internet-facing usage.\n\nAt the root, it serves a rendering of a specified tiddler. Away from the root, it serves individual tiddlers encoded in JSON, and supports the basic HTTP operations for `GET`, `PUT` and `DELETE`.\n\n```\n--server <port> <roottiddler> <rendertype> <servetype> <username> <password> <host> <pathprefix>\n```\n\nThe parameters are:\n\n* ''port'' - port number to serve from (defaults to \"8080\")\n* ''roottiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\") \n* ''rendertype'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''servetype'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''pathprefix'' - optional prefix for paths\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation isn't suitable for general use.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password:\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port.\n" }, "$:/language/Help/setfield": { "title": "$:/language/Help/setfield", "description": "Prepares external tiddlers for use", "text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''type'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n\n" }, "$:/language/Help/unpackplugin": { "title": "$:/language/Help/unpackplugin", "description": "Unpack the payload tiddlers from a plugin", "text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n" }, "$:/language/Help/verbose": { "title": "$:/language/Help/verbose", "description": "Triggers verbose output mode", "text": "Triggers verbose output, useful for debugging \n\n```\n--verbose\n```\n" }, "$:/language/Help/version": { "title": "$:/language/Help/version", "description": "Displays the version number of TiddlyWiki", "text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n" }, "$:/language/Import/Listing/Cancel/Caption": { "title": "$:/language/Import/Listing/Cancel/Caption", "text": "Cancel" }, "$:/language/Import/Listing/Hint": { "title": "$:/language/Import/Listing/Hint", "text": "These tiddlers are ready to import:" }, "$:/language/Import/Listing/Import/Caption": { "title": "$:/language/Import/Listing/Import/Caption", "text": "Import" }, "$:/language/Import/Listing/Select/Caption": { "title": "$:/language/Import/Listing/Select/Caption", "text": "Select" }, "$:/language/Import/Listing/Status/Caption": { "title": "$:/language/Import/Listing/Status/Caption", "text": "Status" }, "$:/language/Import/Listing/Title/Caption": { "title": "$:/language/Import/Listing/Title/Caption", "text": "Title" }, "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": { "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible", "text": "Blocked incompatible or obsolete plugin " }, "$:/language/Import/Upgrader/Plugins/Suppressed/Version": { "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version", "text": "Blocked plugin (due to incoming <<incoming>> being older than existing <<existing>>)" }, "$:/language/Import/Upgrader/Plugins/Upgraded": { "title": "$:/language/Import/Upgrader/Plugins/Upgraded", "text": "Upgraded plugin from <<incoming>> to <<upgraded>>" }, "$:/language/Import/Upgrader/State/Suppressed": { "title": "$:/language/Import/Upgrader/State/Suppressed", "text": "Blocked temporary state tiddler" }, "$:/language/Import/Upgrader/System/Suppressed": { "title": "$:/language/Import/Upgrader/System/Suppressed", "text": "Blocked system tiddler" }, "$:/language/Import/Upgrader/ThemeTweaks/Created": { "title": "$:/language/Import/Upgrader/ThemeTweaks/Created", "text": "Migrated theme tweak from <$text text=<<from>>/>" }, "$:/language/BinaryWarning/Prompt": { "title": "$:/language/BinaryWarning/Prompt", "text": "This tiddler contains binary data" }, "$:/language/ClassicWarning/Hint": { "title": "$:/language/ClassicWarning/Hint", "text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See http://tiddlywiki.com/static/Upgrading.html for more details. " }, "$:/language/ClassicWarning/Upgrade/Caption": { "title": "$:/language/ClassicWarning/Upgrade/Caption", "text": "upgrade" }, "$:/language/CloseAll/Button": { "title": "$:/language/CloseAll/Button", "text": "close all" }, "$:/language/ConfirmCancelTiddler": { "title": "$:/language/ConfirmCancelTiddler", "text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?" }, "$:/language/ConfirmDeleteTiddler": { "title": "$:/language/ConfirmDeleteTiddler", "text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?" }, "$:/language/ConfirmOverwriteTiddler": { "title": "$:/language/ConfirmOverwriteTiddler", "text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?" }, "$:/language/ConfirmEditShadowTiddler": { "title": "$:/language/ConfirmEditShadowTiddler", "text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?" }, "$:/language/DefaultNewTiddlerTitle": { "title": "$:/language/DefaultNewTiddlerTitle", "text": "New Tiddler" }, "$:/language/DropMessage": { "title": "$:/language/DropMessage", "text": "Drop here (or use the 'Escape' key to cancel)" }, "$:/language/Encryption/Cancel": { "title": "$:/language/Encryption/Cancel", "text": "Cancel" }, "$:/language/Encryption/ConfirmClearPassword": { "title": "$:/language/Encryption/ConfirmClearPassword", "text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki" }, "$:/language/Encryption/PromptSetPassword": { "title": "$:/language/Encryption/PromptSetPassword", "text": "Set a new password for this TiddlyWiki" }, "$:/language/Encryption/Username": { "title": "$:/language/Encryption/Username", "text": "Username" }, "$:/language/Encryption/Password": { "title": "$:/language/Encryption/Password", "text": "Password" }, "$:/language/Encryption/RepeatPassword": { "title": "$:/language/Encryption/RepeatPassword", "text": "Repeat password" }, "$:/language/Encryption/PasswordNoMatch": { "title": "$:/language/Encryption/PasswordNoMatch", "text": "Passwords do not match" }, "$:/language/Encryption/SetPassword": { "title": "$:/language/Encryption/SetPassword", "text": "Set password" }, "$:/language/InvalidFieldName": { "title": "$:/language/InvalidFieldName", "text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)" }, "$:/language/MissingTiddler/Hint": { "title": "$:/language/MissingTiddler/Hint", "text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" - click {{$:/core/images/edit-button}} to create" }, "$:/language/OfficialPluginLibrary": { "title": "$:/language/OfficialPluginLibrary", "text": "Official ~TiddlyWiki Plugin Library" }, "$:/language/PluginReloadWarning": { "title": "$:/language/PluginReloadWarning", "text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to plugins to take effect" }, "$:/language/RecentChanges/DateFormat": { "title": "$:/language/RecentChanges/DateFormat", "text": "DDth MMM YYYY" }, "$:/language/SystemTiddler/Tooltip": { "title": "$:/language/SystemTiddler/Tooltip", "text": "This is a system tiddler" }, "$:/language/TagManager/Colour/Heading": { "title": "$:/language/TagManager/Colour/Heading", "text": "Colour" }, "$:/language/TagManager/Count/Heading": { "title": "$:/language/TagManager/Count/Heading", "text": "Count" }, "$:/language/TagManager/Icon/Heading": { "title": "$:/language/TagManager/Icon/Heading", "text": "Icon" }, "$:/language/TagManager/Info/Heading": { "title": "$:/language/TagManager/Info/Heading", "text": "Info" }, "$:/language/TagManager/Tag/Heading": { "title": "$:/language/TagManager/Tag/Heading", "text": "Tag" }, "$:/language/UnsavedChangesWarning": { "title": "$:/language/UnsavedChangesWarning", "text": "You have unsaved changes in TiddlyWiki" }, "$:/language/Modals/Download": { "title": "$:/language/Modals/Download", "type": "text/vnd.tiddlywiki", "subtitle": "Download changes", "footer": "<$button message=\"tm-close-tiddler\">Close</$button>", "help": "http://tiddlywiki.com/static/DownloadingChanges.html", "text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n" }, "$:/language/Modals/SaveInstructions": { "title": "$:/language/Modals/SaveInstructions", "type": "text/vnd.tiddlywiki", "subtitle": "Save your work", "footer": "<$button message=\"tm-close-tiddler\">Close</$button>", "help": "http://tiddlywiki.com/static/SavingChanges.html", "text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n" }, "$:/config/NewJournal/Title": { "title": "$:/config/NewJournal/Title", "text": "DDth MMM YYYY" }, "$:/config/NewJournal/Tags": { "title": "$:/config/NewJournal/Tags", "text": "Journal" }, "$:/language/Notifications/Save/Done": { "title": "$:/language/Notifications/Save/Done", "text": "Saved wiki" }, "$:/language/Notifications/Save/Starting": { "title": "$:/language/Notifications/Save/Starting", "text": "Starting to save wiki" }, "$:/language/Search/DefaultResults/Caption": { "title": "$:/language/Search/DefaultResults/Caption", "text": "List" }, "$:/language/Search/Filter/Caption": { "title": "$:/language/Search/Filter/Caption", "text": "Filter" }, "$:/language/Search/Filter/Hint": { "title": "$:/language/Search/Filter/Hint", "text": "Search via a [[filter expression|http://tiddlywiki.com/static/Filters.html]]" }, "$:/language/Search/Filter/Matches": { "title": "$:/language/Search/Filter/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/Matches": { "title": "$:/language/Search/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/Shadows/Caption": { "title": "$:/language/Search/Shadows/Caption", "text": "Shadows" }, "$:/language/Search/Shadows/Hint": { "title": "$:/language/Search/Shadows/Hint", "text": "Search for shadow tiddlers" }, "$:/language/Search/Shadows/Matches": { "title": "$:/language/Search/Shadows/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/Standard/Caption": { "title": "$:/language/Search/Standard/Caption", "text": "Standard" }, "$:/language/Search/Standard/Hint": { "title": "$:/language/Search/Standard/Hint", "text": "Search for standard tiddlers" }, "$:/language/Search/Standard/Matches": { "title": "$:/language/Search/Standard/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/Search/System/Caption": { "title": "$:/language/Search/System/Caption", "text": "System" }, "$:/language/Search/System/Hint": { "title": "$:/language/Search/System/Hint", "text": "Search for system tiddlers" }, "$:/language/Search/System/Matches": { "title": "$:/language/Search/System/Matches", "text": "//<small><<resultCount>> matches</small>//" }, "$:/language/SideBar/All/Caption": { "title": "$:/language/SideBar/All/Caption", "text": "All" }, "$:/language/SideBar/Contents/Caption": { "title": "$:/language/SideBar/Contents/Caption", "text": "Contents" }, "$:/language/SideBar/Drafts/Caption": { "title": "$:/language/SideBar/Drafts/Caption", "text": "Drafts" }, "$:/language/SideBar/Missing/Caption": { "title": "$:/language/SideBar/Missing/Caption", "text": "Missing" }, "$:/language/SideBar/More/Caption": { "title": "$:/language/SideBar/More/Caption", "text": "More" }, "$:/language/SideBar/Open/Caption": { "title": "$:/language/SideBar/Open/Caption", "text": "Open" }, "$:/language/SideBar/Orphans/Caption": { "title": "$:/language/SideBar/Orphans/Caption", "text": "Orphans" }, "$:/language/SideBar/Recent/Caption": { "title": "$:/language/SideBar/Recent/Caption", "text": "Recent" }, "$:/language/SideBar/Shadows/Caption": { "title": "$:/language/SideBar/Shadows/Caption", "text": "Shadows" }, "$:/language/SideBar/System/Caption": { "title": "$:/language/SideBar/System/Caption", "text": "System" }, "$:/language/SideBar/Tags/Caption": { "title": "$:/language/SideBar/Tags/Caption", "text": "Tags" }, "$:/language/SideBar/Tags/Untagged/Caption": { "title": "$:/language/SideBar/Tags/Untagged/Caption", "text": "untagged" }, "$:/language/SideBar/Tools/Caption": { "title": "$:/language/SideBar/Tools/Caption", "text": "Tools" }, "$:/language/SideBar/Types/Caption": { "title": "$:/language/SideBar/Types/Caption", "text": "Types" }, "$:/SiteSubtitle": { "title": "$:/SiteSubtitle", "text": "a non-linear personal web notebook" }, "$:/SiteTitle": { "title": "$:/SiteTitle", "text": "My ~TiddlyWiki" }, "$:/language/TiddlerInfo/Advanced/Caption": { "title": "$:/language/TiddlerInfo/Advanced/Caption", "text": "Advanced" }, "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": { "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint", "text": "none" }, "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": { "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading", "text": "Plugin Details" }, "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": { "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint", "text": "This plugin contains the following shadow tiddlers:" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading", "text": "Shadow Status" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint", "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint", "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source", "text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>" }, "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": { "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint", "text": "It is overridden by an ordinary tiddler" }, "$:/language/TiddlerInfo/Fields/Caption": { "title": "$:/language/TiddlerInfo/Fields/Caption", "text": "Fields" }, "$:/language/TiddlerInfo/List/Caption": { "title": "$:/language/TiddlerInfo/List/Caption", "text": "List" }, "$:/language/TiddlerInfo/List/Empty": { "title": "$:/language/TiddlerInfo/List/Empty", "text": "This tiddler does not have a list" }, "$:/language/TiddlerInfo/Listed/Caption": { "title": "$:/language/TiddlerInfo/Listed/Caption", "text": "Listed" }, "$:/language/TiddlerInfo/Listed/Empty": { "title": "$:/language/TiddlerInfo/Listed/Empty", "text": "This tiddler is not listed by any others" }, "$:/language/TiddlerInfo/References/Caption": { "title": "$:/language/TiddlerInfo/References/Caption", "text": "References" }, "$:/language/TiddlerInfo/References/Empty": { "title": "$:/language/TiddlerInfo/References/Empty", "text": "No tiddlers link to this one" }, "$:/language/TiddlerInfo/Tagging/Caption": { "title": "$:/language/TiddlerInfo/Tagging/Caption", "text": "Tagging" }, "$:/language/TiddlerInfo/Tagging/Empty": { "title": "$:/language/TiddlerInfo/Tagging/Empty", "text": "No tiddlers are tagged with this one" }, "$:/language/TiddlerInfo/Tools/Caption": { "title": "$:/language/TiddlerInfo/Tools/Caption", "text": "Tools" }, "$:/language/Docs/Types/application/javascript": { "title": "$:/language/Docs/Types/application/javascript", "description": "JavaScript code", "name": "application/javascript", "group": "Developer" }, "$:/language/Docs/Types/application/json": { "title": "$:/language/Docs/Types/application/json", "description": "JSON data", "name": "application/json", "group": "Developer" }, "$:/language/Docs/Types/application/x-tiddler-dictionary": { "title": "$:/language/Docs/Types/application/x-tiddler-dictionary", "description": "Data dictionary", "name": "application/x-tiddler-dictionary", "group": "Developer" }, "$:/language/Docs/Types/image/gif": { "title": "$:/language/Docs/Types/image/gif", "description": "GIF image", "name": "image/gif", "group": "Image" }, "$:/language/Docs/Types/image/jpeg": { "title": "$:/language/Docs/Types/image/jpeg", "description": "JPEG image", "name": "image/jpeg", "group": "Image" }, "$:/language/Docs/Types/image/png": { "title": "$:/language/Docs/Types/image/png", "description": "PNG image", "name": "image/png", "group": "Image" }, "$:/language/Docs/Types/image/svg+xml": { "title": "$:/language/Docs/Types/image/svg+xml", "description": "Structured Vector Graphics image", "name": "image/svg+xml", "group": "Image" }, "$:/language/Docs/Types/image/x-icon": { "title": "$:/language/Docs/Types/image/x-icon", "description": "ICO format icon file", "name": "image/x-icon", "group": "Image" }, "$:/language/Docs/Types/text/css": { "title": "$:/language/Docs/Types/text/css", "description": "Static stylesheet", "name": "text/css", "group": "Developer" }, "$:/language/Docs/Types/text/html": { "title": "$:/language/Docs/Types/text/html", "description": "HTML markup", "name": "text/html", "group": "Text" }, "$:/language/Docs/Types/text/plain": { "title": "$:/language/Docs/Types/text/plain", "description": "Plain text", "name": "text/plain", "group": "Text" }, "$:/language/Docs/Types/text/vnd.tiddlywiki": { "title": "$:/language/Docs/Types/text/vnd.tiddlywiki", "description": "TiddlyWiki 5", "name": "text/vnd.tiddlywiki", "group": "Text" }, "$:/language/Docs/Types/text/x-tiddlywiki": { "title": "$:/language/Docs/Types/text/x-tiddlywiki", "description": "TiddlyWiki Classic", "name": "text/x-tiddlywiki", "group": "Text" }, "$:/languages/en-GB/icon": { "title": "$:/languages/en-GB/icon", "type": "image/svg+xml", "text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n" }, "$:/languages/en-GB": { "title": "$:/languages/en-GB", "name": "en-GB", "description": "English (British)", "author": "JeremyRuston", "core-version": ">=5.0.0\"", "text": "Stub pseudo-plugin for the default language" }, "$:/core/modules/commander.js": { "text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n", "title": "$:/core/modules/commander.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/commands/build.js": { "text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/build.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/clearpassword.js": { "text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/clearpassword.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/editions.js": { "text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/editions.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/help.js": { "text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/help.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/init.js": { "text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/init.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/load.js": { "text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar ext = path.extname(self.params[0]);\n\tfs.readFile(this.params[0],$tw.utils.getTypeEncoding(ext),function(err,data) {\n\t\tif (err) {\n\t\t\tself.callback(err);\n\t\t} else {\n\t\t\tvar fields = {title: self.params[0]},\n\t\t\t\ttype = path.extname(self.params[0]);\n\t\t\tvar tiddlers = self.commander.wiki.deserializeTiddlers(type,data,fields);\n\t\t\tif(!tiddlers) {\n\t\t\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t\t\t} else {\n\t\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddlers[t]));\n\t\t\t\t}\n\t\t\t\tself.callback(null);\t\n\t\t\t}\n\t\t}\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/load.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/makelibrary.js": { "text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = fs.readdirSync(folder);\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = fs.readdirSync(folder);\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.pluginsPath));\n\tcollectPublisherPlugins(path.resolve($tw.boot.corePath,$tw.config.themesPath));\n\tcollectPlugins(path.resolve($tw.boot.corePath,$tw.config.languagesPath));\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers},null,$tw.config.preferences.jsonSpaces)\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/makelibrary.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/output.js": { "text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/output.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/password.js": { "text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/password.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/rendertiddler.js": { "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\";\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/rendertiddler.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/rendertiddlers.js": { "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\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\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\") != \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/rendertiddlers.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/savelibrarytiddlers.js": { "text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerData(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler,null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{text: undefined, readme: readmeContent, icon: iconContent}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/savelibrarytiddlers.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/savetiddler.js": { "text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title),\n\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t$tw.utils.createFileDirectories(filename);\n\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/savetiddler.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/savetiddlers.js": { "text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\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\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.deleteDirectory(pathname);\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/savetiddlers.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/server.js": { "text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif(!$tw.browser) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\thttp = require(\"http\");\n}\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\n/*\nA simple HTTP server with regexp-based routes\n*/\nfunction SimpleServer(options) {\n\tthis.routes = options.routes || [];\n\tthis.wiki = options.wiki;\n\tthis.variables = options.variables || {};\n}\n\nSimpleServer.prototype.set = function(obj) {\n\tvar self = this;\n\t$tw.utils.each(obj,function(value,name) {\n\t\tself.variables[name] = value;\n\t});\n};\n\nSimpleServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nSimpleServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nSimpleServer.prototype.findMatchingRoute = function(request,state) {\n\tvar pathprefix = this.get(\"pathprefix\") || \"\";\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(pathprefix) {\n\t\t\tif(pathname.substr(0,pathprefix.length) === pathprefix) {\n\t\t\t\tpathname = pathname.substr(pathprefix.length);\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nSimpleServer.prototype.checkCredentials = function(request,incomingUsername,incomingPassword) {\n\tvar header = request.headers.authorization || \"\",\n\t\ttoken = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tusername = parts[0],\n\t\tpassword = parts[1];\n\tif(incomingUsername === username && incomingPassword === password) {\n\t\treturn \"ALLOWED\";\n\t} else {\n\t\treturn \"DENIED\";\n\t}\n};\n\nSimpleServer.prototype.listen = function(port,host) {\n\tvar self = this;\n\thttp.createServer(function(request,response) {\n\t\t// Compose the state object\n\t\tvar state = {};\n\t\tstate.wiki = self.wiki;\n\t\tstate.server = self;\n\t\tstate.urlInfo = url.parse(request.url);\n\t\t// Find the route that matches this path\n\t\tvar route = self.findMatchingRoute(request,state);\n\t\t// Check for the username and password if we've got one\n\t\tvar username = self.get(\"username\"),\n\t\t\tpassword = self.get(\"password\");\n\t\tif(username && password) {\n\t\t\t// Check they match\n\t\t\tif(self.checkCredentials(request,username,password) !== \"ALLOWED\") {\n\t\t\t\tvar servername = state.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\";\n\t\t\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + servername + '\"'\n\t\t\t\t});\n\t\t\t\tresponse.end();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// Return a 404 if we didn't find a route\n\t\tif(!route) {\n\t\t\tresponse.writeHead(404);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t\t// Set the encoding for the incoming request\n\t\t// TODO: Presumably this would need tweaking if we supported PUTting binary tiddlers\n\t\trequest.setEncoding(\"utf8\");\n\t\t// Dispatch the appropriate method\n\t\tswitch(request.method) {\n\t\t\tcase \"GET\": // Intentional fall-through\n\t\t\tcase \"DELETE\":\n\t\t\t\troute.handler(request,response,state);\n\t\t\t\tbreak;\n\t\t\tcase \"PUT\":\n\t\t\t\tvar data = \"\";\n\t\t\t\trequest.on(\"data\",function(chunk) {\n\t\t\t\t\tdata += chunk.toString();\n\t\t\t\t});\n\t\t\t\trequest.on(\"end\",function() {\n\t\t\t\t\tstate.data = data;\n\t\t\t\t\troute.handler(request,response,state);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}).listen(port,host);\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n\t// Set up server\n\tthis.server = new SimpleServer({\n\t\twiki: this.commander.wiki\n\t});\n\t// Add route handlers\n\tthis.server.addRoute({\n\t\tmethod: \"PUT\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\tfields = JSON.parse(state.data);\n\t\t\t// Pull up any subfields in the `fields` object\n\t\t\tif(fields.fields) {\n\t\t\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\t\t\tfields[name] = field;\n\t\t\t\t});\n\t\t\t\tdelete fields.fields;\n\t\t\t}\n\t\t\t// Remove any revision field\n\t\t\tif(fields.revision) {\n\t\t\t\tdelete fields.revision;\n\t\t\t}\n\t\t\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title}));\n\t\t\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\t\t\tresponse.writeHead(204, \"OK\",{\n\t\t\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"DELETE\",\n\t\tpath: /^\\/bags\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]);\n\t\t\tstate.wiki.deleteTiddler(title);\n\t\t\tresponse.writeHead(204, \"OK\", {\n\t\t\t\t\"Content-Type\": \"text/plain\"\n\t\t\t});\n\t\t\tresponse.end();\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": state.server.get(\"serveType\")});\n\t\t\tvar text = state.wiki.renderTiddler(state.server.get(\"renderType\"),state.server.get(\"rootTiddler\"));\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/status$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar text = JSON.stringify({\n\t\t\t\tusername: state.server.get(\"username\"),\n\t\t\t\tspace: {\n\t\t\t\t\trecipe: \"default\"\n\t\t\t\t},\n\t\t\t\ttiddlywiki_version: $tw.version\n\t\t\t});\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/favicon.ico$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\t\t\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\t\t\tresponse.end(buffer,\"base64\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers.json$/,\n\t\thandler: function(request,response,state) {\n\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\tvar tiddlers = [];\n\t\t\tstate.wiki.forEachTiddler({sortField: \"title\"},function(title,tiddler) {\n\t\t\t\tvar tiddlerFields = {};\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tif(name !== \"text\") {\n\t\t\t\t\t\ttiddlerFields[name] = tiddler.getFieldString(name);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\ttiddlers.push(tiddlerFields);\n\t\t\t});\n\t\t\tvar text = JSON.stringify(tiddlers);\n\t\t\tresponse.end(text,\"utf8\");\n\t\t}\n\t});\n\tthis.server.addRoute({\n\t\tmethod: \"GET\",\n\t\tpath: /^\\/recipes\\/default\\/tiddlers\\/(.+)$/,\n\t\thandler: function(request,response,state) {\n\t\t\tvar title = decodeURIComponent(state.params[0]),\n\t\t\t\ttiddler = state.wiki.getTiddler(title),\n\t\t\t\ttiddlerFields = {},\n\t\t\t\tknownFields = [\n\t\t\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t\t\t];\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\t\t\ttiddlerFields[name] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\t\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t\t\t} else {\n\t\t\t\tresponse.writeHead(404);\n\t\t\t\tresponse.end();\n\t\t\t}\n\t\t}\n\t});\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\tvar port = this.params[0] || \"8080\",\n\t\trootTiddler = this.params[1] || \"$:/core/save/all\",\n\t\trenderType = this.params[2] || \"text/plain\",\n\t\tserveType = this.params[3] || \"text/html\",\n\t\tusername = this.params[4],\n\t\tpassword = this.params[5],\n\t\thost = this.params[6] || \"127.0.0.1\",\n\t\tpathprefix = this.params[7];\n\tthis.server.set({\n\t\trootTiddler: rootTiddler,\n\t\trenderType: renderType,\n\t\tserveType: serveType,\n\t\tusername: username,\n\t\tpassword: password,\n\t\tpathprefix: pathprefix\n\t});\n\tthis.server.listen(port,host);\n\tconsole.log(\"Serving on \" + host + \":\" + port);\n\tconsole.log(\"(press ctrl-C to exit)\");\n\t// Warn if required plugins are missing\n\tif($tw.boot.wikiInfo.plugins.indexOf(\"tiddlywiki/tiddlyweb\") === -1 || $tw.boot.wikiInfo.plugins.indexOf(\"tiddlywiki/filesystem\") === -1) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/server.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/setfield.js": { "text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current 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\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/setfield.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/unpackplugin.js": { "text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerData(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/unpackplugin.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/verbose.js": { "text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/verbose.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/commands/version.js": { "text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n", "title": "$:/core/modules/commands/version.js", "type": "application/javascript", "module-type": "command" }, "$:/core/modules/config.js": { "text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n", "title": "$:/core/modules/config.js", "type": "application/javascript", "module-type": "config" }, "$:/core/modules/deserializers.js": { "text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming = JSON.parse(text),\n\t\tresults = [];\n\tif($tw.utils.isArray(incoming)) {\n\t\tfor(var t=0; t<incoming.length; t++) {\n\t\t\tvar incomingFields = incoming[t],\n\t\t\t\tfields = {};\n\t\t\tfor(var f in incomingFields) {\n\t\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t\t}\n\t\t\t}\n\t\t\tresults.push(fields);\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n", "title": "$:/core/modules/deserializers.js", "type": "application/javascript", "module-type": "tiddlerdeserializer" }, "$:/core/modules/filters/addprefix.js": { "text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\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.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/addprefix.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/addsuffix.js": { "text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\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.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/addsuffix.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/after.js": { "text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\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.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n", "title": "$:/core/modules/filters/after.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/all/current.js": { "text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\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.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n", "title": "$:/core/modules/filters/all/current.js", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/missing.js": { "text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\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.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n", "title": "$:/core/modules/filters/all/missing.js", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/orphans.js": { "text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\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.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n", "title": "$:/core/modules/filters/all/orphans.js", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/shadows.js": { "text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\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.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n", "title": "$:/core/modules/filters/all/shadows.js", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all/tiddlers.js": { "text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\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.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n", "title": "$:/core/modules/filters/all/tiddlers.js", "type": "application/javascript", "module-type": "allfilteroperator" }, "$:/core/modules/filters/all.js": { "text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/all.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/backlinks.js": { "text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\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.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/backlinks.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/before.js": { "text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\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.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n", "title": "$:/core/modules/filters/before.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/commands.js": { "text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\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.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/commands.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/each.js": { "text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field\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.each = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = {};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value;\n\t\t\tif((operator.operand === \"\") || (operator.operand === \"title\")) {\n\t\t\t\tvalue = title;\n\t\t\t} else {\n\t\t\t\tvalue = tiddler.getFieldString(operator.operand);\n\t\t\t}\n\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\tvalues[value] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/each.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/eachday.js": { "text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\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.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/eachday.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/editiondescription.js": { "text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\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.editiondescription = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/editiondescription.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/editions.js": { "text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\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.editions = function(source,operator,options) {\n\tvar results = [],\n\t\teditionInfo = $tw.utils.getEditionInfo();\n\tif(editionInfo) {\n\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\tresults.push(name);\n\t\t});\n\t}\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/editions.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/field.js": { "text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\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.field = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/field.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/fields.js": { "text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\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.fields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/fields.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/get.js": { "text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/get.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/getindex.js": { "text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\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.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/getindex.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/has.js": { "text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field\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.has = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand) || tiddler.fields[operator.operand] === \"\"))) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && tiddler.fields[operator.operand] !== \"\") {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/has.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/haschanged.js": { "text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\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.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/haschanged.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/indexes.js": { "text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\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.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerData(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/indexes.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/is/current.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\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.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/current.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/image.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\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.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/image.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/missing.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\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.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/missing.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/orphan.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\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.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/orphan.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/shadow.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\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.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/shadow.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/system.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\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.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/system.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/tag.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\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.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/tag.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is/tiddler.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\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.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/is/tiddler.js", "type": "application/javascript", "module-type": "isfilteroperator" }, "$:/core/modules/filters/is.js": { "text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tvar isFilterOperator = isFilterOperators[operator.operand];\n\tif(isFilterOperator) {\n\t\treturn isFilterOperator(source,operator.prefix,options);\n\t} else {\n\t\treturn [\"Filter Error: Unknown operand for the 'is' filter operator\"];\n\t}\n};\n\n})();\n", "title": "$:/core/modules/filters/is.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/limit.js": { "text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\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.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/limit.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/links.js": { "text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\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.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/links.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/list.js": { "text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\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.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/list.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/listed.js": { "text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\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.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/listed.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/listops.js": { "text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = parseInt(operator.operand) || 1,\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n", "title": "$:/core/modules/filters/listops.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/modules.js": { "text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\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.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/modules.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/moduletypes.js": { "text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\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.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/moduletypes.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/next.js": { "text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\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.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/next.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/plugintiddlers.js": { "text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\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.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerData(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/plugintiddlers.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/prefix.js": { "text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\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.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/prefix.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/previous.js": { "text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\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.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/previous.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/regexp.js": { "text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\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.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/regexp.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/removeprefix.js": { "text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\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.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/removeprefix.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/removesuffix.js": { "text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\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.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/removesuffix.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/sameday.js": { "text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\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.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tvar isSameDay = function(dateField) {\n\t\t\treturn (new Date(dateField)).setHours(0,0,0,0) === targetDate;\n\t\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tif(isSameDay($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/sameday.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/search.js": { "text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\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.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffix) {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: operator.suffix\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n", "title": "$:/core/modules/filters/search.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/shadowsource.js": { "text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\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.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/shadowsource.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/sort.js": { "text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\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.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/sort.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/splitbefore.js": { "text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\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.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/splitbefore.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/storyviews.js": { "text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\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.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/storyviews.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/suffix.js": { "text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\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.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/suffix.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/tag.js": { "text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\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.tag = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && !tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.hasTag(operator.operand)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/tag.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/tagging.js": { "text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\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.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/tagging.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/tags.js": { "text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\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.tags = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\t$tw.utils.pushTop(results,tiddler.fields.tags);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/tags.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/title.js": { "text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\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.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/title.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters/untagged.js": { "text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\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.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n", "title": "$:/core/modules/filters/untagged.js", "type": "application/javascript", "module-type": "filteroperator" }, "$:/core/modules/filters.js": { "text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar operator, operand, bracketPos, curlyBracketPos;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tvar nextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\n\t\tp = nextBracketPos + 1;\n\t\tswitch (bracket) {\n\t\t\tcase \"{\": // Curly brackets\n\t\t\t\toperator.indirect = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"[\": // Square brackets\n\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"<\": // Angle brackets\n\t\t\t\toperator.variable = true;\n\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\tbreak;\n\t\t\tcase \"/\": // regexp brackets\n\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\tif(rexMatch) {\n\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n// DEPRECATION WARNING\nconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t}\n\t\tif(!operator.regexp) {\n\t\t\toperator.operand = filterString.substring(p,nextBracketPos);\n\t\t}\n\t\tp = nextBracketPos + 1;\n\t\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-)?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow \"Syntax error in filter expression\";\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp++;\n\t\t\t}\n\t\t\tif(match[2]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[3] || match[4] || match[5]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operand: match[3] || match[4] || match[5]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [\"Filter error: \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operand = operator.operand,\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\tif(operator.indirect) {\n\t\t\t\t\toperand = self.getTextReference(operator.operand,\"\",currTiddlerTitle);\n\t\t\t\t}\n\t\t\t\tif(operator.variable) {\n\t\t\t\t\toperand = widget.getVariable(operator.operand,{defaultValue: \"\"});\n\t\t\t\t}\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operand,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t$tw.utils.removeArrayEntries(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\t\t\t\t\tsource = self.makeTiddlerIterator(results);\n\t\t\t\t\t\tresults.splice(0,results.length);\n\t\t\t\t\t\t$tw.utils.pushTop(results,operationSubFunction(source,widget));\n\t\t\t\t\t};\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter\",function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = [];\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results;\n\t});\n};\n\n})();\n", "title": "$:/core/modules/filters.js", "type": "application/javascript", "module-type": "wikimethod" }, "$:/core/modules/info/platform.js": { "text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function() {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\treturn infoTiddlerFields;\n};\n\n})();\n", "title": "$:/core/modules/info/platform.js", "type": "application/javascript", "module-type": "info" }, "$:/core/modules/language.js": { "text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a single translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\nexports.Language = Language;\n\n})();\n", "title": "$:/core/modules/language.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/macros/changecount.js": { "text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\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 = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n", "title": "$:/core/modules/macros/changecount.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/contrastcolour.js": { "text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\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 = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n", "title": "$:/core/modules/macros/contrastcolour.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/csvtiddlers.js": { "text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\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 = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n", "title": "$:/core/modules/macros/csvtiddlers.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/dumpvariables.js": { "text": "/*\\\ntitle: $:/core/modules/macros/dumpvariables.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to dump all active variable values\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 = \"dumpvariables\";\n\nexports.params = [\n];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\tvar output = [\"|!Variable |!Value |\"],\n\t\tvariables = [], variable;\n\tfor(variable in this.variables) {\n\t\tvariables.push(variable);\n\t}\n\tvariables.sort();\n\tfor(var index=0; index<variables.length; index++) {\n\t\tvar variable = variables[index];\n\t\toutput.push(\"|\" + variable + \" |<input size=50 value=<<\" + variable + \">>/> |\")\n\t}\n\treturn output.join(\"\\n\");\n};\n\n})();\n", "title": "$:/core/modules/macros/dumpvariables.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/jsontiddlers.js": { "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\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 = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter) {\n\tvar tiddlers = this.wiki.filterTiddlers(filter),\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n", "title": "$:/core/modules/macros/jsontiddlers.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/makedatauri.js": { "text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert the content of a tiddler to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\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 = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type) {\n\treturn $tw.utils.makeDataUri(text,type);\n};\n\n})();\n", "title": "$:/core/modules/macros/makedatauri.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/now.js": { "text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\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 = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n", "title": "$:/core/modules/macros/now.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/qualify.js": { "text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\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 = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n", "title": "$:/core/modules/macros/qualify.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/resolvepath.js": { "text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n", "title": "$:/core/modules/macros/resolvepath.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/macros/version.js": { "text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\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 = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n", "title": "$:/core/modules/macros/version.js", "type": "application/javascript", "module-type": "macro" }, "$:/core/modules/parsers/audioparser.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n", "title": "$:/core/modules/parsers/audioparser.js", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/csvparser.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n", "title": "$:/core/modules/parsers/csvparser.js", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/htmlparser.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"sandbox\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n", "title": "$:/core/modules/parsers/htmlparser.js", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/imageparser.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.tag = \"embed\";\n\t\t}\n\t} else if(text) {\n\t\tif(type === \"application/pdf\" || type === \".pdf\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t\t\telement.tag = \"embed\";\n\t\t} else if(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"application/pdf\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n", "title": "$:/core/modules/parsers/imageparser.js", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/utils/parseutils.js": { "text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar node = {\n\t\ttype: \"whitespace\",\n\t\tstart: pos\n\t};\n\tvar re = /(\\s)+/g;\n\tre.lastIndex = pos;\n\tvar match = re.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t}\n\treturn null;\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar whitespace = $tw.utils.parseWhiteSpace(source,pos);\n\tif(whitespace) {\n\t\treturn whitespace.end;\n\t}\n\treturn pos;\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for an indirect value\n\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\tif(indirectValue) {\n\t\t\t\tpos = indirectValue.end;\n\t\t\t\tnode.type = \"indirect\";\n\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for a unquoted value\n\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\tif(unquotedValue) {\n\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n", "title": "$:/core/modules/utils/parseutils.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/parsers/textparser.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n", "title": "$:/core/modules/parsers/textparser.js", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/wikiparser/rules/codeblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/codeinline.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/commentblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/commentinline.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/dash.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/dash.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();", "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/entity.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/entity.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/extlink.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: http://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|'\"\\\\^~]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/extlink.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/heading.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/heading.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/horizrule.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/html.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/html.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/image.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[http://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [http://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [http://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|http://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/image.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/list.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"p\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/list.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/macrodef.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /(\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"macrodef\",\n\t\tname: this.match[1],\n\t\tparams: params,\n\t\ttext: text\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[http://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|http://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/prettylink.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/quoteblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/rules.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/rules.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/styleblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/styleinline.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/syslink.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?\\$:\\/[a-zA-Z/.-]+/mg;\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();", "title": "$:/core/modules/parsers/wikiparser/rules/syslink.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/table.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/table.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/typedblock.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/rules/wikilink.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js", "type": "application/javascript", "module-type": "wikirule" }, "$:/core/modules/parsers/wikiparser/wikiparser.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\tthis.tree.push.apply(this.tree,this.parseInlineRun());\n\t} else {\n\t\tthis.tree.push.apply(this.tree,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar tree = [];\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t}\n\treturn tree;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,nextMatch.matchIndex)});\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,terminatorMatch.index)});\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\ttree.push({type: \"text\", text: this.source.substring(this.pos,inlineRuleMatch.matchIndex)});\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\ttree.push({type: \"text\", text: this.source.substr(this.pos)});\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar keepFilter;\n\tif(type === \"only\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) !== -1;\n\t\t};\n\t} else if(type === \"except\") {\n\t\tkeepFilter = function(name) {\n\t\t\treturn names.indexOf(name) === -1;\n\t\t};\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif(!keepFilter(ruleArray[t].rule.name)) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n", "title": "$:/core/modules/parsers/wikiparser/wikiparser.js", "type": "application/javascript", "module-type": "parser" }, "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": { "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n", "title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/pluginswitcher.js": { "text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n", "title": "$:/core/modules/pluginswitcher.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/saver-handler.js": { "text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tthis.numChanges = 0;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(callback) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\tcallback(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\",\n\t\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert(\"Error while saving:\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\") {\n\t\treturn false;\n\t}\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n", "title": "$:/core/modules/saver-handler.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/savers/andtidwiki.js": { "text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t// Strip the file://\n\tif(pathname.indexOf(\"file://\") === 0) {\n\t\tpathname = pathname.substr(7);\n\t}\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Save the file\n\twindow.twi.saveFile(pathname,text);\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/andtidwiki.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/download.js": { "text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\tfilename = document.location.pathname.substr(p+1);\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tlink.setAttribute(\"target\",\"_blank\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/download.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/fsosaver.js": { "text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/fsosaver.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/manualdownload.js": { "text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/manualdownload.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/msdownload.js": { "text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/msdownload.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/tiddlyfox.js": { "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/tiddlyfox.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/tiddlyie.js": { "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/tiddlyie.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/twedit.js": { "text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback(\"Error saving to TWEdit: \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n", "title": "$:/core/modules/savers/twedit.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/savers/upload.js": { "text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; ;charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback(\"Error:\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n", "title": "$:/core/modules/savers/upload.js", "type": "application/javascript", "module-type": "saver" }, "$:/core/modules/browser-messaging.js": { "text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\"),\n\t\t\tiframeInfo = {\n\t\t\t\turl: url,\n\t\t\t\tstatus: \"loading\",\n\t\t\t\tdomNode: iframe\n\t\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert(\"Error loading plugin library: \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert(\"Error loading plugin library: \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\tconsole.log(\"browser-messaging: \",document.location.toString())\n\t\tconsole.log(\"browser-messaging: Received message from\",event.origin);\n\t\tconsole.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n", "title": "$:/core/modules/browser-messaging.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/commands.js": { "text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n", "title": "$:/core/modules/startup/commands.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/favicon.js": { "text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",\"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text);\n\t}\n}\n\n})();\n", "title": "$:/core/modules/startup/favicon.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/info.js": { "text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Collect up the info tiddlers\n\tvar infoTiddlerFields = {};\n\t// Give each info module a chance to fill in as many info tiddlers as they want\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tvar tiddlerFieldsArray = moduleExports.getInfoTiddlerFields(infoTiddlerFields);\n\t\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\t\tif(fields) {\n\t\t\t\t\tinfoTiddlerFields[fields.title] = fields;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Bake the info tiddlers into a plugin\n\tvar fields = {\n\t\ttitle: \"$:/temp/info-plugin\",\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"info\",\n\t\ttext: JSON.stringify({tiddlers: infoTiddlerFields},null,$tw.config.preferences.jsonSpaces)\n\t};\n\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\t$tw.wiki.readPluginInfo();\n\t$tw.wiki.registerPluginTiddlers(\"info\");\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n", "title": "$:/core/modules/startup/info.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/load-modules.js": { "text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n", "title": "$:/core/modules/startup/load-modules.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/password.js": { "text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n", "title": "$:/core/modules/startup/password.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/render.js": { "text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/PageTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar DRAFT_TIDDLER_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n\t})();\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only drafts have changed\n\t\tvar onlyDraftsHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !tiddler.hasField(\"draft.of\")) {\n\t\t\t\tonlyDraftsHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyDraftsHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = DRAFT_TIDDLER_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n};\n\n})();\n", "title": "$:/core/modules/startup/render.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/rootwidget.js": { "text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param);\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tif(document[fullscreen._fullscreenElement]) {\n\t\t\t\tdocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tdocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n", "title": "$:/core/modules/startup/rootwidget.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup.js": { "text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION = false;\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t}\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance(PERFORMANCE_INSTRUMENTATION);\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-US\"\n\t\t]\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget = new widget.widget({\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},{\n\t\t\twiki: $tw.wiki,\n\t\t\tdocument: document\n\t\t});\n\t}\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t} \n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({wiki: $tw.wiki, dirtyTracking: !$tw.syncadaptor});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n", "title": "$:/core/modules/startup.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/story.js": { "text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers();\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permalink\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: \"permaview\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle\n\t\t\t});\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t//invoke any hooks that might change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// If a target tiddler was specified add it to the history stack\n\tif(target && target !== \"\") {\n\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t}\n\t\t$tw.wiki.addToHistory(target);\n\t} else if(storyList.length > 0) {\n\t\t$tw.wiki.addToHistory(storyList[0]);\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\tif(options.updateAddressBar !== \"no\") {\n\t\t// Get the story and the history stack\n\t\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\t\ttargetTiddler = \"\";\n\t\tif(options.targetTiddler) {\n\t\t\ttargetTiddler = options.targetTiddler;\n\t\t} else {\n\t\t\t// The target tiddler is the one at the top of the stack\n\t\t\tif(historyList.length > 0) {\n\t\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t\t}\n\t\t\t// Blank the target tiddler if it isn't present in the story\n\t\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\t\ttargetTiddler = \"\";\n\t\t\t}\n\t\t}\n\t\t// Assemble the location hash\n\t\tif(options.updateAddressBar === \"permalink\") {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t} else {\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t}\n\t\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\t\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\t\tif(options.updateHistory === \"yes\") {\n\t\t\t\t// Assign the location hash so that history is updated\n\t\t\t\twindow.location.hash = $tw.locationHash;\n\t\t\t} else {\n\t\t\t\t// We use replace so that browser history isn't affected\n\t\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t\t}\n\t\t}\n\t}\n}\n\n})();\n", "title": "$:/core/modules/startup/story.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/startup/windows.js": { "text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\nvar windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\";\n\t\t// Open the window\n\t\tvar srcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\twindows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = title;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{document: $tw.fakeDocument}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: {currentTiddler: title}});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each(windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n", "title": "$:/core/modules/startup/windows.js", "type": "application/javascript", "module-type": "startup" }, "$:/core/modules/storyviews/classic.js": { "text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Get the current height of the tiddler\n\tvar currWidth = targetElement.offsetWidth,\n\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t// Remove the dom nodes of the widget at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"translateX(0px)\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.classic = ClassicStoryView;\n\n})();", "title": "$:/core/modules/storyviews/classic.js", "type": "application/javascript", "module-type": "storyview" }, "$:/core/modules/storyviews/pop.js": { "text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n", "title": "$:/core/modules/storyviews/pop.js", "type": "application/javascript", "module-type": "storyview" }, "$:/core/modules/storyviews/zoomin.js": { "text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerData(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n", "title": "$:/core/modules/storyviews/zoomin.js", "type": "application/javascript", "module-type": "storyview" }, "$:/core/modules/syncer.js": { "text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store. If a syncadaptor is used then individual tiddlers are synchronised through it. If there is no syncadaptor then the entire wiki is saved via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.syncadaptor = options.syncadaptor;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\"));\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\t// Tasks are {type: \"load\"/\"save\"/\"delete\", title:, queueTime:, lastModificationTime:}\n\tthis.taskQueue = {}; // Hashmap of tasks yet to be performed\n\tthis.taskInProgress = {}; // Hash of tasks in progress\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.syncToServer(changes);\n\t});\n\t// Browser event handlers\n\tif($tw.browser) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function() {\n\t\t\tself.handleLoginEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\tself.handleLazyLoadEvent(title);\n\t});\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nConstants\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.filterFn.call(this.wiki);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tself.tiddlerInfo[title] = {\n\t\t\trevision: tiddler.fields.revision,\n\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t};\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\treturn (this.numTasksInQueue() > 0) || (this.numTasksInProgress() > 0);\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(this.wiki.getTiddler(tiddlerFields.title),tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: tiddlerFields.revision,\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Set the various status tiddlers\n\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\tif(isLoggedIn) {\n\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t} else {\n\t\t\t\tself.wiki.deleteTiddler(self.titleUserName);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tif(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tvar self = this;\n\t\tif(this.pollTimerId) {\n\t\t\tclearTimeout(this.pollTimerId);\n\t\t\tthis.pollTimerId = null;\n\t\t}\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\t// Trigger the next sync\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(\"Error retrieving skinny tiddler list:\",err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null;\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Do a full load if we've already got a fat version of the tiddler\n\t\t\t\t\tif(tiddler && tiddler.fields.text !== undefined) {\n\t\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\t\tself.enqueueSyncTask({\n\t\t\t\t\t\t\ttype: \"load\",\n\t\t\t\t\t\t\ttitle: tiddlerFields.title\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Load the skinny version of the tiddler\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nSynchronise a set of changes to the server\n*/\nSyncer.prototype.syncToServer = function(changes) {\n\tvar self = this,\n\t\tnow = Date.now(),\n\t\tfilteredChanges = this.filterFn.call(this.wiki,function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t$tw.utils.each(changes,function(change,title,object) {\n\t\t// Process the change if it is a deletion of a tiddler we're already syncing, or is on the filtered change list\n\t\tif((change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) || filteredChanges.indexOf(title) !== -1) {\n\t\t\t// Queue a task to sync this tiddler\n\t\t\tself.enqueueSyncTask({\n\t\t\t\ttype: change.deleted ? \"delete\" : \"save\",\n\t\t\t\ttitle: title\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Queue up a sync task to load this tiddler\n\tthis.enqueueSyncTask({\n\t\ttype: \"load\",\n\t\ttitle: title\n\t});\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!isLoggedIn) {\n\t\t\t$tw.passwordPrompt.createPrompt({\n\t\t\t\tserviceName: \"Login to TiddlySpace\",\n\t\t\t\tcallback: function(data) {\n\t\t\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\t\t\tself.syncFromServer();\n\t\t\t\t\t});\n\t\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(null,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nQueue up a sync task. If there is already a pending task for the tiddler, just update the last modification time\n*/\nSyncer.prototype.enqueueSyncTask = function(task) {\n\tvar self = this,\n\t\tnow = Date.now();\n\t// Set the timestamps on this task\n\ttask.queueTime = now;\n\ttask.lastModificationTime = now;\n\t// Fill in some tiddlerInfo if the tiddler is one we haven't seen before\n\tif(!$tw.utils.hop(this.tiddlerInfo,task.title)) {\n\t\tthis.tiddlerInfo[task.title] = {\n\t\t\trevision: null,\n\t\t\tadaptorInfo: {},\n\t\t\tchangeCount: -1\n\t\t};\n\t}\n\t// Bail if this is a save and the tiddler is already at the changeCount that the server has\n\tif(task.type === \"save\" && this.wiki.getChangeCount(task.title) <= this.tiddlerInfo[task.title].changeCount) {\n\t\treturn;\n\t}\n\t// Check if this tiddler is already in the queue\n\tif($tw.utils.hop(this.taskQueue,task.title)) {\n\t\t// this.logger.log(\"Re-queueing up sync task with type:\",task.type,\"title:\",task.title);\n\t\tvar existingTask = this.taskQueue[task.title];\n\t\t// If so, just update the last modification time\n\t\texistingTask.lastModificationTime = task.lastModificationTime;\n\t\t// If the new task is a save then we upgrade the existing task to a save. Thus a pending load is turned into a save if the tiddler changes locally in the meantime. But a pending save is not modified to become a load\n\t\tif(task.type === \"save\" || task.type === \"delete\") {\n\t\t\texistingTask.type = task.type;\n\t\t}\n\t} else {\n\t\t// this.logger.log(\"Queuing up sync task with type:\",task.type,\"title:\",task.title);\n\t\t// If it is not in the queue, insert it\n\t\tthis.taskQueue[task.title] = task;\n\t\tthis.updateDirtyStatus();\n\t}\n\t// Process the queue\n\t$tw.utils.nextTick(function() {self.processTaskQueue.call(self);});\n};\n\n/*\nReturn the number of tasks in progress\n*/\nSyncer.prototype.numTasksInProgress = function() {\n\treturn $tw.utils.count(this.taskInProgress);\n};\n\n/*\nReturn the number of tasks in the queue\n*/\nSyncer.prototype.numTasksInQueue = function() {\n\treturn $tw.utils.count(this.taskQueue);\n};\n\n/*\nTrigger a timeout if one isn't already outstanding\n*/\nSyncer.prototype.triggerTimeout = function() {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},self.taskTimerInterval);\n\t}\n};\n\n/*\nProcess the task queue, performing the next task if appropriate\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if we're not already performing a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif(this.numTasksInProgress() === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(task) {\n\t\t\t// Remove the task from the queue and add it to the in progress list\n\t\t\tdelete this.taskQueue[task.title];\n\t\t\tthis.taskInProgress[task.title] = task;\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// Dispatch the task\n\t\t\tthis.dispatchTask(task,function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\tself.logger.alert(\"Sync error while processing '\" + task.title + \"':\\n\" + err);\n\t\t\t\t}\n\t\t\t\t// Mark that this task is no longer in progress\n\t\t\t\tdelete self.taskInProgress[task.title];\n\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t// Process the next task\n\t\t\t\tself.processTaskQueue.call(self);\n\t\t\t});\n\t\t} else {\n\t\t\t// Make sure we've set a time if there wasn't a task to perform, but we've still got tasks in the queue\n\t\t\tif(this.numTasksInQueue() > 0) {\n\t\t\t\tthis.triggerTimeout();\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nChoose the next applicable task\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar self = this,\n\t\tcandidateTask = null,\n\t\tnow = Date.now();\n\t// Select the best candidate task\n\t$tw.utils.each(this.taskQueue,function(task,title) {\n\t\t// Exclude the task if there's one of the same name in progress\n\t\tif($tw.utils.hop(self.taskInProgress,title)) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is a save and the tiddler has been modified recently, but not hit the fallback time\n\t\tif(task.type === \"save\" && (now - task.lastModificationTime) < self.throttleInterval &&\n\t\t\t(now - task.queueTime) < self.fallbackInterval) {\n\t\t\treturn;\n\t\t}\n\t\t// Exclude the task if it is newer than the current best candidate\n\t\tif(candidateTask && candidateTask.queueTime < task.queueTime) {\n\t\t\treturn;\n\t\t}\n\t\t// Now this is our best candidate\n\t\tcandidateTask = task;\n\t});\n\treturn candidateTask;\n};\n\n/*\nDispatch a task and invoke the callback\n*/\nSyncer.prototype.dispatchTask = function(task,callback) {\n\tvar self = this;\n\tif(task.type === \"save\") {\n\t\tvar changeCount = this.wiki.getChangeCount(task.title),\n\t\t\ttiddler = this.wiki.getTiddler(task.title);\n\t\tthis.logger.log(\"Dispatching 'save' task:\",task.title);\n\t\tif(tiddler) {\n\t\t\tthis.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\t// Adjust the info stored about this tiddler\n\t\t\t\tself.tiddlerInfo[task.title] = {\n\t\t\t\t\tchangeCount: changeCount,\n\t\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\t\trevision: revision\n\t\t\t\t};\n\t\t\t\t// Invoke the callback\n\t\t\t\tcallback(null);\n\t\t\t},{\n\t\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t\t});\n\t\t} else {\n\t\t\tthis.logger.log(\" Not Dispatching 'save' task:\",task.title,\"tiddler does not exist\");\n\t\t\treturn callback(null);\n\t\t}\n\t} else if(task.type === \"load\") {\n\t\t// Load the tiddler\n\t\tthis.logger.log(\"Dispatching 'load' task:\",task.title);\n\t\tthis.syncadaptor.loadTiddler(task.title,function(err,tiddlerFields) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Store the tiddler\n\t\t\tif(tiddlerFields) {\n\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t});\n\t} else if(task.type === \"delete\") {\n\t\t// Delete the tiddler\n\t\tthis.logger.log(\"Dispatching 'delete' task:\",task.title);\n\t\tthis.syncadaptor.deleteTiddler(task.title,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tdelete self.tiddlerInfo[task.title];\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.tiddlerInfo[task.title]\n\t\t});\n\t}\n};\n\nexports.Syncer = Syncer;\n\n})();\n", "title": "$:/core/modules/syncer.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/tiddler.js": { "text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = [];\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields.push(field + \": \" + this.getFieldString(field));\n\t\t\t}\n\t\t}\n\t}\n\treturn fields.join(\"\\n\");\n};\n\n/*\nCompare two tiddlers for equality\ntiddler: the tiddler to compare\nexcludeFields: array of field names to exclude from the comparison\n*/\nexports.isEqual = function(tiddler,excludeFields) {\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\treturn false;\n\t}\n\texcludeFields = excludeFields || [];\n\tvar self = this,\n\t\tdifferences = []; // Fields that have differences\n\t// Add to the differences array\n\tfunction addDifference(fieldName) {\n\t\t// Check for this field being excluded\n\t\tif(excludeFields.indexOf(fieldName) === -1) {\n\t\t\t// Save the field as a difference\n\t\t\t$tw.utils.pushTop(differences,fieldName);\n\t\t}\n\t}\n\t// Returns true if the two values of this field are equal\n\tfunction isFieldValueEqual(fieldName) {\n\t\tvar valueA = self.fields[fieldName],\n\t\t\tvalueB = tiddler.fields[fieldName];\n\t\t// Check for identical string values\n\t\tif(typeof(valueA) === \"string\" && typeof(valueB) === \"string\" && valueA === valueB) {\n\t\t\treturn true;\n\t\t}\n\t\t// Check for identical array values\n\t\tif($tw.utils.isArray(valueA) && $tw.utils.isArray(valueB) && $tw.utils.isArrayEqual(valueA,valueB)) {\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise the fields must be different\n\t\treturn false;\n\t}\n\t// Compare our fields\n\tfor(var fieldName in this.fields) {\n\t\tif(!isFieldValueEqual(fieldName)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// There's a difference for every field in the other tiddler that we don't have\n\tfor(fieldName in tiddler.fields) {\n\t\tif(!(fieldName in this.fields)) {\n\t\t\taddDifference(fieldName);\n\t\t}\n\t}\n\t// Return whether there were any differences\n\treturn differences.length === 0;\n};\n\n})();\n", "title": "$:/core/modules/tiddler.js", "type": "application/javascript", "module-type": "tiddlermethod" }, "$:/core/modules/upgraders/plugins.js": { "text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"] && incomingTiddler.version) {\n\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n", "title": "$:/core/modules/upgraders/plugins.js", "type": "application/javascript", "module-type": "upgrader" }, "$:/core/modules/upgraders/system.js": { "text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n", "title": "$:/core/modules/upgraders/system.js", "type": "application/javascript", "module-type": "upgrader" }, "$:/core/modules/upgraders/themetweaks.js": { "text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerData(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n", "title": "$:/core/modules/upgraders/themetweaks.js", "type": "application/javascript", "module-type": "upgrader" }, "$:/core/modules/utils/crypto.js": { "text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n", "title": "$:/core/modules/utils/crypto.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/animations/slide.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n", "title": "$:/core/modules/utils/dom/animations/slide.js", "type": "application/javascript", "module-type": "animation" }, "$:/core/modules/utils/dom/animator.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n", "title": "$:/core/modules/utils/dom/animator.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/browser.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif(document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n", "title": "$:/core/modules/utils/dom/browser.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/csscolorparser.js": { "text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n", "title": "$:/core/modules/utils/dom/csscolorparser.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.className && el.className.toString().split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = el.className.split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t}\n\tel.className = c.join(\" \");\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = el.className.split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.className = c.join(\" \");\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function() {\n\tif(\"scrollX\" in window) {\n\t\treturn {x: window.scrollX, y: window.scrollY};\n\t} else {\n\t\treturn {x: document.documentElement.scrollLeft, y: document.documentElement.scrollTop};\n\t}\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\ttry {\n\t\tif(window.localStorage) {\n\t\t\tlocalStorage.setItem(\"tw5-password-\" + name,password);\n\t\t}\n\t} catch(e) {\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\ttry {\n\t\treturn window.localStorage ? localStorage.getItem(\"tw5-password-\" + name) : \"\";\n\t} catch(e) {\n\t\treturn \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n\n})();\n", "title": "$:/core/modules/utils/dom.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/http.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data)\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tdata = results.join(\"&\");\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this.responseText,this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback(\"XMLHttpRequest error code: \" + this.status);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,options.url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !$tw.utils.hop(headers,\"Content-type\")) {\n\t\trequest.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\trequest.send(data);\n\treturn request;\n};\n\n})();\n", "title": "$:/core/modules/utils/dom/http.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/keyboard.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"enter\": 13,\n\t\"escape\": 27\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nexports.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(\"+\"),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase();\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(namedKeys[s]) {\n\t\t\tinfo.keyCode = namedKeys[s];\n\t\t}\n\t}\n\treturn info;\n};\n\nexports.checkKeyDescriptor = function(event,keyInfo) {\n\tvar metaKeyStatus = !!keyInfo.metaKey; // Using a temporary variable to keep JSHint happy\n\treturn event.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === metaKeyStatus;\t\n};\n\n})();\n", "title": "$:/core/modules/utils/dom/keyboard.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/modal.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\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\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Create the wrapper divs\n\tvar wrapper = document.createElement(\"div\"),\n\t\tmodalBackdrop = document.createElement(\"div\"),\n\t\tmodalWrapper = document.createElement(\"div\"),\n\t\tmodalHeader = document.createElement(\"div\"),\n\t\theaderTitle = document.createElement(\"h3\"),\n\t\tmodalBody = document.createElement(\"div\"),\n\t\tmodalLink = document.createElement(\"a\"),\n\t\tmodalFooter = document.createElement(\"div\"),\n\t\tmodalFooterHelp = document.createElement(\"span\"),\n\t\tmodalFooterButtons = document.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(document.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler && tiddler.fields && tiddler.fields.help) {\n\t\tvar link = document.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.appendChild(document.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: \"Close\"\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + window.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\twindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tdocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tdocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tif($tw.pageContainer) {\n\t\t$tw.utils.toggleClass($tw.pageContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n", "title": "$:/core/modules/utils/dom/modal.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/notifier.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\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\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{parentWidget: $tw.rootWidget, document: document, variables: variables});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n", "title": "$:/core/modules/utils/dom/notifier.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/popup.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === options.title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\t// Store the popup details\n\tthis.popups.push({\n\t\ttitle: options.title,\n\t\twiki: options.wiki,\n\t\tdomNode: options.domNode\n\t});\n\t// Set the state tiddler\n\toptions.wiki.setTextReference(options.title,\n\t\t\t\"(\" + options.domNode.offsetLeft + \",\" + options.domNode.offsetTop + \",\" + \n\t\t\t\toptions.domNode.offsetWidth + \",\" + options.domNode.offsetHeight + \")\");\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n", "title": "$:/core/modules/utils/dom/popup.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/dom/scroller.js": { "text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\treturn this.scrollIntoView(event.target);\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\t// Now get ready to scroll the body\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = $tw.utils.getScrollPosition();\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar clientBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\ttop: clientBounds.top + scrollPosition.y,\n\t\t\twidth: clientBounds.width,\n\t\t\theight: clientBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t// targetPos/targetSize - position and size of the target element\n\t// currentPos/currentSize - position and size of the current scroll viewport\n\t// returns: new position of the scroll viewport\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to it's top/left\n\t\t\tif(targetPos <= currentPos) {\n\t\t\t\tnewPos = targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\tnewPos = targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\tnewPos = targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\tnewPos = currentPos;\n\t\t\t}\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,window.innerWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,window.innerHeight);\n\t// Only scroll if the position has changed\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\twindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n", "title": "$:/core/modules/utils/dom/scroller.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/edition-info.js": { "text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n", "title": "$:/core/modules/utils/edition-info.js", "type": "application/javascript", "module-type": "utils-node" }, "$:/core/modules/utils/fakedom.js": { "text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text;\n};\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis.style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value;\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this.style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this.style) {\n\t\t\t\tstyle.push(s + \":\" + this.style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\")\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get textContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tthrow \"Cannot get formattedTextContent on a raw TW_Element\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n", "title": "$:/core/modules/utils/fakedom.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/utils/filesystem.js": { "text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = $tw.utils.removeTrailingSeparator(srcPath);\n\tdstPath = $tw.utils.removeTrailingSeparator(dstPath);\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = new Buffer(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n})();\n", "title": "$:/core/modules/utils/filesystem.js", "type": "application/javascript", "module-type": "utils-node" }, "$:/core/modules/utils/logger.js": { "text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName) {\n\tthis.componentName = componentName || \"\";\n}\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tif(console !== undefined && console.log !== undefined) {\n\t\treturn Function.apply.call(console.log, console, [this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)));\n\t}\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\t// Prepare the text of the alert\n\tvar text = Array.prototype.join.call(arguments,\" \");\n\t// Create alert tiddlers in the browser\n\tif($tw.browser) {\n\t\t// Check if there is an existing alert with the same text and the same component\n\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\talertFields,\n\t\t\texistingCount,\n\t\t\tself = this;\n\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t}\n\t\t});\n\t\tif(alertFields) {\n\t\t\texistingCount = alertFields.count || 1;\n\t\t} else {\n\t\t\talertFields = {\n\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\ttext: text,\n\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\tcomponent: this.componentName\n\t\t\t};\n\t\t\texistingCount = 0;\n\t\t}\n\t\talertFields.modified = new Date();\n\t\tif(++existingCount > 1) {\n\t\t\talertFields.count = existingCount;\n\t\t} else {\n\t\t\talertFields.count = undefined;\n\t\t}\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t// Log the alert as well\n\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t} else {\n\t\t// Print an orange message to the console if not in the browser\n\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n", "title": "$:/core/modules/utils/logger.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/parsetree.js": { "text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n})();\n", "title": "$:/core/modules/utils/parsetree.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/performance.js": { "text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap of current values of measurements\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n}\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tself.measures = {};\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime) + \"ms\");\n\t\t\tfor(var m in self.measures) {\n\t\t\t\tself.logger.log(\"+\" + m + \": \" + self.measures[m] + \"ms\");\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments),\n\t\t\t\tvalue = self.measures[name] || 0;\n\t\t\tself.measures[name] = value + $tw.utils.timer(startTime);\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n", "title": "$:/core/modules/utils/performance.js", "type": "application/javascript", "module-type": "global" }, "$:/core/modules/utils/pluginmaker.js": { "text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\nError: \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n", "title": "$:/core/modules/utils/pluginmaker.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/utils/utils.js": { "text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\tconsole.log($tw.node ? \"\\x1b[1;33m\" + text + \"\\x1b[0m\" : text);\n}\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\tvar s = 0;\n\t$tw.utils.each(object,function() {s++;});\n\treturn s;\n};\n\n/*\nCheck if an array is equal by value and by reference.\n*/\nexports.isArrayEqual = function(array1,array2) {\n\tif(array1 === array2) {\n\t\treturn true;\n\t}\n\tarray1 = array1 || [];\n\tarray2 = array2 || [];\n\tif(array1.length !== array2.length) {\n\t\treturn false;\n\t}\n\treturn array1.every(function(value,index) {\n\t\treturn value === array2[index];\n\t});\n};\n\n/*\nPush entries onto an array, removing them first if they already exist in the array\n\tarray: array to modify (assumed to be free of duplicates)\n\tvalue: a single value to push or an array of values to push\n*/\nexports.pushTop = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\t// Remove any array entries that are duplicated in the new values\n\t\tif(value.length !== 0) {\n\t\t\tif(array.length !== 0) {\n\t\t\t\tif(value.length < array.length) {\n\t\t\t\t\tfor(t=0; t<value.length; t++) {\n\t\t\t\t\t\tp = array.indexOf(value[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(p,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor(t=array.length-1; t>=0; t--) {\n\t\t\t\t\t\tp = value.indexOf(array[t]);\n\t\t\t\t\t\tif(p !== -1) {\n\t\t\t\t\t\t\tarray.splice(t,1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Push the values on top of the main array\n\t\t\tarray.push.apply(array,value);\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t\tarray.push(value);\n\t}\n\treturn array;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.getYearForWeekNo(date);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn date.getFullYear();\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call();\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar n = Math.floor((dt.getTime()-new Date(dt.getFullYear(),0,1) + 3600000) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar e = s.substr(1,s.length-2); // Strip the & and the ;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(2),16));\t\n\t\t} else {\n\t\t\treturn String.fromCharCode(parseInt(e.substr(1),10));\n\t\t}\n\t} else {\n\t\tvar c = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn String.fromCharCode(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/[\\x80-\\uFFFF]/g, exports.escape); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|'\"\\\\^~]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10);\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\tif($tw.browser) {\n\t\t// TODO\n\t\tthrow \"$tw.utils.base64Decode() doesn't work in the browser\";\n\t} else {\n\t\treturn (new Buffer(string64,\"base64\")).toString();\n\t}\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\t\t\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tparts.push(\"data:\");\n\tparts.push(type);\n\tparts.push(isBase64 ? \";base64\" : \"\");\n\tparts.push(\",\");\n\tparts.push(isBase64 ? text : encodeURIComponent(text));\n\treturn parts.join(\"\");\n};\n\n})();", "title": "$:/core/modules/utils/utils.js", "type": "application/javascript", "module-type": "utils" }, "$:/core/modules/widgets/action-deletefield.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete 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\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {};\n\tif(this.actionField) {\n\t\tremoveFields[this.actionField] = undefined;\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t}\n\t\t});\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,removeFields));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n", "title": "$:/core/modules/widgets/action-deletefield.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-deletetiddler.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete 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\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n", "title": "$:/core/modules/widgets/action-deletetiddler.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-navigate.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to 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\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n", "title": "$:/core/modules/widgets/action-navigate.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-sendmessage.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\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 SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\")\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n", "title": "$:/core/modules/widgets/action-sendmessage.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/action-setfield.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on 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\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this;\n\tif(typeof this.actionValue === \"string\") {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue);\t\t\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n", "title": "$:/core/modules/widgets/action-setfield.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/browse.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\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 BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,function(tiddlerFieldsArray) {\n\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n", "title": "$:/core/modules/widgets/browse.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/button.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = \"button\";\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = this.popup && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif(this.set && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(this,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\t$tw.popup.triggerPopup({\n\t\tdomNode: this.domNodes[0],\n\t\ttitle: this.popup,\n\t\twiki: this.wiki\n\t});\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes[\"class\"] || changedAttributes.selectedClass || changedAttributes.style || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup])) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n", "title": "$:/core/modules/widgets/button.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/checkbox.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value = tiddler.fields[this.checkboxField] || this.checkboxDefault || \"\";\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag);\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tvar value = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\t// Make 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*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();", "title": "$:/core/modules/widgets/checkbox.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/codeblock.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n", "title": "$:/core/modules/widgets/codeblock.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/count.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = undefined;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n", "title": "$:/core/modules/widgets/count.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/dropzone.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = \"tc-dropzone\";\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"}\n\t]);\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nDropZoneWidget.prototype.enterDrag = function() {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// We count enter/leave events\n\tthis.dragEnterCount = (this.dragEnterCount || 0) + 1;\n\t// If we're entering for the first time we need to apply highlighting\n\tif(this.dragEnterCount === 1) {\n\t\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.leaveDrag = function() {\n\t// Reduce the enter count\n\tthis.dragEnterCount = (this.dragEnterCount || 0) - 1;\n\t// Remove highlighting if we're leaving externally\n\tif(this.dragEnterCount <= 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag();\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag();\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tthis.leaveDrag();\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Reset the enter count\n\tthis.dragEnterCount = 0;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = this.wiki.readFiles(dataTransfer.files,function(tiddlerFieldsArray) {\n\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t});\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\tthis.importData(dataTransfer);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.importData = function(dataTransfer) {\n\t// Try each provided data type in turn\n\tfor(var t=0; t<this.importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || this.importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = this.importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.convertToFields(data);\n\t\t\t\tif(!tiddlerFields.title) {\n\t\t\t\t\ttiddlerFields.title = this.wiki.generateNewTitle(\"Untitled\");\n\t\t\t\t}\n\t\t\t\tthis.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nDropZoneWidget.prototype.importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, convertToFields: function(data) {\n\t\treturn JSON.parse(data);\n\t}},\n\t{type: \"URL\", IECompatible: true, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/plain\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"Text\", IECompatible: true, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}}\n];\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields])});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n", "title": "$:/core/modules/widgets/dropzone.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit-binary.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Construct the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"transclude\",\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t}\n\t}]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n", "title": "$:/core/modules/widgets/edit-binary.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit-bitmap.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 300,\n\tDEFAULT_IMAGE_HEIGHT = 185;\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\tthis.widthDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-width\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleWidthChangeEvent\"\n\t\t}]\n\t});\n\tthis.heightDomNode = $tw.utils.domMaker(\"input\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor-height\",\n\t\teventListeners: [{\n\t\t\tname: \"change\", handlerObject: this, handlerMethod: \"handleHeightChangeEvent\"\n\t\t}]\n\t});\n\t// Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tparent.insertBefore(this.widthDomNode,nextSibling);\n\tparent.insertBefore(this.heightDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode,this.widthDomNode,this.heightDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n};\n\n/*\nNote that the bitmap editor intentionally doesn't try to refresh itself because it would be confusing to have the image changing spontaneously while editting it\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.updateSize();\n\t};\n\t// Get the current bitmap into an image object\n\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Update the input boxes with the actual size of the canvas\n*/\nEditBitmapWidget.prototype.updateSize = function() {\n\tthis.widthDomNode.value = this.currCanvas.width;\n\tthis.heightDomNode.value = this.currCanvas.height;\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleWidthChangeEvent = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(this.widthDomNode.value,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newWidth !== this.currCanvas.width) {\n\t\tthis.changeCanvasSize(newWidth,this.currCanvas.height);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleHeightChangeEvent = function(event) {\n\t// Get the new width\n\tvar newHeight = parseInt(this.heightDomNode.value,10);\n\t// Update if necessary\n\tif(newHeight > 0 && newHeight !== this.currCanvas.height) {\n\t\tthis.changeCanvasSize(this.currCanvas.width,newHeight);\n\t}\n\t// Update the input controls\n\tthis.updateSize();\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseInt(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"),10);\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\tif(tiddler) {\n\t\t// data URIs look like \"data:<type>;base64,<text>\"\n\t\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type,1.0),\n\t\t\tposColon = dataURL.indexOf(\":\"),\n\t\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\t\tposComma = dataURL.indexOf(\",\"),\n\t\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\t\ttext = dataURL.substring(posComma+1);\n\t\tvar update = {type: type, text: text};\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,update));\n\t}\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n", "title": "$:/core/modules/widgets/edit-bitmap.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit-text.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditTextWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditTextWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tvar editInfo = this.getEditInfo(),\n\t\ttag = this.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tif(this.editType) {\n\t\tdomNode.setAttribute(\"type\",this.editType);\n\t}\n\tif(editInfo.value === \"\" && this.editPlaceholder) {\n\t\tdomNode.setAttribute(\"placeholder\",this.editPlaceholder);\n\t}\n\tif(this.editSize) {\n\t\tdomNode.setAttribute(\"size\",this.editSize);\n\t}\n\t// Assign classes\n\tif(this.editClass) {\n\t\tdomNode.className = this.editClass;\n\t}\n\t// Set the text\n\tif(this.editTag === \"textarea\") {\n\t\tdomNode.appendChild(this.document.createTextNode(editInfo.value));\n\t} else {\n\t\tdomNode.value = editInfo.value;\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n\t// Fix height\n\tthis.fixHeight();\n\t// Focus field\n\tif(this.editFocus === \"true\") {\n\t\tif(domNode.focus && domNode.select) {\n\t\t\tdomNode.focus();\n\t\t\tdomNode.select();\t\t\t\n\t\t}\n\t}\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditTextWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tswitch(this.editField) {\n\t\t\t\tcase \"text\":\n\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"title\":\n\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\tvalue = this.editDefault;\n\t\t\t}\n\t\t}\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\treturn {value: value, update: update};\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditTextWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editDefault = this.getAttribute(\"default\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editSize = this.getAttribute(\"size\");\n\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",\"yes\") === \"yes\";\n\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\tthis.editFocus = this.getAttribute(\"focus\");\n\t// Get the editor element tag and type\n\tvar tag,type;\n\tif(this.editField === \"text\") {\n\t\ttag = \"textarea\";\n\t} else {\n\t\ttag = \"input\";\n\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\ttag = fieldModule.editTag;\n\t\t}\n\t\tif(fieldModule && fieldModule.editType) {\n\t\t\ttype = fieldModule.editType;\n\t\t}\n\t\ttype = type || \"text\";\n\t}\n\t// Get the rest of our parameters\n\tthis.editTag = this.getAttribute(\"tag\",tag);\n\tthis.editType = this.getAttribute(\"type\",type);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely rerender if any of our attributes have changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.editTitle]) {\n\t\tthis.updateEditor(this.getEditInfo().value);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditTextWidget.prototype.updateEditor = function(text) {\n\tthis.updateEditorDomNode(text);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditTextWidget.prototype.updateEditorDomNode = function(text) {\n\t// Replace the edit value if the tiddler we're editing has changed\n\tvar domNode = this.domNodes[0];\n\tif(!domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.document.activeElement !== domNode) {\n\t\t\tdomNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nFix the height of textareas to fit their content\n*/\nEditTextWidget.prototype.fixHeight = function() {\n\tvar self = this,\n\t\tdomNode = this.domNodes[0];\n\tif(this.editAutoHeight && domNode && !domNode.isTiddlyWikiFakeDom && this.editTag === \"textarea\") {\n\t\t// Resize the textarea to fit its content, preserving scroll position\n\t\tvar scrollPosition = $tw.utils.getScrollPosition(),\n\t\t\tscrollTop = scrollPosition.y;\n\t\t// Measure the specified minimum height\n\t\tdomNode.style.height = self.editMinHeight;\n\t\tvar minHeight = domNode.offsetHeight;\n\t\t// Set its height to auto so that it snaps to the correct height\n\t\tdomNode.style.height = \"auto\";\n\t\t// Calculate the revised height\n\t\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,minHeight);\n\t\t// Only try to change the height if it has changed\n\t\tif(newHeight !== domNode.offsetHeight) {\n\t\t\tdomNode.style.height = newHeight + \"px\";\n\t\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t\t$tw.utils.forceLayout(domNode);\n\t\t\t// Check that the scroll position is still visible before trying to scroll back to it\n\t\t\tscrollTop = Math.min(scrollTop,self.document.body.scrollHeight - window.innerHeight);\n\t\t\twindow.scrollTo(scrollPosition.x,scrollTop);\n\t\t}\n\t}\n};\n\n/*\nHandle a dom \"input\" event\n*/\nEditTextWidget.prototype.handleInputEvent = function(event) {\n\tthis.saveChanges(this.domNodes[0].value);\n\tthis.fixHeight();\n\treturn true;\n};\n\nEditTextWidget.prototype.handleFocusEvent = function(event) {\n\tif(this.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.editFocusPopup,\n\t\t\twiki: this.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\nEditTextWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\nexports[\"edit-text\"] = EditTextWidget;\n\n})();\n", "title": "$:/core/modules/widgets/edit-text.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/edit.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: {\n\t\t\ttiddler: {type: \"string\", value: this.editTitle},\n\t\t\tfield: {type: \"string\", value: this.editField},\n\t\t\tindex: {type: \"string\", value: this.editIndex},\n\t\t\t\"class\": {type: \"string\", value: this.editClass},\n\t\t\t\"placeholder\": {type: \"string\", value: this.editPlaceholder}\n\t\t}\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n", "title": "$:/core/modules/widgets/edit.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/element.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Neuter blacklisted elements\n\tvar tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"safe-\" + tag;\n\t}\n\tvar domNode = this.document.createElementNS(this.namespace,tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nElementWidget.prototype.execute = function() {\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.parseTreeNode.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Make 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*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\t// Update our attributes\n\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n", "title": "$:/core/modules/widgets/element.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/encrypt.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n", "title": "$:/core/modules/widgets/encrypt.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/entity.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar textNode = this.document.createTextNode($tw.utils.entityDecode(this.parseTreeNode.entity));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.entity = EntityWidget;\n\n})();\n", "title": "$:/core/modules/widgets/entity.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/fieldmangler.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.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*/\nFieldManglerWidget.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/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.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\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle);\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n", "title": "$:/core/modules/widgets/fieldmangler.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/fields.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.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*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\t// Get the exclusion list\n\tvar exclude;\n\tif(this.exclude) {\n\t\texclude = this.exclude.split(\" \");\n\t} else {\n\t\texclude = [\"text\"]; \n\t}\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tfor(var fieldName in tiddler.fields) {\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tfields.push(fieldName);\n\t\t\t}\n\t\t}\n\t\tfields.sort();\n\t\tfor(var f=0; f<fields.length; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tif(exclude.indexOf(fieldName) === -1) {\n\t\t\t\tvar row = this.template,\n\t\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\t\tif(reMatch) {\n\t\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trow = row.replace(\"$name$\",fieldName);\n\t\t\t\trow = row.replace(\"$value$\",value);\n\t\t\t\trow = row.replace(\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\t\ttext.push(row);\n\t\t\t}\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude || changedAttributes.stripTitlePrefix || changedTiddlers[this.tiddlerTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n", "title": "$:/core/modules/widgets/fields.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/image.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\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 ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n", "title": "$:/core/modules/widgets/image.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/importvariables.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\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 ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.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*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar self = this;\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\tvar widgetStackStart,widgetStackEnd;\n\tfunction addWidgetNode(widgetNode) {\n\t\tif(widgetNode) {\n\t\t\tif(!widgetStackStart && !widgetStackEnd) {\n\t\t\t\twidgetStackStart = widgetNode;\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t} else {\n\t\t\t\twidgetStackEnd.children = [widgetNode];\n\t\t\t\twidgetStackEnd = widgetNode;\n\t\t\t}\n\t\t}\n\t}\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = self.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\taddWidgetNode({\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params\n\t\t\t\t});\n\t\t\t\tparseTreeNode = parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\t// Add our own children to the end of the pile\n\tvar parseTreeNodes;\n\tif(widgetStackStart && widgetStackEnd) {\n\t\tparseTreeNodes = [widgetStackStart];\n\t\twidgetStackEnd.children = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n", "title": "$:/core/modules/widgets/importvariables.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/keyboard.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.utils.checkKeyDescriptor(event,self.keyInfo)) {\n\t\t\tself.dispatchMessage(event);\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.key = this.getAttribute(\"key\");\n\tthis.keyInfo = $tw.utils.parseKeyDescriptor(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n", "title": "$:/core/modules/widgets/keyboard.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/link.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true;\n\t// Render the link if required\n\tif(useWikiLinks) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.linkClasses) {\n\t\tclasses.push(this.linkClasses);\n\t}\n\tclasses.push(\"tc-tiddlylink\");\n\tif(this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t}\n\tif(this.isMissing && !this.isShadow) {\n\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t} else {\n\t\tif(!this.isMissing) {\n\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t}\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Set an href\n\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\",\n\t\twikiLinkText = wikiLinkTemplate.replace(\"$uri_encoded$\",encodeURIComponent(this.to));\n\twikiLinkText = wikiLinkText.replace(\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tdomNode.setAttribute(\"href\",wikiLinkText);\n\t}\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragstart\", handlerObject: this, handlerMethod: \"handleDragStartEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1)\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n};\n\nLinkWidget.prototype.handleDragStartEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\tif(this.to) {\n\t\t\t$tw.dragInProgress = true;\n\t\t\t// Set the dragging class on the element being dragged\n\t\t\t$tw.utils.addClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t\t// Create the drag image elements\n\t\t\tthis.dragImage = this.document.createElement(\"div\");\n\t\t\tthis.dragImage.className = \"tc-tiddler-dragger\";\n\t\t\tvar inner = this.document.createElement(\"div\");\n\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\tinner.appendChild(this.document.createTextNode(this.to));\n\t\t\tthis.dragImage.appendChild(inner);\n\t\t\tthis.document.body.appendChild(this.dragImage);\n\t\t\t// Astoundingly, we need to cover the dragger up: http://www.kryogenix.org/code/browser/custom-drag-image.html\n\t\t\tvar cover = this.document.createElement(\"div\");\n\t\t\tcover.className = \"tc-tiddler-dragger-cover\";\n\t\t\tcover.style.left = (inner.offsetLeft - 16) + \"px\";\n\t\t\tcover.style.top = (inner.offsetTop - 16) + \"px\";\n\t\t\tcover.style.width = (inner.offsetWidth + 32) + \"px\";\n\t\t\tcover.style.height = (inner.offsetHeight + 32) + \"px\";\n\t\t\tthis.dragImage.appendChild(cover);\n\t\t\t// Set the data transfer properties\n\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t// First the image\n\t\t\tdataTransfer.effectAllowed = \"copy\";\n\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\tdataTransfer.setDragImage(this.dragImage.firstChild,-16,-16);\n\t\t\t}\n\t\t\t// Then the data\n\t\t\tdataTransfer.clearData();\n\t\t\tvar jsonData = this.wiki.getTiddlerAsJson(this.to),\n\t\t\t\ttextData = this.wiki.getTiddlerText(this.to,\"\"),\n\t\t\t\ttitle = (new RegExp(\"^\" + $tw.config.textPrimitives.wikiLink + \"$\",\"mg\")).exec(this.to) ? this.to : \"[[\" + this.to + \"]]\";\n\t\t\t// IE doesn't like these content types\n\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\tdataTransfer.setData(\"text/plain\",title);\n\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t}\n\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\tdataTransfer.setData(\"Text\",title);\n\t\t\tevent.stopPropagation();\n\t\t} else {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\nLinkWidget.prototype.handleDragEndEvent = function(event) {\n\tif(event.target === this.domNodes[0]) {\n\t\t$tw.dragInProgress = false;\n\t\t// Remove the dragging class on the element being dragged\n\t\t$tw.utils.removeClass(event.target,\"tc-tiddlylink-dragging\");\n\t\t// Delete the drag image element\n\t\tif(this.dragImage) {\n\t\t\tthis.dragImage.parentNode.removeChild(this.dragImage);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\t// Make 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*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n", "title": "$:/core/modules/widgets/link.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/linkcatcher.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.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*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\t// 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*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(this.catchTo) {\n\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.catchMessage && this.parentWidget) {\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: this.catchMessage,\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\tif(this.catchSet) {\n\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n", "title": "$:/core/modules/widgets/linkcatcher.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/list.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.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*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// 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*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();", "title": "$:/core/modules/widgets/list.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/macrocall.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.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*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar text = this.getVariable(this.parseTreeNode.name || this.getAttribute(\"$name\"),{params: params}),\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\tvar parser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\tparseTreeNodes = parser ? parser.tree : [];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n", "title": "$:/core/modules/widgets/macrocall.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/navigator.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.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*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// 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*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList}\n\t));\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tvar p = storyList.indexOf(title);\n\twhile(p !== -1) {\n\t\tstoryList.splice(p,1);\n\t\tp = storyList.indexOf(title);\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tvar pos = storyList.indexOf(oldTitle);\n\tif(pos !== -1) {\n\t\tstoryList[pos] = newTitle;\n\t\tdo {\n\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\tif(pos !== -1) {\n\t\t\t\tstoryList.splice(pos,1);\n\t\t\t}\n\t\t} while(pos !== -1);\n\t} else {\n\t\tstoryList.splice(0,0,newTitle);\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tvar storyList = this.getStoryList();\n\t// Quit if we cannot get hold of the story list\n\tif(!storyList) {\n\t\treturn;\n\t}\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(title);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(fromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(this.getAttribute(\"openLinkFromInsideRiver\",\"below\")) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,title);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.wiki.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title),\n\t\tdraftTitle = draftTiddler.fields.title,\n\t\tstoryList = this.getStoryList();\n\tthis.removeTitleFromStory(storyList,draftTitle);\n\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Delete this tiddler\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler(\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle;\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\";\n\t\tc++;\n\t} while(this.wiki.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Save the draft tiddler as the real tiddler\n\t\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields()));\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(originalTiddler) {\n\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t} else {\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t}\n\t\t\tthis.saveStoryList(storyList);\t\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags)\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\texistingTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\t\t\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\tvar self = this;\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\t\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = this.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = this.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tif(this.getVariable(\"tv-auto-open-on-import\") !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList.indexOf(IMPORT_TITLE) === -1) {\n\t\t\tstoryList.unshift(IMPORT_TITLE);\n\t\t}\n\t\t// And to history\n\t\thistory.push(IMPORT_TITLE);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\t\t\n\t}\n\treturn false;\n};\n\n// \nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerData(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push(\"The following tiddlers were imported:\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(tiddlerFields));\n\t\t\timportReport.push(\"# [[\" + tiddlerFields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: IMPORT_TITLE,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([IMPORT_TITLE]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n", "title": "$:/core/modules/widgets/navigator.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/password.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make 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*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n", "title": "$:/core/modules/widgets/password.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/radio.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nRadio widget\n\nWill set a field to the selected value:\n\n```\n\t<$radio field=\"myfield\" value=\"check 1\">one</$radio>\n\t<$radio field=\"myfield\" value=\"check 2\">two</$radio>\n\t<$radio field=\"myfield\" value=\"check 3\">three</$radio>\n```\n\n|Parameter |Description |h\n|tiddler |Name of the tiddler in which the field should be set. Defaults to current tiddler |\n|field |The name of the field to be set |\n|value |The value to set |\n|class |Optional class name(s) |\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.radioClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(this.getValue() == this.radioValue) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.radioTitle);\n\treturn tiddler && tiddler.getFieldString(this.radioField);\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tif(this.radioClass !== \"\") {\n\t\tthis.radioClass += \" \";\n\t}\n\tthis.radioClass += \"tc-radio\";\n\t// Make 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*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.value || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.radioTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue() === this.radioValue;\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n", "title": "$:/core/modules/widgets/radio.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/raw.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n", "title": "$:/core/modules/widgets/raw.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/reveal.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tvar classes = this[\"class\"].split(\" \") || [];\n\tclasses.push(\"tc-reveal\");\n\tdomNode.className = classes.join(\" \");\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tdomNode.style.left = (this.popup.left - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height - domNode.offsetHeight) + \"px\";\n\t\t\tbreak;\n\t\tcase \"right\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width) + \"px\";\n\t\t\tdomNode.style.top = this.popup.top + \"px\";\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tdomNode.style.left = (this.popup.left + this.popup.width - domNode.offsetWidth) + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t\tdefault: // Below\n\t\t\tdomNode.style.left = this.popup.left + \"px\";\n\t\t\tdomNode.style.top = (this.popup.top + this.popup.height) + \"px\";\n\t\t\tbreak;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTitle = this.state;\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state = this.stateTitle ? this.wiki.getTextReference(this.stateTitle,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.readMatchState(state);\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.readMatchState(state);\n\t\t\tthis.isOpen = !this.isOpen;\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.readMatchState = function(state) {\n\tthis.isOpen = state === this.text;\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes[\"default\"] || changedAttributes.animate) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false,\n\t\t\tcurrentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\trefreshed = true;\n\t\t\t}\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n }});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n", "title": "$:/core/modules/widgets/reveal.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/scrollable.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tthis.scrollIntoView(event.target);\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(window,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n", "title": "$:/core/modules/widgets/scrollable.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/select.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\tvar value = this.getSelectDomNode().value;\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tvar domNode = this.getSelectDomNode();\n\tif(domNode.value !== value) {\n\t\tdomNode.value = value;\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n", "title": "$:/core/modules/widgets/select.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/set.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.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*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tvar value = this.setValue;\n\tif(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(!this.setValue) {\n\t\t\tvalue = $tw.utils.stringifyList(results);\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t}\n\tthis.setVariable(this.setName,value,this.parseTreeNode.params);\n\t// 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*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.value || changedAttributes.emptyValue) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n", "title": "$:/core/modules/widgets/set.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/text.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n", "title": "$:/core/modules/widgets/text.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/tiddler.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.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*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n", "title": "$:/core/modules/widgets/tiddler.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/transclude.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.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*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tthis.setVariable(\"transclusion\",recursionMarker);\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: \"Recursive transclusion error in transclude widget\"}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n", "title": "$:/core/modules/widgets/transclude.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/vars.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.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*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n", "title": "$:/core/modules/widgets/vars.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/view.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified();\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function() {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{parentWidget: this});\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n", "title": "$:/core/modules/widgets/view.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/widgets/widget.js": { "text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tif(arguments.length > 0) {\n\t\tthis.initialise(parseTreeNode,options);\n\t}\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\n*/\nWidget.prototype.setVariable = function(name,value,params) {\n\tthis.variables[name] = {value: value, params: params};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n*/\nWidget.prototype.getVariable = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\tvalue = variable.value;\n\t\t// Substitute any parameters specified in the definition\n\t\tvalue = this.substituteVariableParameters(value,variable.params,actualParams);\n\t\tvalue = this.substituteVariableReferences(value);\n\t\treturn value;\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn this.evaluateMacroModule(name,actualParams,options.defaultValue);\n};\n\nWidget.prototype.substituteVariableParameters = function(text,formalParams,actualParams) {\n\tif(formalParams) {\n\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\tparamInfo, paramValue;\n\t\t// Step through each of the parameters in the macro definition\n\t\tfor(var p=0; p<formalParams.length; p++) {\n\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\tparamInfo = formalParams[p];\n\t\t\tparamValue = undefined;\n\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\tnextAnonParameter++;\n\t\t\t}\n\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t}\n\t\t\t// If we've still not got a value, use the default, if any\n\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t// Replace any instances of this parameter\n\t\t\ttext = text.replace(new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(paramInfo.name) + \"\\\\$\",\"mg\"),paramValue);\n\t\t}\n\t}\n\treturn text;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tname = name || \"transclusion\";\n\tvar output = [],\n\t\tnode = this;\n\twhile(node && node.parentWidget) {\n\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\toutput.push(node.getVariable(name));\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn $tw.utils.hashString(output.join(\"\"));\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.render(parent,nextSibling);\n\t});\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar self = this,\n\t\trefreshed = false;\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\trefreshed = childWidget.refresh(changedTiddlers) || refreshed;\n\t});\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction && child.invokeAction(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n", "title": "$:/core/modules/widgets/widget.js", "type": "application/javascript", "module-type": "widget" }, "$:/core/modules/wiki.js": { "text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\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\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\";\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value) {\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tdata[index] = value;\n\t\tthis.setTiddlerData(title,data,this.getModificationFields());\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tvar fields = {\n\t\t\tcreated: new Date()\n\t\t},\n\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\tif(creator) {\n\t\tfields.creator = creator;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tvar fields = Object.create(null),\n\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\tfields.modified = new Date();\n\tif(modifier) {\n\t\tfields.modifier = modifier;\n\t}\n\treturn fields;\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t (isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\t// Count up the links\n\t\tvar links = [],\n\t\t\tcheckParseTree = function(parseTree) {\n\t\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\tif(parser) {\n\t\t\tcheckParseTree(parser.tree);\n\t\t}\n\t\treturn links;\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinks = [];\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\tbacklinks.push(title);\n\t\t}\n\t});\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\tvar self = this;\n\treturn this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\tvar tagmap = self.getTagMap();\n\t\treturn self.sortByList(tagmap[tag],tag);\n\t});\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tvar currPos = titles.indexOf(title),\n\t\t\t\tnewPos = -1,\n\t\t\t\ttiddler = this.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(newPos === -1) {\n\t\t\t\t\tnewPos = currPos;\n\t\t\t\t}\n\t\t\t\tif(newPos !== currPos) {\n\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t}\n\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerData(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerData(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\n// Temporarily disable caching so that tweakParseTreeNode() works\nreturn initializer();\n\n//\tthis.caches = this.caches || Object.create(null);\n//\tvar caches = this.caches[title];\n//\tif(caches && caches[cacheName]) {\n//\t\treturn caches[cacheName];\n//\t} else {\n//\t\tif(!caches) {\n//\t\t\tcaches = Object.create(null);\n//\t\t\tthis.caches[title] = caches;\n//\t\t}\n//\t\tcaches[cacheName] = initializer();\n//\t\treturn caches[cacheName];\n//\t}\n};\n\n// Clear all caches associated with a particular tiddler\nexports.clearCache = function(title) {\n\tthis.caches = this.caches || Object.create(null);\n\tif($tw.utils.hop(this.caches,title)) {\n\t\tdelete this.caches[title];\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.old_parseText = function(type,text,options) {\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.old_parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"newInlineParseTree\" : \"newBlockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.old_parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nvar tweakMacroDefinition = function(nodeList) {\n\tif(nodeList && nodeList[0] && nodeList[0].type === \"macrodef\") {\n\t\tnodeList[0].type = \"set\";\n\t\tnodeList[0].attributes = {\n\t\t\tname: {type: \"string\", value: nodeList[0].name},\n\t\t\tvalue: {type: \"string\", value: nodeList[0].text}\n\t\t};\n\t\tnodeList[0].children = nodeList.slice(1);\n\t\tnodeList.splice(1,nodeList.length-1);\n\t\ttweakMacroDefinition(nodeList[0].children);\n\t}\n};\n\nvar tweakParser = function(parser) {\n\t// Move any macro definitions to contain the body tree\n\ttweakMacroDefinition(parser.tree);\n};\n\nexports.parseText = function(type,text,options) {\n\tvar parser = this.old_parseText(type,text,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTiddler = function(title,options) {\n\tvar parser = this.old_parseTiddler(title,options);\n\tif(parser) {\n\t\ttweakParser(parser);\n\t}\n\treturn parser;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type || \"text/vnd.tiddlywiki\",tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.children: optional array of children for the transclude widget\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTree = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"transclude\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttiddler: {\n\t\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: title}},\n\t\t\t\tisBlock: !options.parseAsInline}]}\n\t]};\n\tif(options.field) {\n\t\tparseTree.tree[0].children[0].attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTree.tree[0].children[0].attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTree.tree[0].children[0].children = options.children;\n\t}\n\treturn $tw.wiki.makeWidget(parseTree,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tliteral: If true, searches for literal string, rather than separate search terms\n\tfield: If specified, restricts the search to the specified field\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tmatch;\n\t\tfor(var t=0; t<searchTermsRegExps.length; t++) {\n\t\t\tmatch = false;\n\t\t\tif(options.field) {\n\t\t\t\tmatch = searchTermsRegExps[t].test(tiddler.getFieldString(options.field));\n\t\t\t} else {\n\t\t\t\t// Search title, tags and body\n\t\t\t\tif(contentTypeInfo.encoding === \"utf8\") {\n\t\t\t\t\tmatch = match || searchTermsRegExps[t].test(tiddler.fields.text);\n\t\t\t\t}\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.join(\"\\0\") : \"\";\n\t\t\t\tmatch = match || searchTermsRegExps[t].test(tags) || searchTermsRegExps[t].test(tiddler.fields.title);\n\t\t\t}\n\t\t\tif(!match) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(tiddler.fields.text !== undefined) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text;\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,callback) {\n\tvar result = [],\n\t\toutstanding = files.length;\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t});\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,callback) {\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\t// Deserialise the file contents\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\", type: type};\n\t\t// Are we binary?\n\t\tif(isBinary) {\n\t\t\t// The base64 section starts after the first comma in the data URI\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttiddlerFields.text = text.substr(commaPos+1);\n\t\t\t\tcallback([tiddlerFields]);\n\t\t\t}\n\t\t} else {\n\t\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\t\tif(encryptedJson) {\n\t\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields));\n\t\t\t}\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]);\n\tif(!origTiddler) {\n\t\treturn tiddler.fields.text !== \"\";\n\t}\n\treturn tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"] || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\thistoryTitle = historyTitle || \"$:/HistoryList\";\n\tvar titles = $tw.utils.isArray(title) ? title : [title];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.getTiddlerData(historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: fromPageRect});\n\t});\n\tthis.setTiddlerData(historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n})();\n", "title": "$:/core/modules/wiki.js", "type": "application/javascript", "module-type": "wikimethod" }, "$:/palettes/Blanca": { "title": "$:/palettes/Blanca", "name": "Blanca", "description": "A clean white palette to let you focus", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/Blue": { "title": "$:/palettes/Blue", "name": "Blue", "description": "A blue theme", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/Muted": { "title": "$:/palettes/Muted", "name": "Muted", "description": "Bright tiddlers on a muted background", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/ContrastLight": { "title": "$:/palettes/ContrastLight", "name": "Contrast (Light)", "description": "High contrast and unambiguous (light version)", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n" }, "$:/palettes/ContrastDark": { "title": "$:/palettes/ContrastDark", "name": "Contrast (Dark)", "description": "High contrast and unambiguous (dark version)", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n" }, "$:/palettes/DarkPhotos": { "created": "20150402111612188", "description": "Good with dark photo backgrounds", "modified": "20150402112344080", "name": "DarkPhotos", "tags": "$:/tags/Palette", "title": "$:/palettes/DarkPhotos", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/Rocker": { "title": "$:/palettes/Rocker", "name": "Rocker", "description": "A dark theme", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/SolarFlare": { "title": "$:/palettes/SolarFlare", "name": "Solar Flare", "description": "Warm, relaxing earth colours", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n download-foreground: <<colour background>>\n dragger-foreground: <<colour background>>\n dropdown-background: <<colour background>>\n modal-background: <<colour background>>\n sidebar-foreground-shadow: <<colour background>>\n tiddler-background: <<colour background>>\n tiddler-border: <<colour background>>\n tiddler-link-background: <<colour background>>\n tab-background-selected: <<colour background>>\n dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n dragger-background: <<colour foreground>>\n tab-foreground: <<colour foreground>>\n tab-foreground-selected: <<colour tab-foreground>>\n sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n sidebar-tab-foreground: <<colour tab-foreground>>\n sidebar-button-foreground: <<colour foreground>>\n sidebar-controls-foreground: <<colour foreground>>\n sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n alert-muted-foreground: <<colour base01>>\n: base00\n code-foreground: <<colour base00>>\n message-foreground: <<colour base00>>\n tag-foreground: <<colour base00>>\n: base0\n sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n muted-foreground: <<colour base1>>\n blockquote-bar: <<colour muted-foreground>>\n dropdown-border: <<colour muted-foreground>>\n sidebar-muted-foreground: <<colour muted-foreground>>\n tiddler-title-foreground: <<colour muted-foreground>>\n site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n modal-footer-background: <<colour base2>>\n page-background: <<colour base2>>\n modal-backdrop: <<colour page-background>>\n notification-background: <<colour page-background>>\n code-background: <<colour page-background>>\n code-border: <<colour code-background>>\n pre-background: <<colour page-background>>\n pre-border: <<colour pre-background>>\n sidebar-tab-background-selected: <<colour page-background>>\n table-header-background: <<colour base2>>\n tag-background: <<colour base2>>\n tiddler-editor-background: <<colour base2>>\n tiddler-info-background: <<colour base2>>\n tiddler-info-tab-background: <<colour base2>>\n tab-background: <<colour base2>>\n dropdown-tab-background: <<colour tab-background>>\n: base3\n alert-background: <<colour base3>>\n message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n alert-highlight: <<colour magenta>>\n: violet\n external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n primary: <<colour blue-muted>>\n download-background: <<colour primary>>\n tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n modal-footer-border: <<colour tab-border>>\n modal-header-border: <<colour tab-border>>\n notification-border: <<colour tab-border>>\n sidebar-tab-border: <<colour tab-border>>\n tab-border-selected: <<colour tab-border>>\n sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/palettes/Vanilla": { "title": "$:/palettes/Vanilla", "name": "Vanilla", "description": "Pale and unobtrusive", "tags": "$:/tags/Palette", "type": "application/x-tiddler-dictionary", "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n" }, "$:/core/readme": { "title": "$:/core/readme", "text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n" }, "$:/core/templates/MOTW.html": { "title": "$:/core/templates/MOTW.html", "text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)http://tiddlywiki.com --> " }, "$:/core/templates/alltiddlers.template.html": { "title": "$:/core/templates/alltiddlers.template.html", "type": "text/vnd.tiddlywiki-html", "text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n" }, "$:/core/templates/canonical-uri-external-image": { "title": "$:/core/templates/canonical-uri-external-image", "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>" }, "$:/core/templates/css-tiddler": { "title": "$:/core/templates/css-tiddler", "text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`" }, "$:/core/templates/exporters/CsvFile": { "title": "$:/core/templates/exporters/CsvFile", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/CsvFile}}", "extension": ".csv", "text": "\\define renderContent()\n<$text text=<<csvtiddlers filter:\"\"\"$(exportFilter)$\"\"\" format:\"quoted-comma-sep\">>/>\n\\end\n<<renderContent>>\n" }, "$:/core/templates/exporters/JsonFile": { "title": "$:/core/templates/exporters/JsonFile", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/JsonFile}}", "extension": ".json", "text": "\\define renderContent()\n<$text text=<<jsontiddlers filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>\n" }, "$:/core/templates/exporters/StaticRiver": { "title": "$:/core/templates/exporters/StaticRiver", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/StaticRiver}}", "extension": ".html", "text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n" }, "$:/core/templates/exporters/StaticRiver/Content": { "title": "$:/core/templates/exporters/StaticRiver/Content", "text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<<renderContent>>\n</$importvariables>\n" }, "$:/core/templates/exporters/TidFile": { "title": "$:/core/templates/exporters/TidFile", "tags": "$:/tags/Exporter", "description": "{{$:/language/Exporters/TidFile}}", "extension": ".tid", "text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\"><<renderContent>></$importvariables>" }, "$:/core/templates/html-div-tiddler": { "title": "$:/core/templates/html-div-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n" }, "$:/core/templates/html-tiddler": { "title": "$:/core/templates/html-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />" }, "$:/core/templates/javascript-tiddler": { "title": "$:/core/templates/javascript-tiddler", "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`" }, "$:/core/templates/module-tiddler": { "title": "$:/core/templates/module-tiddler", "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`" }, "$:/core/templates/plain-text-tiddler": { "title": "$:/core/templates/plain-text-tiddler", "text": "<$view field=\"text\" format=\"text\" />" }, "$:/core/save/all": { "title": "$:/core/save/all", "text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/save/empty": { "title": "$:/core/save/empty", "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/save/lazy-images": { "title": "$:/core/save/lazy-images", "text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n" }, "$:/core/templates/single.tiddler.window": { "title": "$:/core/templates/single.tiddler.window", "text": "<$set name=\"themeTitle\" value={{$:/view}}>\n\n<$set name=\"tempCurrentTiddler\" value=<<currentTiddler>>>\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$set name=\"currentTiddler\" value=<<tempCurrentTiddler>>>\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</$importvariables>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n" }, "$:/core/templates/split-recipe": { "title": "$:/core/templates/split-recipe", "text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n" }, "$:/core/templates/static-tiddler": { "title": "$:/core/templates/static-tiddler", "text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>" }, "$:/core/templates/static.area": { "title": "$:/core/templates/static.area", "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n" }, "$:/core/templates/static.content": { "title": "$:/core/templates/static.content", "type": "text/vnd.tiddlywiki", "text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|http://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n" }, "$:/core/templates/static.template.css": { "title": "$:/core/templates/static.template.css", "text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n" }, "$:/core/templates/static.template.html": { "title": "$:/core/templates/static.template.html", "type": "text/vnd.tiddlywiki-html", "text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n" }, "$:/core/templates/static.tiddler.html": { "title": "$:/core/templates/static.tiddler.html", "text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river\">\n`<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>\n</$importvariables>`\n</section>\n</body>\n</html>\n`" }, "$:/core/templates/store.area.template.html": { "title": "$:/core/templates/store.area.template.html", "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>" }, "$:/core/templates/tid-tiddler": { "title": "$:/core/templates/tid-tiddler", "text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />" }, "$:/core/templates/tiddler-metadata": { "title": "$:/core/templates/tiddler-metadata", "text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>" }, "$:/core/templates/tiddlywiki5.html": { "title": "$:/core/templates/tiddlywiki5.html", "text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html>\n<head>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\t\t<!-- Force IE standards mode for Intranet and HTA - should be the first meta -->\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}\n</div>\n</body>\n</html>\n" }, "$:/core/templates/version": { "title": "$:/core/templates/version", "text": "<<version>>" }, "$:/core/templates/wikified-tiddler": { "title": "$:/core/templates/wikified-tiddler", "text": "<$transclude />" }, "$:/core/ui/AdvancedSearch/Filter": { "title": "$:/core/ui/AdvancedSearch/Filter", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/Filter/Caption}}", "text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n</div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}} template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$set>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Shadows": { "title": "$:/core/ui/AdvancedSearch/Shadows", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/Shadows/Caption}}", "text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/Standard": { "title": "$:/core/ui/AdvancedSearch/Standard", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/Standard/Caption}}", "text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"searchTiddler\" value=\"$:/temp/advancedsearch\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n</$set>\n</$reveal>\n" }, "$:/core/ui/AdvancedSearch/System": { "title": "$:/core/ui/AdvancedSearch/System", "tags": "$:/tags/AdvancedSearch", "caption": "{{$:/language/Search/System/Caption}}", "text": "\\define lingo-base() $:/language/Search/\n<$linkcatcher to=\"$:/temp/advancedsearch\">\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/advancedsearch\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n</$linkcatcher>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n</div>\n\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n" }, "$:/AdvancedSearch": { "title": "$:/AdvancedSearch", "icon": "$:/core/images/advanced-search-button", "color": "#bbb", "text": "<div class=\"tc-advanced-search\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" \"$:/core/ui/AdvancedSearch/System\">>\n</div>\n" }, "$:/core/ui/AlertTemplate": { "title": "$:/core/ui/AlertTemplate", "text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button message=\"tm-delete-tiddler\" class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=\"0hh:0mm:0ss DD MM YYYY\"/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">(count: <$view field=\"count\"/>)</span></$reveal>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n" }, "$:/core/ui/BinaryWarning": { "title": "$:/core/ui/BinaryWarning", "text": "\\define lingo-base() $:/language/BinaryWarning/\n<div class=\"tc-binary-warning\">\n\n<<lingo Prompt>>\n\n</div>\n" }, "$:/core/ui/Components/tag-link": { "title": "$:/core/ui/Components/tag-link", "text": "<$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>" }, "$:/core/ui/ControlPanel/Advanced": { "title": "$:/core/ui/ControlPanel/Advanced", "tags": "$:/tags/ControlPanel/Info", "caption": "{{$:/language/ControlPanel/Advanced/Caption}}", "text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" \"$:/core/ui/ControlPanel/TiddlerFields\">>\n</div>\n" }, "$:/core/ui/ControlPanel/Appearance": { "title": "$:/core/ui/ControlPanel/Appearance", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Appearance/Caption}}", "text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Theme\">>\n</div>\n" }, "$:/core/ui/ControlPanel/Basics": { "title": "$:/core/ui/ControlPanel/Basics", "tags": "$:/tags/ControlPanel/Info", "caption": "{{$:/language/ControlPanel/Basics/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit-text tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Tags\" default=\"\" tag=\"input\"/> |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n" }, "$:/core/ui/ControlPanel/EditorTypes": { "title": "$:/core/ui/ControlPanel/EditorTypes", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n" }, "$:/core/ui/ControlPanel/Info": { "title": "$:/core/ui/ControlPanel/Info", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Info/Caption}}", "text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Basics\">>\n</div>\n" }, "$:/core/ui/ControlPanel/LoadedModules": { "title": "$:/core/ui/ControlPanel/LoadedModules", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n" }, "$:/core/ui/ControlPanel/Modals/AddPlugins": { "title": "$:/core/ui/ControlPanel/Modals/AddPlugins", "subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define install-plugin-button()\n<$button>\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\" emptyMessage=\"\"\"install\"\"\">\nreinstall\n</$list>\n</$button>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-small-icon\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<h1><$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<<install-plugin-button>>\n</div>\n</div>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\" emptyMessage=\"\"\"This plugin is not currently installed\"\"\">\n<em>\nThis plugin is already installed at version <$text text=<<installedVersion>>/>\n</em>\n</$list>\n</div>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} open plugin library\n</$button>\n\\end\n\n\\define display-server-assets(type)\nSearch: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[description]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$list>\n\\end\n\n\\define plugin-library-listing()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<div class=\"tc-plugin-library\">\n\n!! <$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link>\n\n//<$view field=\"url\"/>//\n\n<$transclude/>\n\n<<display-server-connection>>\n</div>\n</$list>\n\\end\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<div>\n<<plugin-library-listing>>\n</div>\n\n</$importvariables>\n" }, "$:/core/ui/ControlPanel/Palette": { "title": "$:/core/ui/ControlPanel/Palette", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/Palette/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/snippets/paletteeditor}}\n\n</$reveal>\n\n" }, "$:/core/ui/ControlPanel/Plugins/Add/Languages": { "title": "$:/core/ui/ControlPanel/Plugins/Add/Languages", "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)", "text": "<<display-server-assets language>>\n" }, "$:/core/ui/ControlPanel/Plugins/Add/Plugins": { "title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins", "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)", "text": "<<display-server-assets plugin>>\n" }, "$:/core/ui/ControlPanel/Plugins/Add/Themes": { "title": "$:/core/ui/ControlPanel/Plugins/Add/Themes", "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)", "text": "<<display-server-assets theme>>\n" }, "$:/core/ui/ControlPanel/Plugins/Installed/Languages": { "title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages", "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)", "text": "<<plugin-table language>>\n" }, "$:/core/ui/ControlPanel/Plugins/Installed/Plugins": { "title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins", "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)", "text": "<<plugin-table plugin>>\n" }, "$:/core/ui/ControlPanel/Plugins/Installed/Themes": { "title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes", "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)", "text": "<<plugin-table theme>>\n" }, "$:/core/ui/ControlPanel/Plugins": { "title": "$:/core/ui/ControlPanel/Plugins", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Plugins/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage)\n<div class=\"tc-plugin-info-chunk tc-small-icon\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk\">\n<h1>\n''<$view field=\"description\"><$view field=\"title\"/></$view>'' $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-table(type)\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[description]]\" emptyMessage=<<lingo \"Empty/Hint\">>>\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$reveal type=\"nomatch\" text=\"\" state=\"!!list\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList={{!!list}} default=\"readme\" template=\"$:/core/ui/PluginInfo\"/>\n</$reveal>\n<$reveal type=\"match\" text=\"\" state=\"!!list\">\nNo information provided\n</$reveal>\n</div>\n</div>\n</$reveal>\n</$set>\n</$list>\n</$set>\n\\end\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green\" style=\"background:blue;\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n\n<<lingo Installed/Hint>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\">>\n" }, "$:/core/ui/ControlPanel/Saving": { "title": "$:/core/ui/ControlPanel/Saving", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Saving/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Saving/\n\\define backupURL()\nhttp://$(userName)$.tiddlyspot.com/backup/\n\\end\n\\define backupLink()\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<backupURL>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n! <<lingo TiddlySpot/Heading>>\n\n<<lingo TiddlySpot/Description>>\n\n|<<lingo TiddlySpot/UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Password>> |<$password name=\"upload\"/> |\n|<<lingo TiddlySpot/Backups>> |<<backupLink>> |\n\n''<<lingo TiddlySpot/Advanced/Heading>>''\n\n|<<lingo TiddlySpot/ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo TiddlySpot/Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo TiddlySpot/UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo TiddlySpot/BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>" }, "$:/core/ui/ControlPanel/Settings/AutoSave": { "title": "$:/core/ui/ControlPanel/Settings/AutoSave", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/AutoSave/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/AutoSave/\n\n<$link to=\"$:/config/AutoSave\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo Disabled/Description>> </$radio>\n" }, "$:/core/buttonstyles/Borderless": { "title": "$:/core/buttonstyles/Borderless", "tags": "$:/tags/ToolbarButtonStyle", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}", "text": "tc-btn-invisible" }, "$:/core/buttonstyles/Boxed": { "title": "$:/core/buttonstyles/Boxed", "tags": "$:/tags/ToolbarButtonStyle", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}", "text": "tc-btn-boxed" }, "$:/core/buttonstyles/Rounded": { "title": "$:/core/buttonstyles/Rounded", "tags": "$:/tags/ToolbarButtonStyle", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}", "text": "tc-btn-rounded" }, "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": { "caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}", "tags": "$:/tags/ControlPanel/Settings", "title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n" }, "$:/core/ui/ControlPanel/Settings/LinkToBehaviour": { "title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n <option value=\"above\"><<lingo \"OpenAbove\">></option>\n <option value=\"below\"><<lingo \"OpenBelow\">></option>\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n" }, "$:/core/ui/ControlPanel/Settings/NavigationAddressBar": { "title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Settings/NavigationHistory": { "title": "$:/core/ui/ControlPanel/Settings/NavigationHistory", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Settings/TitleLinks": { "title": "$:/core/ui/ControlPanel/Settings/TitleLinks", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n" }, "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": { "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n" }, "$:/core/ui/ControlPanel/Settings/ToolbarButtons": { "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons", "tags": "$:/tags/ControlPanel/Settings", "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n" }, "$:/core/ui/ControlPanel/Settings": { "title": "$:/core/ui/ControlPanel/Settings", "tags": "$:/tags/ControlPanel", "caption": "{{$:/language/ControlPanel/Settings/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n" }, "$:/core/ui/ControlPanel/StoryView": { "title": "$:/core/ui/ControlPanel/StoryView", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/StoryView/Caption}}", "text": "{{$:/snippets/viewswitcher}}\n" }, "$:/core/ui/ControlPanel/Theme": { "title": "$:/core/ui/ControlPanel/Theme", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/Theme/Caption}}", "text": "{{$:/snippets/themeswitcher}}\n" }, "$:/core/ui/ControlPanel/TiddlerFields": { "title": "$:/core/ui/ControlPanel/TiddlerFields", "tags": "$:/tags/ControlPanel/Advanced", "caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}" }, "$:/core/ui/ControlPanel/Toolbars/EditToolbar": { "title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar", "tags": "$:/tags/ControlPanel/Toolbars", "caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/ControlPanel/Toolbars/PageControls": { "title": "$:/core/ui/ControlPanel/Toolbars/PageControls", "tags": "$:/tags/ControlPanel/Toolbars", "caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/ControlPanel/Toolbars/ViewToolbar": { "title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar", "tags": "$:/tags/ControlPanel/Toolbars", "caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>> field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/ControlPanel/Toolbars": { "title": "$:/core/ui/ControlPanel/Toolbars", "tags": "$:/tags/ControlPanel/Appearance", "caption": "{{$:/language/ControlPanel/Toolbars/Caption}}", "text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" \"$:/state/tabs/controlpanel/toolbars\" \"tc-vertical\">>\n</div>\n" }, "$:/ControlPanel": { "title": "$:/ControlPanel", "icon": "$:/core/images/options-button", "color": "#bbb", "text": "<div class=\"tc-control-panel\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" \"$:/core/ui/ControlPanel/Info\">>\n</div>\n" }, "$:/core/ui/DefaultSearchResultList": { "title": "$:/core/ui/DefaultSearchResultList", "tags": "$:/tags/SearchResults", "caption": "{{$:/language/Search/DefaultResults/Caption}}", "text": "\\define searchResultList()\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[!is[system]search{$(searchTiddler)$}]\"/>\"\"\">\n\n{{$:/language/Search/Matches}}\n\n</$set>\n\n//<small>Title matches:</small>//\n\n<$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\n//<small>All matches:</small>//\n\n<$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n\\end\n<<searchResultList>>\n" }, "$:/core/ui/EditTemplate/body": { "title": "$:/core/ui/EditTemplate/body", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/Body/\n<$list filter=\"[is[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[is[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"no\"><<lingo Preview/Button/Hide>></$button>\n\n<div class=\"tc-tiddler-preview\">\n<div class=\"tc-tiddler-preview-preview\">\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n</div>\n\n<div class=\"tc-tiddler-preview-edit\">\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<em class=\"tc-edit\"><<lingo Hint>></em> <$button type=\"set\" set=\"$:/state/showeditpreview\" setTo=\"yes\"><<lingo Preview/Button/Show>></$button>\n<$edit field=\"text\" class=\"tc-edit-texteditor\" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>\n\n</$reveal>\n\n</$list>\n" }, "$:/core/ui/EditTemplate/controls": { "title": "$:/core/ui/EditTemplate/controls", "tags": "$:/tags/EditTemplate", "text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n" }, "$:/core/ui/EditTemplate/fields": { "title": "$:/core/ui/EditTemplate/fields", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define new-field-inner()\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button>\n<$action-sendmessage $message=\"tm-add-field\" $name=<<name>> $value=<<value>>/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldname\"/>\n<$action-deletetiddler $tiddler=\"$:/temp/newfieldvalue\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n\\end\n\n\\define new-field()\n<$set name=\"name\" value={{$:/temp/newfieldname}}>\n<$set name=\"value\" value={{$:/temp/newfieldvalue}}>\n<<new-field-inner>>\n</$set>\n</$set>\n\\end\n\n<div class=\"tc-edit-fields\">\n<table class=\"tc-edit-fields\">\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}}/>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<span class=\"tc-edit-field-add-name\">\n<$edit-text tiddler=\"$:/temp/newfieldname\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}} focusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n</span>\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"$:/temp/newfieldname\">\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$list filter=\"[!is[shadow]!is[system]fields[]sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<<currentField>>\n</$link>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$link to=<<currentField>>>\n<<currentField>>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n<span class=\"tc-edit-field-add-value\">\n<$edit-text tiddler=\"$:/temp/newfieldvalue\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\"/>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</div>\n</$fieldmangler>\n\n" }, "$:/core/ui/EditTemplate/shadow": { "title": "$:/core/ui/EditTemplate/shadow", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$list>\n" }, "$:/core/ui/EditTemplate/tags": { "title": "$:/core/ui/EditTemplate/tags", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\n\\end\n<div class=\"tc-edit-tags\">\n<$fieldmangler>\n<$list filter=\"[all[current]tags[]sort[title]]\" storyview=\"pop\"><$set name=\"backgroundColor\" value={{!!color}}><span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\" />\n<$button message=\"tm-remove-tag\" param={{!!title}} class=\"tc-btn-invisible tc-remove-tag-button\">×</$button></span>\n</$set>\n</$list>\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={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\"/>\n</span> <$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <span class=\"tc-add-tag-button\">\n<$button message=\"tm-add-tag\" param={{$:/temp/NewTagName}} set=\"$:/temp/NewTagName\" setTo=\"\" class=\"\">\n<<lingo Tags/Add/Button>>\n</$button>\n</span>\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-tag\">\n<$list filter=\"[tags[]!is[system]search:title{$:/temp/NewTagName}sort[]]\">\n{{||$:/core/ui/Components/tag-link}}\n</$list>\n<hr>\n<$list filter=\"[tags[]is[system]search:title{$:/temp/NewTagName}sort[]]\">\n{{||$:/core/ui/Components/tag-link}}\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n</$fieldmangler>\n</div>" }, "$:/core/ui/EditTemplate/title": { "title": "$:/core/ui/EditTemplate/title", "tags": "$:/tags/EditTemplate", "text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus=\"true\"/>" }, "$:/core/ui/EditTemplate/type": { "title": "$:/core/ui/EditTemplate/type", "tags": "$:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/EditTemplate/\n<div class=\"tc-type-selector\"><$fieldmangler>\n<em class=\"tc-edit\"><<lingo Type/Prompt>></em> <$edit-text field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-popup-handle\"/> <$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button> <$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}</$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]]\"><$link to={{!!name}}><$view field=\"description\"/> (<$view field=\"name\"/>)</$link>\n</$list>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>" }, "$:/core/ui/EditTemplate": { "title": "$:/core/ui/EditTemplate", "text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-edit-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$\n\\end\n<div class=<<frame-classes>>>\n<$set name=\"storyTiddler\" value=<<currentTiddler>>>\n<$keyboard key=\"escape\" message=\"tm-cancel-tiddler\">\n<$keyboard key=\"ctrl+enter\" message=\"tm-save-tiddler\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n</$list>\n</$keyboard>\n</$keyboard>\n</$set>\n</div>\n" }, "$:/core/ui/Buttons/cancel": { "title": "$:/core/ui/Buttons/cancel", "tags": "$:/tags/EditToolbar", "caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}", "description": "{{$:/language/Buttons/Cancel/Hint}}", "text": "<$button message=\"tm-cancel-tiddler\" tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/delete": { "title": "$:/core/ui/Buttons/delete", "tags": "$:/tags/EditToolbar", "caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}", "description": "{{$:/language/Buttons/Delete/Hint}}", "text": "<$button message=\"tm-delete-tiddler\" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/save": { "title": "$:/core/ui/Buttons/save", "tags": "$:/tags/EditToolbar", "caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}", "description": "{{$:/language/Buttons/Save/Hint}}", "text": "<$button message=\"tm-save-tiddler\" tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/Filters/AllTags": { "title": "$:/core/Filters/AllTags", "tags": "$:/tags/Filter", "filter": "[tags[]!is[system]sort[title]]", "description": "{{$:/language/Filters/AllTags}}", "text": "" }, "$:/core/Filters/AllTiddlers": { "title": "$:/core/Filters/AllTiddlers", "tags": "$:/tags/Filter", "filter": "[!is[system]sort[title]]", "description": "{{$:/language/Filters/AllTiddlers}}", "text": "" }, "$:/core/Filters/Drafts": { "title": "$:/core/Filters/Drafts", "tags": "$:/tags/Filter", "filter": "[has[draft.of]sort[title]]", "description": "{{$:/language/Filters/Drafts}}", "text": "" }, "$:/core/Filters/Missing": { "title": "$:/core/Filters/Missing", "tags": "$:/tags/Filter", "filter": "[all[missing]sort[title]]", "description": "{{$:/language/Filters/Missing}}", "text": "" }, "$:/core/Filters/Orphans": { "title": "$:/core/Filters/Orphans", "tags": "$:/tags/Filter", "filter": "[all[orphans]sort[title]]", "description": "{{$:/language/Filters/Orphans}}", "text": "" }, "$:/core/Filters/OverriddenShadowTiddlers": { "title": "$:/core/Filters/OverriddenShadowTiddlers", "tags": "$:/tags/Filter", "filter": "[is[shadow]]", "description": "{{$:/language/Filters/OverriddenShadowTiddlers}}", "text": "" }, "$:/core/Filters/RecentSystemTiddlers": { "title": "$:/core/Filters/RecentSystemTiddlers", "tags": "$:/tags/Filter", "filter": "[has[modified]!sort[modified]limit[50]]", "description": "{{$:/language/Filters/RecentSystemTiddlers}}", "text": "" }, "$:/core/Filters/RecentTiddlers": { "title": "$:/core/Filters/RecentTiddlers", "tags": "$:/tags/Filter", "filter": "[!is[system]has[modified]!sort[modified]limit[50]]", "description": "{{$:/language/Filters/RecentTiddlers}}", "text": "" }, "$:/core/Filters/ShadowTiddlers": { "title": "$:/core/Filters/ShadowTiddlers", "tags": "$:/tags/Filter", "filter": "[all[shadows]sort[title]]", "description": "{{$:/language/Filters/ShadowTiddlers}}", "text": "" }, "$:/core/Filters/SystemTags": { "title": "$:/core/Filters/SystemTags", "tags": "$:/tags/Filter", "filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]", "description": "{{$:/language/Filters/SystemTags}}", "text": "" }, "$:/core/Filters/SystemTiddlers": { "title": "$:/core/Filters/SystemTiddlers", "tags": "$:/tags/Filter", "filter": "[is[system]sort[title]]", "description": "{{$:/language/Filters/SystemTiddlers}}", "text": "" }, "$:/core/Filters/TypedTiddlers": { "title": "$:/core/Filters/TypedTiddlers", "tags": "$:/tags/Filter", "filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]", "description": "{{$:/language/Filters/TypedTiddlers}}", "text": "" }, "$:/core/ui/ImportListing": { "title": "$:/core/ui/ImportListing", "text": "\\define lingo-base() $:/language/Import/\n\\define messageField()\nmessage-$(payloadTiddler)$\n\\end\n\\define selectionField()\nselection-$(payloadTiddler)$\n\\end\n\\define previewPopupState()\n$(currentTiddler)$!!popup-$(payloadTiddler)$\n\\end\n<table>\n<tbody>\n<tr>\n<th>\n<<lingo Listing/Select/Caption>>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\"/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"yes\">\n{{$:/core/images/right-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n{{$:/core/images/down-arrow}} <$text text=<<payloadTiddler>>/>\n</$button>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n</td>\n</tr>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>>>\n<$transclude subtiddler=<<payloadTiddler>> mode=\"block\"/>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n" }, "$:/core/ui/ListItemTemplate": { "title": "$:/core/ui/ListItemTemplate", "text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</div>" }, "$:/core/ui/MissingTemplate": { "title": "$:/core/ui/MissingTemplate", "text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n" }, "$:/core/ui/MoreSideBar/All": { "title": "$:/core/ui/MoreSideBar/All", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/All/Caption}}", "text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Drafts": { "title": "$:/core/ui/MoreSideBar/Drafts", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Drafts/Caption}}", "text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Missing": { "title": "$:/core/ui/MoreSideBar/Missing", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Missing/Caption}}", "text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Orphans": { "title": "$:/core/ui/MoreSideBar/Orphans", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Orphans/Caption}}", "text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Recent": { "title": "$:/core/ui/MoreSideBar/Recent", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Recent/Caption}}", "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n" }, "$:/core/ui/MoreSideBar/Shadows": { "title": "$:/core/ui/MoreSideBar/Shadows", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Shadows/Caption}}", "text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/System": { "title": "$:/core/ui/MoreSideBar/System", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/System/Caption}}", "text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/MoreSideBar/Tags": { "title": "$:/core/ui/MoreSideBar/Tags", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Tags/Caption}}", "text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n" }, "$:/core/ui/MoreSideBar/Types": { "title": "$:/core/ui/MoreSideBar/Types", "tags": "$:/tags/MoreSideBar", "caption": "{{$:/language/SideBar/Types/Caption}}", "text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n" }, "$:/core/ui/Buttons/advanced-search": { "title": "$:/core/ui/Buttons/advanced-search", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}", "description": "{{$:/language/Buttons/AdvancedSearch/Hint}}", "text": "\\define control-panel-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n" }, "$:/core/ui/Buttons/close-all": { "title": "$:/core/ui/Buttons/close-all", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}", "description": "{{$:/language/Buttons/CloseAll/Hint}}", "text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/control-panel": { "title": "$:/core/ui/Buttons/control-panel", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}", "description": "{{$:/language/Buttons/ControlPanel/Hint}}", "text": "\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n" }, "$:/core/ui/Buttons/encryption": { "title": "$:/core/ui/Buttons/encryption", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}", "description": "{{$:/language/Buttons/Encryption/Hint}}", "text": "<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>" }, "$:/core/ui/Buttons/export-page": { "title": "$:/core/ui/Buttons/export-page", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}", "description": "{{$:/language/Buttons/ExportPage/Hint}}", "text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>" }, "$:/core/ui/Buttons/full-screen": { "title": "$:/core/ui/Buttons/full-screen", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}", "description": "{{$:/language/Buttons/FullScreen/Hint}}", "text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/home": { "title": "$:/core/ui/Buttons/home", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}", "description": "{{$:/language/Buttons/Home/Hint}}", "text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/import": { "title": "$:/core/ui/Buttons/import", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}", "description": "{{$:/language/Buttons/Import/Hint}}", "text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>" }, "$:/core/ui/Buttons/language": { "title": "$:/core/ui/Buttons/language", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}", "description": "{{$:/language/Buttons/Language/Hint}}", "text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down tc-drop-down-language-chooser\">\n<$linkcatcher to=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$link>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/language\" text=<<currentTiddler>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/language\" text=<<currentTiddler>>>\n \n</$reveal>\n</span>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>" }, "$:/core/ui/Buttons/more-page-actions": { "title": "$:/core/ui/Buttons/more-page-actions", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}", "description": "{{$:/language/Buttons/More/Hint}}", "text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} 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\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>" }, "$:/core/ui/Buttons/new-journal": { "title": "$:/core/ui/Buttons/new-journal", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}", "description": "{{$:/language/Buttons/NewJournal/Hint}}", "text": "\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=\"$(journalTags)$\"/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<<journalButton>>\n</$set></$set>" }, "$:/core/ui/Buttons/new-tiddler": { "title": "$:/core/ui/Buttons/new-tiddler", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}", "description": "{{$:/language/Buttons/NewTiddler/Hint}}", "text": "<$button message=\"tm-new-tiddler\" tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/palette": { "title": "$:/core/ui/Buttons/palette", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}", "description": "{{$:/language/Buttons/Palette/Hint}}", "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>" }, "$:/core/ui/Buttons/refresh": { "title": "$:/core/ui/Buttons/refresh", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}", "description": "{{$:/language/Buttons/Refresh/Hint}}", "text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/save-wiki": { "title": "$:/core/ui/Buttons/save-wiki", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}", "description": "{{$:/language/Buttons/SaveWiki/Hint}}", "text": "<$button message=\"tm-save-wiki\" param={{$:/config/SaveWikiButton/Template}} tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>" }, "$:/core/ui/Buttons/storyview": { "title": "$:/core/ui/Buttons/storyview", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}", "description": "{{$:/language/Buttons/StoryView/Hint}}", "text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/view\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$link to=<<storyview>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/view\" text=<<storyview>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/view\" text=<<storyview>>>\n \n</$reveal>\n</span>\n<$transclude tiddler=<<icon>>/>\n<$text text=<<storyview>>/></$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>" }, "$:/core/ui/Buttons/tag-manager": { "title": "$:/core/ui/Buttons/tag-manager", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}", "description": "{{$:/language/Buttons/TagManager/Hint}}", "text": "\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n" }, "$:/core/ui/Buttons/theme": { "title": "$:/core/ui/Buttons/theme", "tags": "$:/tags/PageControls", "caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}", "description": "{{$:/language/Buttons/Theme/Hint}}", "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\" variable=\"themeTitle\">\n<$link to=<<themeTitle>>>\n<span class=\"tc-drop-down-bullet\">\n<$reveal type=\"match\" state=\"$:/theme\" text=<<themeTitle>>>\n•\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/theme\" text=<<themeTitle>>>\n \n</$reveal>\n</span>\n<$view tiddler=<<themeTitle>> field=\"name\"/>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>" }, "$:/core/ui/PageTemplate/pagecontrols": { "title": "$:/core/ui/PageTemplate/pagecontrols", "text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$reveal>\n</$list>\n</div>\n\n" }, "$:/core/ui/PageStylesheet": { "title": "$:/core/ui/PageStylesheet", "text": "<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n\n</$importvariables>\n" }, "$:/core/ui/PageTemplate/alerts": { "title": "$:/core/ui/PageTemplate/alerts", "tags": "$:/tags/PageTemplate", "text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n" }, "$:/core/ui/PageTemplate/pluginreloadwarning": { "title": "$:/core/ui/PageTemplate/pluginreloadwarning", "tags": "$:/tags/PageTemplate", "text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[has[plugin-type]haschanged[]!plugin-type[import]limit[1]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n" }, "$:/core/ui/PageTemplate/sidebar": { "title": "$:/core/ui/PageTemplate/sidebar", "tags": "$:/tags/PageTemplate", "text": "<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\">\n\n<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n\n<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n\n{{||$:/core/ui/PageTemplate/pagecontrols}}\n\n<$transclude tiddler=\"$:/core/ui/SideBarLists\" mode=\"inline\"/>\n\n</$reveal>\n\n</div>\n\n</$scrollable>" }, "$:/core/ui/PageTemplate/story": { "title": "$:/core/ui/PageTemplate/story", "tags": "$:/tags/PageTemplate", "text": "<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template=\"$:/core/ui/ViewTemplate\" editTemplate=\"$:/core/ui/EditTemplate\" storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n" }, "$:/core/ui/PageTemplate/topleftbar": { "title": "$:/core/ui/PageTemplate/topleftbar", "tags": "$:/tags/PageTemplate", "text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n" }, "$:/core/ui/PageTemplate/toprightbar": { "title": "$:/core/ui/PageTemplate/toprightbar", "tags": "$:/tags/PageTemplate", "text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n" }, "$:/core/ui/PageTemplate": { "title": "$:/core/ui/PageTemplate", "text": "\\define containerClasses()\ntc-page-container tc-page-view-$(themeTitle)$ tc-language-$(languageTitle)$\n\\end\n\n<$importvariables filter=\"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\">\n\n<$set name=\"tv-config-toolbar-icons\" value={{$:/config/Toolbar/Icons}}>\n\n<$set name=\"tv-config-toolbar-text\" value={{$:/config/Toolbar/Text}}>\n\n<$set name=\"tv-config-toolbar-class\" value={{$:/config/Toolbar/ButtonClass}}>\n\n<$set name=\"themeTitle\" value={{$:/view}}>\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$set name=\"currentTiddler\" value=\"\">\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}}>\n\n<$dropzone>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</$importvariables>\n" }, "$:/core/ui/PluginInfo": { "title": "$:/core/ui/PluginInfo", "text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\nNo ''\"<$text text=<<currentTab>>/>\"'' found\n</$transclude>\n</$transclude>\n</$transclude>\n" }, "$:/core/ui/SearchResults": { "title": "$:/core/ui/SearchResults", "text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}}/>\n</$list>\n\n</div>\n" }, "$:/core/ui/SideBar/More": { "title": "$:/core/ui/SideBar/More", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/More/Caption}}", "text": "<div class=\"tc-more-sidebar\">\n<<tabs \"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" \"$:/core/ui/MoreSideBar/Tags\" \"$:/state/tab/moresidebar\" \"tc-vertical\">>\n</div>\n" }, "$:/core/ui/SideBar/Open": { "title": "$:/core/ui/SideBar/Open", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/Open/Caption}}", "text": "\\define lingo-base() $:/language/CloseAll/\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" storyview=\"pop\">\n\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini\">×</$button> <$link to={{!!title}}><$view field=\"title\"/></$link>\n\n</$list>\n\n<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\n" }, "$:/core/ui/SideBar/Recent": { "title": "$:/core/ui/SideBar/Recent", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/Recent/Caption}}", "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n" }, "$:/core/ui/SideBar/Tools": { "title": "$:/core/ui/SideBar/Tools", "tags": "$:/tags/SideBar", "caption": "{{$:/language/SideBar/Tools/Caption}}", "text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/SideBarLists": { "title": "$:/core/ui/SideBarLists", "text": "<div class=\"tc-sidebar-lists\">\n\n<div class=\"tc-search\">\n<$edit-text tiddler=\"$:/temp/search\" type=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}}/>\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search}}/>\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/search\" text=\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/search\" type=\"nomatch\" text=\"\">\n\n<$set name=\"searchTiddler\" value=\"$:/temp/search\">\n{{$:/core/ui/SearchResults}}\n</$set>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/search\" type=\"match\" text=\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" />\n\n</$reveal>\n\n</div>\n" }, "$:/TagManager": { "title": "$:/TagManager", "icon": "$:/core/images/tag-button", "color": "#bbb", "text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/icon/$title$\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/icon/$title$\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$title$!!icon\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define qualifyTitle(title)\n$title$$(currentTiddler)$\n\\end\n\\define toggleButton(state)\n<$reveal state=\"$state$\" type=\"match\" text=\"closed\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal state=\"$state$\" type=\"match\" text=\"open\" default=\"closed\">\n<$button set=\"$state$\" setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td><$transclude tiddler=\"$:/core/ui/TagTemplate\"/></td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state=<<qualifyTitle \"$:/state/tag-manager/\">> /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal state=<<qualifyTitle \"$:/state/tag-manager/\">> type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td>\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n" }, "$:/core/ui/TagTemplate": { "title": "$:/core/ui/TagTemplate", "text": "\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB)\n<$set name=\"foregroundColor\" value=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">>>\n<$set name=\"backgroundColor\" value=\"\"\"$colour$\"\"\">\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-tag-label\" style=<<tag-styles>>>\n<$transclude tiddler={{!!icon}}/> <$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\"><div class=\"tc-drop-down\"><$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]tagging[]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</$set>\n</$set>\n\\end\n\n\\define tag-body(colour,palette)\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}}/>\n</span>\n\\end\n\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}}/>\n" }, "$:/core/ui/TiddlerFieldTemplate": { "title": "$:/core/ui/TiddlerFieldTemplate", "text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>" }, "$:/core/ui/TiddlerFields": { "title": "$:/core/ui/TiddlerFields", "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n" }, "$:/core/ui/TiddlerInfo/Advanced/PluginInfo": { "title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo", "tags": "$:/tags/TiddlerInfo/Advanced", "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n" }, "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": { "title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo", "tags": "$:/tags/TiddlerInfo/Advanced", "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n" }, "$:/core/ui/TiddlerInfo/Advanced": { "title": "$:/core/ui/TiddlerInfo/Advanced", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}", "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n" }, "$:/core/ui/TiddlerInfo/Fields": { "title": "$:/core/ui/TiddlerInfo/Fields", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Fields/Caption}}", "text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n" }, "$:/core/ui/TiddlerInfo/List": { "title": "$:/core/ui/TiddlerInfo/List", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/List/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/TiddlerInfo/Listed": { "title": "$:/core/ui/TiddlerInfo/Listed", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Listed/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/TiddlerInfo/References": { "title": "$:/core/ui/TiddlerInfo/References", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/References/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>\n" }, "$:/core/ui/TiddlerInfo/Tagging": { "title": "$:/core/ui/TiddlerInfo/Tagging", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n" }, "$:/core/ui/TiddlerInfo/Tools": { "title": "$:/core/ui/TiddlerInfo/Tools", "tags": "$:/tags/TiddlerInfo", "caption": "{{$:/language/TiddlerInfo/Tools/Caption}}", "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n" }, "$:/core/ui/TiddlerInfo": { "title": "$:/core/ui/TiddlerInfo", "text": "<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>" }, "$:/core/ui/TopBar/menu": { "title": "$:/core/ui/TopBar/menu", "tags": "$:/tags/TopRightBar", "text": "<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$reveal>\n" }, "$:/core/ui/UntaggedTemplate": { "title": "$:/core/ui/UntaggedTemplate", "text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n" }, "$:/core/ui/ViewTemplate/body": { "title": "$:/core/ui/ViewTemplate/body", "tags": "$:/tags/ViewTemplate", "text": "<div class=\"tc-tiddler-body\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</div>\n" }, "$:/core/ui/ViewTemplate/classic": { "title": "$:/core/ui/ViewTemplate/classic", "tags": "$:/tags/ViewTemplate $:/tags/EditTemplate", "text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n" }, "$:/core/ui/ViewTemplate/import": { "title": "$:/core/ui/ViewTemplate/import", "tags": "$:/tags/ViewTemplate", "text": "\\define lingo-base() $:/language/Import/\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n{{||$:/core/ui/ImportListing}}\n\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n\n</div>\n\n</$list>\n" }, "$:/core/ui/ViewTemplate/plugin": { "title": "$:/core/ui/ViewTemplate/plugin", "tags": "$:/tags/ViewTemplate", "text": "<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n\n{{||$:/core/ui/TiddlerInfo/Advanced/PluginInfo}}\n\n</$list>\n" }, "$:/core/ui/ViewTemplate/subtitle": { "title": "$:/core/ui/ViewTemplate/subtitle", "tags": "$:/tags/ViewTemplate", "text": "<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"relativedate\"/>\n</div>\n" }, "$:/core/ui/ViewTemplate/tags": { "title": "$:/core/ui/ViewTemplate/tags", "tags": "$:/tags/ViewTemplate", "text": "<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n" }, "$:/core/ui/ViewTemplate/title": { "title": "$:/core/ui/ViewTemplate/title", "tags": "$:/tags/ViewTemplate", "text": "\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}/>\n</span>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo\"/>\n\n</$reveal>\n</div>" }, "$:/core/ui/ViewTemplate": { "title": "$:/core/ui/ViewTemplate", "text": "\\define frame-classes()\ntc-tiddler-frame tc-tiddler-view-frame $(missingTiddlerClass)$ $(shadowTiddlerClass)$ $(systemTiddlerClass)$ $(tiddlerTagClasses)$\n\\end\n<$set name=\"storyTiddler\" value=<<currentTiddler>>><$set name=\"tiddlerInfoState\" value=<<qualify \"$:/state/popup/tiddler-info\">>><$tiddler tiddler=<<currentTiddler>>><div class=<<frame-classes>>><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$tiddler></$set></$set>\n" }, "$:/core/ui/Buttons/clone": { "title": "$:/core/ui/Buttons/clone", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}", "description": "{{$:/language/Buttons/Clone/Hint}}", "text": "<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Clone/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/close-others": { "title": "$:/core/ui/Buttons/close-others", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}", "description": "{{$:/language/Buttons/CloseOthers/Hint}}", "text": "<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseOthers/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/close": { "title": "$:/core/ui/Buttons/close", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}", "description": "{{$:/language/Buttons/Close/Hint}}", "text": "<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Close/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/edit": { "title": "$:/core/ui/Buttons/edit", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}", "description": "{{$:/language/Buttons/Edit/Hint}}", "text": "<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Edit/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/export-tiddler": { "title": "$:/core/ui/Buttons/export-tiddler", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}", "description": "{{$:/language/Buttons/ExportTiddler/Hint}}", "text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>" }, "$:/core/ui/Buttons/info": { "title": "$:/core/ui/Buttons/info", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}", "description": "{{$:/language/Buttons/Info/Hint}}", "text": "<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Info/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/more-tiddler-actions": { "title": "$:/core/ui/Buttons/more-tiddler-actions", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}", "description": "{{$:/language/Buttons/More/Hint}}", "text": "\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} 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\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>" }, "$:/core/ui/Buttons/new-here": { "title": "$:/core/ui/Buttons/new-here", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}", "description": "{{$:/language/Buttons/NewHere/Hint}}", "text": "\\define newHereButtonTags()\n[[$(currentTiddler)$]]\n\\end\n\\define newHereButton()\n<$button tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<newHereButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>" }, "$:/core/ui/Buttons/new-journal-here": { "title": "$:/core/ui/Buttons/new-journal-here", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}", "description": "{{$:/language/Buttons/NewJournalHere/Hint}}", "text": "\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<now \"$(journalTitleTemplate)$\">> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournalHere/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set></$set></$set>" }, "$:/core/ui/Buttons/open-window": { "title": "$:/core/ui/Buttons/open-window", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}", "description": "{{$:/language/Buttons/OpenWindow/Hint}}", "text": "<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/OpenWindow/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/permalink": { "title": "$:/core/ui/Buttons/permalink", "tags": "$:/tags/ViewToolbar", "caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}", "description": "{{$:/language/Buttons/Permalink/Hint}}", "text": "<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permalink/Caption}}/></span>\n</$list>\n</$button>" }, "$:/core/ui/Buttons/permaview": { "title": "$:/core/ui/Buttons/permaview", "tags": "$:/tags/ViewToolbar $:/tags/PageControls", "caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}", "description": "{{$:/language/Buttons/Permaview/Hint}}", "text": "<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Permaview/Caption}}/></span>\n</$list>\n</$button>" }, "$:/DefaultTiddlers": { "title": "$:/DefaultTiddlers", "text": "GettingStarted\n" }, "$:/temp/advancedsearch": { "title": "$:/temp/advancedsearch", "text": "" }, "$:/snippets/allfields": { "title": "$:/snippets/allfields", "text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n" }, "$:/config/AnimationDuration": { "title": "$:/config/AnimationDuration", "text": "400" }, "$:/config/AutoSave": { "title": "$:/config/AutoSave", "text": "yes" }, "$:/config/BitmapEditor/Colour": { "title": "$:/config/BitmapEditor/Colour", "text": "#ff0" }, "$:/config/BitmapEditor/LineWidth": { "title": "$:/config/BitmapEditor/LineWidth", "text": "3" }, "$:/config/DefaultSidebarTab": { "title": "$:/config/DefaultSidebarTab", "text": "$:/core/ui/SideBar/Open" }, "$:/config/Drafts/TypingTimeout": { "title": "$:/config/Drafts/TypingTimeout", "text": "400" }, "$:/config/EditTemplateFields/Visibility/title": { "title": "$:/config/EditTemplateFields/Visibility/title", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/tags": { "title": "$:/config/EditTemplateFields/Visibility/tags", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/text": { "title": "$:/config/EditTemplateFields/Visibility/text", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/creator": { "title": "$:/config/EditTemplateFields/Visibility/creator", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/created": { "title": "$:/config/EditTemplateFields/Visibility/created", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/modified": { "title": "$:/config/EditTemplateFields/Visibility/modified", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/modifier": { "title": "$:/config/EditTemplateFields/Visibility/modifier", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/type": { "title": "$:/config/EditTemplateFields/Visibility/type", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/draft.title": { "title": "$:/config/EditTemplateFields/Visibility/draft.title", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/draft.of": { "title": "$:/config/EditTemplateFields/Visibility/draft.of", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/revision": { "title": "$:/config/EditTemplateFields/Visibility/revision", "text": "hide" }, "$:/config/EditTemplateFields/Visibility/bag": { "title": "$:/config/EditTemplateFields/Visibility/bag", "text": "hide" }, "$:/config/EditorTypeMappings/image/gif": { "title": "$:/config/EditorTypeMappings/image/gif", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/jpeg": { "title": "$:/config/EditorTypeMappings/image/jpeg", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/jpg": { "title": "$:/config/EditorTypeMappings/image/jpg", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/png": { "title": "$:/config/EditorTypeMappings/image/png", "text": "bitmap" }, "$:/config/EditorTypeMappings/image/x-icon": { "title": "$:/config/EditorTypeMappings/image/x-icon", "text": "bitmap" }, "$:/config/EditorTypeMappings/text/vnd.tiddlywiki": { "title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki", "text": "text" }, "$:/config/Navigation/UpdateAddressBar": { "title": "$:/config/Navigation/UpdateAddressBar", "text": "no" }, "$:/config/Navigation/UpdateHistory": { "title": "$:/config/Navigation/UpdateHistory", "text": "no" }, "$:/config/OfficialPluginLibrary": { "title": "$:/config/OfficialPluginLibrary", "tags": "$:/tags/PluginLibrary", "url": "http://tiddlywiki.com/library/v5.1.9/index.html", "caption": "{{$:/language/OfficialPluginLibrary}}", "text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team.\n" }, "$:/config/Navigation/openLinkFromInsideRiver": { "title": "$:/config/Navigation/openLinkFromInsideRiver", "text": "below" }, "$:/config/Navigation/openLinkFromOutsideRiver": { "title": "$:/config/Navigation/openLinkFromOutsideRiver", "text": "top" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview", "text": "hide" }, "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": { "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme", "text": "hide" }, "$:/config/SaveWikiButton/Template": { "title": "$:/config/SaveWikiButton/Template", "text": "$:/core/save/all" }, "$:/config/SaverFilter": { "title": "$:/config/SaverFilter", "text": "[all[]] -[[$:/HistoryList]] -[[$:/StoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state]] -[prefix[$:/temp]]" }, "$:/config/Search/AutoFocus": { "title": "$:/config/Search/AutoFocus", "text": "true" }, "$:/config/SearchResults/Default": { "title": "$:/config/SearchResults/Default", "text": "$:/core/ui/DefaultSearchResultList" }, "$:/config/SyncFilter": { "title": "$:/config/SyncFilter", "text": "[is[tiddler]] -[[$:/HistoryList]] -[[$:/Import]] -[[$:/isEncrypted]] -[prefix[$:/status]] -[prefix[$:/state]] -[prefix[$:/temp]]" }, "$:/config/TiddlerInfo/Default": { "title": "$:/config/TiddlerInfo/Default", "text": "$:/core/ui/TiddlerInfo/Fields" }, "$:/config/Tiddlers/TitleLinks": { "title": "$:/config/Tiddlers/TitleLinks", "text": "no" }, "$:/config/Toolbar/ButtonClass": { "title": "$:/config/Toolbar/ButtonClass", "text": "tc-btn-invisible" }, "$:/config/Toolbar/Icons": { "title": "$:/config/Toolbar/Icons", "text": "yes" }, "$:/config/Toolbar/Text": { "title": "$:/config/Toolbar/Text", "text": "no" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions", "text": "show" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink", "text": "hide" }, "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": { "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview", "text": "hide" }, "$:/snippets/currpalettepreview": { "title": "$:/snippets/currpalettepreview", "text": "\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch(colour)\n<$set name=\"swatchColour\" value={{##$colour$}}>\n<div class=\"tc-swatch\" style=<<swatchStyle>>/>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\">\n<<swatch foreground>>\n<<swatch background>>\n<<swatch muted-foreground>>\n<<swatch primary>>\n<<swatch page-background>>\n<<swatch tab-background>>\n<<swatch tiddler-info-background>>\n</div>\n" }, "$:/snippets/download-wiki-button": { "title": "$:/snippets/download-wiki-button", "text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>" }, "$:/language": { "title": "$:/language", "text": "$:/languages/en-GB" }, "$:/snippets/languageswitcher": { "title": "$:/snippets/languageswitcher", "text": "{{$:/language/ControlPanel/Basics/Language/Prompt}} <$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>" }, "$:/core/macros/CSS": { "title": "$:/core/macros/CSS", "tags": "$:/tags/Macro", "text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"/></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n" }, "$:/core/macros/export": { "title": "$:/core/macros/export", "tags": "$:/tags/Macro", "text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=\"\"\"$exportFilter$\"\"\" filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</div>\n</$reveal>\n\\end\n" }, "$:/core/macros/lingo": { "title": "$:/core/macros/lingo", "tags": "$:/tags/Macro", "text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n" }, "$:/core/macros/list": { "title": "$:/core/macros/list", "tags": "$:/tags/Macro", "text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\")\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\">\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n" }, "$:/core/macros/tabs": { "title": "$:/core/macros/tabs", "tags": "$:/tags/Macro", "text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template)\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n<$button set=<<qualify \"$state$\">> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$set>\n</$button>\n</$list>\n</div><div class=\"tc-tab-divider $class$\"/><div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<qualify \"$state$\">> text=<<currentTab>> default=\"$default$\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n\\end\n" }, "$:/core/macros/tag": { "title": "$:/core/macros/tag", "tags": "$:/tags/Macro", "text": "\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n" }, "$:/core/macros/thumbails": { "title": "$:/core/macros/thumbails", "tags": "$:/tags/Macro", "text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div></div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n" }, "$:/core/macros/timeline": { "created": "20141212105914482", "modified": "20141212110330815", "tags": "$:/tags/Macro", "title": "$:/core/macros/timeline", "type": "text/vnd.tiddlywiki", "text": "\\define timeline-title()\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}>\n<<timeline-title>>\n</$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n" }, "$:/core/macros/toc": { "title": "$:/core/macros/toc", "tags": "$:/tags/Macro", "text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$set>\n\\end\n\n\\define toc-body(rootTag,tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc\">\n<$list filter=\"\"\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\"\"\">\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link><$view field='caption'><$view field='title'/></$view></$link>\">\n<<toc-caption>>\n</$list>\n<$list filter=\"\"\"[all[current]] -[[$rootTag$]]\"\"\">\n<$macrocall $name=\"toc-body\" rootTag=\"\"\"$rootTag$\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$list>\n</li>\n</$set>\n</$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter)\n<<toc-body rootTag:\"\"\"$tag$\"\"\" tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<<toc-linked-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"itemClassFilter\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$link>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n</$list>\n<<toc-caption>>\n</$link>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter)\n<$set name=\"toc-state\" value=<<qualify \"$:/state/toc/$tag$-$(currentTiddler)$\">>>\n<$set name=\"toc-item-class\" filter=\"\"\"$itemClassFilter$\"\"\" value=\"toc-item-selected\" emptyValue=\"toc-item\">\n<li class=<<toc-item-class>>>\n<$list filter=\"[all[current]tagging[]limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n<$reveal type=\"nomatch\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$button set=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<<toc-caption>>\n</$button>\n</$reveal>\n</$list>\n<$reveal type=\"match\" state=<<toc-state>> text=\"open\">\n<$macrocall $name=\"\"\"toc-selective-expandable\"\"\" tag=<<currentTiddler>> sort=\"\"\"$sort$\"\"\" itemClassFilter=\"\"\"$itemClassFilter$\"\"\"/>\n</$reveal>\n</li>\n</$set>\n</$set>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter)\n<ol class=\"tc-toc toc-selective-expandable\">\n<$list filter=\"[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]\">\n<$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=\"<<toc-linked-selective-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>\">\n<<toc-unlinked-selective-expandable-body tag:\"\"\"$tag$\"\"\" sort:\"\"\"$sort$\"\"\" itemClassFilter:\"\"\"$itemClassFilter$\"\"\">>\n</$list>\n</$list>\n</ol>\n\\end\n\n\\define toc-tabbed-selected-item-filter(selectedTiddler)\n[all[current]field:title{$selectedTiddler$}]\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{$selectedTiddler$}}>\n<div class=\"tc-tabbed-table-of-contents\">\n<$linkcatcher to=\"$selectedTiddler$\">\n<div class=\"tc-table-of-contents\">\n<$macrocall $name=\"toc-selective-expandable\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" itemClassFilter=<<toc-tabbed-selected-item-filter selectedTiddler:\"\"\"$selectedTiddler$\"\"\">>/>\n</div>\n</$linkcatcher>\n<div class=\"tc-tabbed-table-of-contents-content\">\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"nomatch\" text=\"\">\n<$transclude mode=\"block\" tiddler=\"$template$\">\n<h1><<toc-caption>></h1>\n<$transclude mode=\"block\">$missingText$</$transclude>\n</$transclude>\n</$reveal>\n<$reveal state=\"\"\"$selectedTiddler$\"\"\" type=\"match\" text=\"\">\n$unselectedText$\n</$reveal>\n</div>\n</div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=\"\"\"$selectedTiddler$\"\"\">\n<$macrocall $name=\"toc-tabbed-external-nav\" tag=\"\"\"$tag$\"\"\" sort=\"\"\"$sort$\"\"\" selectedTiddler=\"\"\"$selectedTiddler$\"\"\" unselectedText=\"\"\"$unselectedText$\"\"\" missingText=\"\"\"$missingText$\"\"\" template=\"\"\"$template$\"\"\"/>\n</$linkcatcher>\n\\end\n\n" }, "$:/snippets/minilanguageswitcher": { "title": "$:/snippets/minilanguageswitcher", "text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>" }, "$:/snippets/minithemeswitcher": { "title": "$:/snippets/minithemeswitcher", "text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>" }, "$:/snippets/modules": { "title": "$:/snippets/modules", "text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n" }, "$:/palette": { "title": "$:/palette", "text": "$:/palettes/Vanilla" }, "$:/snippets/paletteeditor": { "title": "$:/snippets/paletteeditor", "text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<table>\n<tbody>\n<$list filter=\"[all[current]indexes[]]\" variable=\"colourName\">\n<tr>\n<td>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<$edit-text index=<<colourName>> tag=\"input\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n</$set>\n" }, "$:/snippets/palettepreview": { "title": "$:/snippets/palettepreview", "text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n<$transclude tiddler=\"$:/snippets/currpalettepreview\"/>\n</$set>\n" }, "$:/snippets/paletteswitcher": { "title": "$:/snippets/paletteswitcher", "text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n<div class=\"tc-prompt\">\n<<lingo Prompt>> <$view tiddler={{$:/palette}} field=\"name\"/>\n</div>\n\n<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[description]]\"><div class=\"tc-chooser-item\"><$link to={{!!title}}><div><$reveal state=\"$:/palette\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/palette\" type=\"nomatch\" text={{!!title}}> </$reveal> ''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/></div><$transclude tiddler=\"$:/snippets/currpalettepreview\"/></$link></div>\n</$list>\n</div>\n</$linkcatcher>" }, "$:/temp/search": { "title": "$:/temp/search", "text": "" }, "$:/tags/AdvancedSearch": { "title": "$:/tags/AdvancedSearch", "list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]" }, "$:/tags/ControlPanel": { "title": "$:/tags/ControlPanel", "list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals" }, "$:/tags/ControlPanel/Info": { "title": "$:/tags/ControlPanel/Info", "list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced" }, "$:/tags/ControlPanel/Plugins": { "title": "$:/tags/ControlPanel/Plugins", "list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]" }, "$:/tags/EditTemplate": { "title": "$:/tags/EditTemplate", "list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]" }, "$:/tags/EditToolbar": { "title": "$:/tags/EditToolbar", "list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]" }, "$:/tags/MoreSideBar": { "title": "$:/tags/MoreSideBar", "list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]]", "text": "" }, "$:/tags/PageControls": { "title": "$:/tags/PageControls", "list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]" }, "$:/tags/PageTemplate": { "title": "$:/tags/PageTemplate", "list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]", "text": "" }, "$:/tags/SideBar": { "title": "$:/tags/SideBar", "list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]", "text": "" }, "$:/tags/TiddlerInfo": { "title": "$:/tags/TiddlerInfo", "list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]", "text": "" }, "$:/tags/TiddlerInfo/Advanced": { "title": "$:/tags/TiddlerInfo/Advanced", "list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]" }, "$:/tags/ViewTemplate": { "title": "$:/tags/ViewTemplate", "list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]" }, "$:/tags/ViewToolbar": { "title": "$:/tags/ViewToolbar", "list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]]" }, "$:/snippets/themeswitcher": { "title": "$:/snippets/themeswitcher", "text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$view tiddler={{$:/theme}} field=\"name\"/>\n\n<$linkcatcher to=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\"><div><$reveal state=\"$:/theme\" type=\"match\" text={{!!title}}>•</$reveal><$reveal state=\"$:/theme\" type=\"nomatch\" text={{!!title}}> </$reveal> <$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$list>\n</$linkcatcher>" }, "$:/core/wiki/title": { "title": "$:/core/wiki/title", "type": "text/vnd.tiddlywiki", "text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}" }, "$:/view": { "title": "$:/view", "text": "classic" }, "$:/snippets/viewswitcher": { "title": "$:/snippets/viewswitcher", "text": "\\define lingo-base() $:/language/ControlPanel/StoryView/\n<<lingo Prompt>> <$select tiddler=\"$:/view\">\n<$list filter=\"[storyviews[]]\">\n<option><$view field=\"title\"/></option>\n</$list>\n</$select>" } } }
/*\ title: $:/core/modules/widgets/link.js type: application/javascript module-type: widget Link widget \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; var Widget = require("$:/core/modules/widgets/widget.js").widget; var LinkWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); }; /* Inherit from the base widget class */ LinkWidget.prototype = new Widget(); /* Render this widget into the DOM */ LinkWidget.prototype.render = function(parent,nextSibling) { // Save the parent dom node this.parentDomNode = parent; // Compute our attributes this.computeAttributes(); // Execute our logic this.execute(); // Get the value of the tv-wikilinks configuration macro var wikiLinksMacro = this.getVariable("tv-wikilinks"), useWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== "no") : true; // Render the link if required if(useWikiLinks) { this.renderLink(parent,nextSibling); } else { // Just insert the link text var domNode = this.document.createElement("span"); parent.insertBefore(domNode,nextSibling); this.renderChildren(domNode,null); this.domNodes.push(domNode); } }; /* Render this widget into the DOM */ LinkWidget.prototype.renderLink = function(parent,nextSibling) { var self = this; // Sanitise the specified tag var tag = this.linkTag; if($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) { tag = "a"; } // Create our element var domNode = this.document.createElement(tag); // Assign classes var classes = []; if(this.linkClasses) { classes.push(this.linkClasses); } classes.push("tc-tiddlylink"); if(this.isShadow) { classes.push("tc-tiddlylink-shadow"); } if(this.isMissing && !this.isShadow) { classes.push("tc-tiddlylink-missing"); } else { if(!this.isMissing) { classes.push("tc-tiddlylink-resolves"); } } domNode.setAttribute("class",classes.join(" ")); // Set an href var wikiLinkTemplateMacro = this.getVariable("tv-wikilink-template"), wikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : "#$uri_encoded$", wikiLinkText = wikiLinkTemplate.replace("$uri_encoded$",encodeURIComponent(this.to)); wikiLinkText = wikiLinkText.replace("$uri_doubleencoded$",encodeURIComponent(encodeURIComponent(this.to))); wikiLinkText = this.getVariable("tv-get-export-link",{params: [{name: "to",value: this.to}],defaultValue: wikiLinkText}); if(tag === "a") { domNode.setAttribute("href",wikiLinkText); } domNode.setAttribute("tabindex",this.tabIndex); // Set the tooltip // HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to "<$transclude field='tooltip'><$transclude field='title'/></$transclude>" var tooltipWikiText = this.tooltip || this.getVariable("tv-wikilink-tooltip"); if(tooltipWikiText) { var tooltipText = this.wiki.renderText("text/plain","text/vnd.tiddlywiki",tooltipWikiText,{ parseAsInline: true, variables: { currentTiddler: this.to }, parentWidget: this }); domNode.setAttribute("title",tooltipText); } if(this["aria-label"]) { domNode.setAttribute("aria-label",this["aria-label"]); } // Add a click event handler $tw.utils.addEventListeners(domNode,[ {name: "click", handlerObject: this, handlerMethod: "handleClickEvent"}, ]); if(this.draggable === "yes") { $tw.utils.addEventListeners(domNode,[ {name: "dragstart", handlerObject: this, handlerMethod: "handleDragStartEvent"}, {name: "dragend", handlerObject: this, handlerMethod: "handleDragEndEvent"} ]); } // Insert the link into the DOM and render any children parent.insertBefore(domNode,nextSibling); this.renderChildren(domNode,null); this.domNodes.push(domNode); }; LinkWidget.prototype.handleClickEvent = function(event) { var handled; // Invoke any actions if(this.invokeActions(event)) { handled = true; } // Send the click on its way as a navigate event var bounds = this.domNodes[0].getBoundingClientRect(); this.dispatchEvent({ type: "tm-navigate", navigateTo: this.to, navigateFromTitle: this.getVariable("storyTiddler"), navigateFromNode: this, navigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height }, navigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1) }); if(this.domNodes[0].hasAttribute("href")) { event.preventDefault(); event.stopPropagation(); return false; } }; LinkWidget.prototype.handleDragStartEvent = function(event) { if(event.target === this.domNodes[0]) { if(this.to) { $tw.dragInProgress = true; // Set the dragging class on the element being dragged $tw.utils.addClass(event.target,"tc-tiddlylink-dragging"); // Create the drag image elements this.dragImage = this.document.createElement("div"); this.dragImage.className = "tc-tiddler-dragger"; var inner = this.document.createElement("div"); inner.className = "tc-tiddler-dragger-inner"; inner.appendChild(this.document.createTextNode(this.to)); this.dragImage.appendChild(inner); this.document.body.appendChild(this.dragImage); // Astoundingly, we need to cover the dragger up: http://www.kryogenix.org/code/browser/custom-drag-image.html var cover = this.document.createElement("div"); cover.className = "tc-tiddler-dragger-cover"; cover.style.left = (inner.offsetLeft - 16) + "px"; cover.style.top = (inner.offsetTop - 16) + "px"; cover.style.width = (inner.offsetWidth + 32) + "px"; cover.style.height = (inner.offsetHeight + 32) + "px"; this.dragImage.appendChild(cover); // Set the data transfer properties var dataTransfer = event.dataTransfer; // First the image dataTransfer.effectAllowed = "copy"; if(dataTransfer.setDragImage) { dataTransfer.setDragImage(this.dragImage.firstChild,-16,-16); } // Then the data dataTransfer.clearData(); var jsonData = this.wiki.getTiddlerAsJson(this.to), textData = this.wiki.getTiddlerText(this.to,""), title = (new RegExp("^" + $tw.config.textPrimitives.wikiLink + "$","mg")).exec(this.to) ? this.to : "[[" + this.to + "]]"; // IE doesn't like these content types if(!$tw.browser.isIE) { dataTransfer.setData("text/vnd.tiddler",jsonData); dataTransfer.setData("text/plain",title); dataTransfer.setData("text/x-moz-url","data:text/vnd.tiddler," + encodeURIComponent(jsonData)); } dataTransfer.setData("URL","data:text/vnd.tiddler," + encodeURIComponent(jsonData)); dataTransfer.setData("Text",title); event.stopPropagation(); } else { event.preventDefault(); } } }; LinkWidget.prototype.handleDragEndEvent = function(event) { if(event.target === this.domNodes[0]) { $tw.dragInProgress = false; // Remove the dragging class on the element being dragged $tw.utils.removeClass(event.target,"tc-tiddlylink-dragging"); // Delete the drag image element if(this.dragImage) { this.dragImage.parentNode.removeChild(this.dragImage); } } }; /* Compute the internal state of the widget */ LinkWidget.prototype.execute = function() { // Pick up our attributes this.to = this.getAttribute("to",this.getVariable("currentTiddler")); this.tooltip = this.getAttribute("tooltip"); this["aria-label"] = this.getAttribute("aria-label"); this.linkClasses = this.getAttribute("class"); this.tabIndex = this.getAttribute("tabindex"); this.draggable = this.getAttribute("draggable","yes"); this.linkTag = this.getAttribute("tag","a"); // Determine the link characteristics this.isMissing = !this.wiki.tiddlerExists(this.to); this.isShadow = this.wiki.isShadowTiddler(this.to); // Make the child widgets this.makeChildWidgets(); }; /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ LinkWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); if(changedAttributes.to || changedTiddlers[this.to] || changedAttributes["aria-label"] || changedAttributes.tooltip) { this.refreshSelf(); return true; } return this.refreshChildren(changedTiddlers); }; exports.link = LinkWidget; })();
<$scrollable fallthrough="no" class="tc-sidebar-scrollable"> <div class="tc-sidebar-header"> <$reveal state="$:/state/sidebar" type="match" text="yes" default="yes" retain="yes"> <h1 class="tc-site-title"> <$transclude tiddler="$:/SiteTitle" mode="inline"/> </h1> <div class="tc-site-subtitle"> <$transclude tiddler="$:/SiteSubtitle" mode="inline"/> </div> {{||$:/core/ui/PageTemplate/pagecontrols}} <$transclude tiddler="$:/core/ui/SideBarLists" mode="inline"/> </$reveal> </div> </$scrollable>
<$reveal state="$:/state/sidebar" type="nomatch" text="no"> <$button set="$:/state/sidebar" setTo="no" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-right}}</$button> </$reveal> <$reveal state="$:/state/sidebar" type="match" text="no"> <$button set="$:/state/sidebar" setTo="yes" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-left}}</$button> </$reveal>
{ "Terry Pratchett": "1", "Robert Asprin": "1", "Arthur C. Clark": "1", "Dave Barry": "1", "Jack McDevitt": "1", "Dan Simmons": "1", "Phil & Kaja Foglio": "1", "Jim C. Hines": "1", "Glen Cook": "1", "Orson Scott Card": "1", "Piers Anthony": "1", "Robert Jordan": "1", "Aravind Adiga": "1", "Paolo Bacigalupi": "1", "Walter Moers": "1", "Thomas E. Sniegoski": "1", "Robin Wayne Bailey": "1", "Patricia A. McKillip": "1", "Martin Gardner": "1", "Eoin Colfer": "1", "Ursula K. LeGuin": "1", "T. H. White": "1", "Fred Saberhagen": "1", "Garth Nix": "1", "Walt Whitman": "1", "Lauren St. John": "1", "Frank Herbert": "1", "Alastair Reynolds": "1", "R. A. Lafferty": "1", "Octavia E. Butler": "1", "Edgar Rice Burroughs": "1", "Robert Silverberg": "1", "Robert Charles Wilson": "1", "China Mieville": "1", "David Wingrove": "1", "Various": "1", "K. J. Parker": "1", "Robert Shea and Robert Anton Wilson": "1", "James Randi": "1", "Guillaume Prevost": "1", "Stephen Hawking": "1", "Jim Butcher": "1", "Bob Fenster": "1", "Issac Asimov": "1", "Cherie Priest": "1", "Neil Gaiman": "1", "Mercedes Lackey and Rosemary Edghill": "1", "Yahtzee Croshaw": "1", "Steven Gould": "1", "Wil Wheaton": "1", "Cory Doctorow": "1", "Kelly Link": "1", "John Scalzi": "1", "Holly Black": "1", "Lois McMaster Bujold": "1", "Tobias Buckell": "1", "Peter Beagle": "1", "Ryan North": "1", "Sean Williams": "1", "Scott Westerfeld": "1", "Terry Goodkind": "1", "Lauren Beukes": "1", "Dave Eggers": "1", "Meg Cabot": "1", "Cormac McCarthy": "1", "William S. Burroughs": "1", "Lucy Christopher": "1", "Grace Krilanovich": "1", "Salman Rushdie": "1", "Charles Portis": "1", "Justin Somper": "1", "Hugh Howey": "1" }
{ "Fantasy": "1", "Science Fiction": "1", "Historical Fiction": "1", "Comedy": "1", "Steampunk": "1", "Fiction": "1", "Pulp Adventure": "1", "Swords and Sorcery": "1", "Science": "1", "Poetry": "1", "Memoir": "1", "Cyberpunk": "1", "Horror": "1" }
{ "Home": "1", "Comixology": "1", "Humble Library": "1", "Dad's house": "1" }
Music: 1 Video: 1 YouTube: 1 TiddlyWiki: 1 TiddlyWiki Plugins: undefined Forum: 1 Interactive Fiction: 1 GitHub: 1 Coding: 1 Game: 1 Browser Game: 1 RPG: 1 Reference: 1 Table Top: 1 Online Store: 1 Games: 1 Piano: 1 Cello: 1 Fitzgerald: 1 Violin: 1 d20: 1 Final Fantasy: 1 Programming: 1 Linear Algebra: 1 Random Generator: 1 Comic: 1 D&D: 1 AMV: 1 Cowboy Bebop: 1 DOSBox: 1 1st Ed: 1 2nd Ed: 1 Audio Books: 1 Books: 1 Remake: 1 Computer Games: 1 Old Games: 1 Quest for Glory: 1 Web Comic: 1 Palladium: 1 Drawing: 1 Superhero: 1 Artist: 1 Audio: 1 vkgoeswild: 1 Science Fiction: 1 Old-time Radio: 1 GMing: 1 Stories: 1 Flash Fiction: 1 Blog: 1 Futurism: 1 Utopia: 1 Fiction: 1 Podcast: 1 The Piano Guys: 1 Zoe Keating: 1 Plumb: 1 Learning: 1 Tutorial: 1 Contact Juggling: 1 Math: 1 Plugins: 1 ATOM Feed: 1 TED Talks: 1 Graphics: 1 Data Representation: 1 Photos: 1 Sir Hatsworth XVII: 1 Space Opera: 1 Military Fiction: 1 Fantasy: 1 Satire: 1 Discordian: 1 Social Networking: 1 Software: 1 Open Source: 1 Hardware: 1 Electronics: 1 Computer: 1 Development: 1 Sia: 1 LaTeX: 1 Comedy: 1 SoundCloud: 1 Dwarf Fortress: 1 By inmysocks: 1 Photographer: 1 2CELLOS: 1 Engineering: 1 DSP: 1 Victorian Fashion: 1 Art: 1 Woodworking: 1 Making: 1 Cool: 1 Amanda Palmer: 1 LoliZombie: 1 Open Internet: 1 Indie: 1 Raspberry Pi: 1 ARM Processor: 1 OS: 1 People: 1
{ "Read": "1", "Unread": "1", "Hardcover": "1", "Paperback": "1", "Digital": "1", "Comic": "1", "Advanced Readers Copy": "1", "Currently Reading": "1", "May Not Be Mine": "1", "Anthology": "1", "Short Story": "1", "Choose Your Own Adventure": "1", "Audio Book": "1", "Novella": "1" }
{ "Random Drivel": "1", "Non-Random Drivel": "1", "Pictures": "1", "TiddlyWiki": "1", "What?": "1", "What am I doing?": "1", "Javert": "1", "Computer Problems": "1", "Raspberry Pi": "1", "Dissertation": "1", "Rant": "1", "Art": "1", "Technology": "1", "Spoiled Dog": "1", "Fight the Tyranny of Cats Online!": "1", "No Cat Photos": "1", "Snow": "1", "Teaching": "1", "Paris": "1", "AUP": "1", "Blog Stuff": "1", "Twitter": "1", "Social Networking": "1", "Dogs": "1", "Music": "1", "Zoe Keating": "1", "Cello": "1", "Amanda Palmer": "1", "OokTech": "1", "Complaining ": "1", "Computer Games": "1", "Tattoo": "1", "News Dump": "1", "Drawing": "1" }
{ "http://ooktech.com/jed/externalbrain/images/Long%20Exposure%20of%20the%20Eiffel%20Tower%20at%20Night.JPG":"1", "http://ooktech.com/jed/externalbrain/images/Entering%20the%20Catacombs.JPG":"1", "http://ooktech.com/jed/externalbrain/images/Albuquerque%20from%20the%20Sandias.JPG":"1", "http://ooktech.com/jed/externalbrain/images/Javert%20packing.JPG":"1", "http://ooktech.com/jed/externalbrain/images/BW%20sun%20set.JPG":"1", "http://ooktech.com/jed/externalbrain/images/The%20Eiffel%20Tower.JPG":"1", "http://ooktech.com/jed/externalbrain/images/Entering%20the%20Catacombs.JPG":"1", "http://ooktech.com/jed/externalbrain/images/Javert1.JPG":"1", "http://ooktech.com/jed/externalbrain/images/Zuko%20Wings%20-%20small.JPG":"1", "http://ooktech.com/jed/externalbrain/images/Javert%20looks%20slightly%20irritated.JPG":"1", "http://ooktech.com/jed/externalbrain/images/IBeatQWOP.png":"1" }
{ "Discworld": "1", "Hyperion Cantos": "1", "N/A": "1", "Space Oddesey": "1", "Alex Benedict": "1", "MythAdventures": "1", "Agatha H (Girl Genuis Prose Novels)": "1", "Goblin Quest": "1", "The Black Company": "1", "Homecoming": "1", "Xanth": "1", "Of Man and Manta": "1", "Incarnations of Immortality": "1", "The Wheel of Time": "1", "Apprentice Adept": "1", "The Long Earth": "1", "The Windup Girl": "1", "Zamonia": "1", "Lobster Johnson": "1", "Fafhrd and the Gray Mouser": "1", "Riddle Master": "1", "The Hitchhikers Guide Trilogy": "1", "Berserker": "1", "Dune": "1", "Revelation Space": "1", "Earthsea": "1", "Parable trilogy": "1", "Barsoom": "1", "Spin": "1", "Chung Kuo": "1", "Engineer Trilogy": "1", "The Dresden Files": "1", "Clockwork Century": "1", "Old Man's War": "1", "Vorkosigan Saga": "1", "Uglies": "1", "Sword of Truth": "1", "Abandon Trilogy": "1", "The Vampirates": "1", "Silo": "1" }
{ "Raspberry Pi": "1" }
Dashboard
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCABaAFoDAREAAhEBAxEB/8QAHQAAAAcBAQEAAAAAAAAAAAAAAgMEBQYHCAEACf/EABoBAAIDAQEAAAAAAAAAAAAAAAIDAAEEBQb/2gAMAwEAAhADEAAAAdBg5RIpkJkzUBRiVpCympCEoXUKgkVYKh8vtzKQFnhufl1KAZ9E6YMoXdF1CiohZHyUUOnLBZlCnnKNm14/pFTF5UVKLuk1VxZGXeKEb4XSZli0CUyQiWve5yhEJdzPxBn1qt6ZNELWeV8PTApnm5Fi3uWPVf8A2ysfT58JDnp66E3I3dwtueuV0KtMlG/aYx5galIAajNaq+XcvW59Iak0Fvy6Y8j3KLx6kWpMe6WFwolYdNaU9z1AWybsW/8Ad5dSb8tn+M71b0xt0iUQCupNUHVhkbANMdKtuZX1MD75PsxiyQvBYoyih2hKV6EpiStsd3YFDhlLKs3i9Kv85w3o4gXatL2TdzOWPpbnTXmrOeuY9DNcPA62WGoejA94xbQlpxEKW8Rs/uwwYuYOu1Nx8bpR41JmxbLoWZ2+DpKMvy3wIdygublti1mlf//EACcQAAEDAwQCAgIDAAAAAAAAAAMBAgQABQYHEBESExQhIhUjFiQ0/9oACAEBAAEFAkptNqZNFAj37V57DRNX7kIuMZfDycGy0uzV2IcccWpmW+8/bG7wWx3cRUOJV2Va5pKRa1Jva1cDLJlxoKPYa2/rbHI41tE6NbV2VeK8rKRa5rIpKy8jt8dfP0ZUpPrjJACuoyoRnaldWqdxNAr+QzKRazG4mgWEEf1ASVaKgPaZsyWiEjqjHWG+hjh78orq1bTtGZG+pZDADynI33Eshi+K2yGSGEsBh0OArWRYzen5Bx6xbKEGrTNImqbe8BOyJmM9zWn+VJIajDNa9wZsolSZRoRY5S3OmAeByF4ZYsgfCdnk4dws6J8ZJM9u4E+znC8q+mPgYWjp0VlwDCEiRBI3xznIJo5CdRymOb6j6uQSBKrfkpUGYbkInLeYc9sZ4r2NxpdwD5T3Bksf2Re73oz3OmXIiTCr4WzJnsqGY4dGmorVXnbio8fsgovFPExqjczpebbGlilNJKkRsYItFxxiLMEEG8SEaQ6Ji90Mk61ybW+c3sESqg8pI5I2OCYluP8AabbU/ZcP91aRwY0pt8/rRoZXmPqWNqWZ+3//xAAqEQABAwMDBAEDBQAAAAAAAAABAAIRAxAxBBIhEyJRYSAFFEEjMDJCUv/aAAgBAwEBPwG4HKO1uVvb4RH5H7J7B7WbMMFRHHzot/sqnc5MpgZRog4RplpRz82jtATKZa7dZqczcERBu7hbrNBJ4VJm1nce5Gm4tkKJTJJgJogr6hp8PGbvwthQEqmzYPaetJqgP03p2ha87mKKWmZ7VDTmqOo/CrVupHpVqe4SEeE/C5VBv5tUO0SqlRruQqdepIEr706d0hkp2s1GoHeYHpU27ApTmh4VRpbwbUmw20A5XSb4XTa3CiUAgnOgSVKeQeCumgeLTBvIGUK7SnVWeV1GPEI7h/EouOCusU0rcqtaeAman/SfqAB2ouLs2hNwpTrTCdLjytiLPCE3FijcI5s7NmpmUeF5v//EACYRAAICAQQBBAIDAAAAAAAAAAABAhEDEBIhMRMEIkFRIGEwQlL/2gAIAQIBAT8B1brsW6X6NsvsT+H/AAr3PWS4FyvwvVkerJ5GnQs/+hSTVi6/Oc0lyZMiqi5XySl9kJyhKvgTvVKypaSkoK2ZckciuHwY1KTsb2cnjtWym5UKcccY7hc6Yu9G0lZky+SVfBircKsffQ1fTLhBEcG53I9X7qVmDK8ftl0J2Yu9PVS6iJ8mKLk6Rjg4qmSxwXuaMKg+UZM218GbJuFAhuxM9PNT5RX7M0t02yPQpbOjzSPI5umxS2OxtbrGlJGNW9o40Y4u1JHlGqZ+iMd0Rppivs2t9IeB8EcckqaFilGe4VfJFKzwL6Jw9x47dIxYthPCpEcDvk61qyiAnwVfJGl1pj27veZ/H/XVaUj4F0fR9i6Y+/w+HqxH/8QANhAAAgECBAMGAwUJAAAAAAAAAQIAAxEEEiExECJBEyMyUWGRBXLBIEJSobEUMDRDYnFzgfD/2gAIAQEABj8C4tWrNkRY1PAUwVH35etSSonkJeictUeKmdx+4apUYJTUXJMXCYZz2P6/99OOHxNNrWazDzESoNmF/t0fhVJ7Zu8rf26CMd+kLs4CjeB6fMDFpqpLk2AmFov40pKp9uO88a+/H4lWR2rJmNqje0uy3HnPpALWEw+IdLsh36iBlNweOAak2hDae06e3CucN/EVO7T0v1nZ1mvWdrtBlHKPKFWN7xFXUdYrDeJh6zhSfDLg3HDAH+pvpBzflC7nKo6zJTYpRXaXuc1+sNPTtbZWDb/6l0yvOdLMR4zpkhfMxpqNG8/WIw6LadhiH7s7E9JdWDD0mC/yH9INDEoKbdTDed4bWmcV0RvQyy4ouNr5Yvb3rdV8ozMBRTYKIQXz6W0hHUTQ3QbgzA1aZv3304VLeFNJaHML2nhnp6TL/MUcpmVhzDeFBy2iv5Q22MNCv58s02hzfe1jS34hwZYc7aLKpPKCdIr0nIcdVhBnKTApGo2MW19otMG2lzMxOgg5cvDTxH7F+AzEKPOLzdIalYaqNxGC5nF+VYGxT/s6/h3aE0XNVPzEypU7R+thYDjyUXqfKt5yfD69vVLQJiaJpE7XhAij0jgMQLeczhFz38VtYQdRK0r/ADnhi3rYelVdWFmdASInY91v4NJ3jF/mN5hTlF8w6cf/xAAlEAEAAgEDBAICAwAAAAAAAAABABEhMUFREGFxgZGhsfDB0fH/2gAIAQEAAT8hEy5lr3+YO8WV37HeInGrb+0/FeYQsTMMP/yoMToPUHxNp6JgjHCuUxTd9uPHdNejkgFrFuYpuOfCXKIsxS0conFhft/ov0S42FH1NZt7WvMzfoMb8JAO3KZV0JzgI7gGKLD1ezP870sZXADtDR9YO0VaLg7oDiit9savvBIYUHI9kpwaxNIi+jjwNVpFm0cEHfQblg/C4aWIqbxEg9NvCNnFXGH5lGnFjs1/CZxYq8e5WoJok7s8XF+o2PoQC0dqxLPkobvdiWU0lZmIC/UhypVl2RhUZpcLyuWRYjufFxDMHIcOdSEHmB8gUgwq4ywtqhlaRxKAhLpqr3KdtA1q7QKeZFL+iJlxWDr5qEmcamcESBctPrSVGOClAcBBRsaCnEpypl0bmUwpnS9f3I3nQQ7BmZlg9QnA2c2qA2rYG2o/1wDSYCpLV58x7YcGUFXuRqlwbaXtGzK9jUYnRbymSMzK4UZ7wMWXAEJEyjULxDLvm3E4vasVwkCfbxNBQ7MbyvIx6wKVKBQ0ktT0XmYwKcSl1xxLV50V2sCWjXiC7qMW41B1BKZjr7zdTXEtojDtxtRKIkzXL629xk7NH9madNyTsM79DLCA1wn4Qu9wY/cPV18nxN2EtdoT6m1okivQ2IFvcPKTDCXS00Z+056CISxSbKYmF3fh9pQh+G/KBQRkMtJkQ0n/2gAMAwEAAgADAAAAEAWb0xDzy1PUUMrqoFz2MsTGXpSPPAfu7CTbrZ2wv37U7XCyDHnFcg7MtUDMymvRCS+uaPMtb//EACQRAQEBAQACAwABBAMAAAAAAAEAESEQMUFRYaFxgZGxwdHw/9oACAEDAQE/EDd8YEjgh9pteMHNNLLk2/dhZpdgXhN/VY6fHNfTOnhl+ePfjVUepOZGaj/334cVMuk2XxJcs54QCZzZQozIa7aIe58n3ZMsb55qAvuP8Sg+FwRbgNmbbZ+jp/zZnufBp2RYR6fKWAn2WgH9dtoGP6WPnVJOC1F/3/1GgdTj+v2QfNwVj4E3Ar878j0+hstcT1M7BBw18bs0Nb44iwO7ODLbMzGWH+z9M8npPpxYtNnlsDsk+fUOhyx9xFqHInJfrIy+742+OydVwn3uTkT/AAhVMkxMmgu5Yc2zLk14RElD0tKusxqg2UQzDYC6OS9YcfR/tddeXLal7M8HWBO/EHLqX9/i9r5he3wS9EAcI668Bf/EACQRAQACAgEEAgIDAAAAAAAAAAEAESExQRBRYXGh8CDRkbHh/9oACAECAQE/EN4iUT3KF6Shf+pQ2fCLehm+m9xuWwJjU1Nm8HW6xsioTo5JvMBW5rBDcReWiUPNKAIQphUpRxLgIP4XbcxLFyamIuZiP7yzPJgltxWEnqVWpUzO1LrUeLiUuh0tyxhVX9qNrZxATyljKuI9Oh0hVYYiWiM3Bx38xYXVSzYz57XBzKmNxtdcy0xXxCLhEY5HPaEMMrvFLa/uehjGG5bShGUSshb8iAvBEAzZdMVEW4hvHP7mQJ9PrCMcEQWjgvVzOZiJAqDTuWlphG2OgKWKrYBHEMNff4juumOAhbTjpoBBEo7oEpmNAJ5lOEsLEJgbizdviHm1qFGGUrd9EJR4IAKOuTDEAVBSMAGIld0BiMwc1GKDEdAQvjXTzNsxzhIWQQgNLYKYR3BzeZtj0Nxwh2YuoaIQICif/8QAJRABAAICAgMAAgIDAQAAAAAAAQARITFBUWFxgZGhscHR4fAQ/9oACAEBAAE/ELnOb8VLLC+4AMfQljNiC1WA5Va/oWIY9YKZ5Fnp7I/88I19LfiRjXxqk8H/AHtlLzT7GEVXEyNr1mXmPcd/6lRgYaFnbeoyYV1SMvl9ZZYXEAu+mHIBQ7O8ylmoFTsUUAJ+/kurN98AfzNpN9lMW+w8xBJPM/n/AHKoIvb6qAKwQG7S39qrz07R68qwKx9t+xZSACDw8oIJVbYsX4D1HYKtWgA7VI2F3/b++BmB61GfUEUoILdv/HM6WBFv14lIoCUEghegI+DRLFCuGDa/WNwimfVGS9wIAq1L0eJW+oApwfJ3D+BIWh9bilvHRUBETHiJUZPbt5Vy1AgjDkQf4hlrE8RsCYO20PJcdNMFXaBGBRk2ZX3AWQhiCttRR+24wcU4efcSsQhzAxi/HPsiclRxyoQ8BgRexXRn+YDAC02MW6p9dQrO0vvKRDGcWfEa2Z8AS7P2mus3LwcR7D27pv7KI16QpOQ17KvzUfeEtPQVlu+GzWa8x6sAlZNaGrwbuKfNBGyxwNfgiz9sJaL0a/UVQhhC4z0/qW9nDhO7JWwR+0P9S8vQX6S91j9HX2Jct3ZenF5jwlSCwBdslW7jQMwS/M3EuQ0aUwLFaxD+cD3O0dp0nUwr+aBvYpnOG24MWmoCXQNJcwIcBwps/Z+4+lgsc7PEGKWylrcJxqbQLoi0NmDTsr7E6aIt+Zm6QhYO2JVPaCwwrkQwXhfJ3Mn6Ajrl5ubhgGjbZ3CD5eDk4tldkAESLWxw/wCYzgpGk9wOmoPDmvjEAths5OGBIZl3li4AYowPcLouY17QwISqHnTKVShpMeZl5Jxad438lKN0Pj7EBcpsrsKsYAQUNcnl8QKlFxZL7HFFAdQJINjsrEUxaTS+AHwfzLLV4gB6JYkndtjwXJdqMjasstI1Qq3Lb4iHF+oMylwQ6gS38DAAgmRIA5KIJzjvgXlnEyN3OlqAc1XECJ+gVPIwfKx1ApBaQfujAmW9fSjtUFt4qEvgLVjodp/+AwxFZDL7WUE9FEHQpOvzECLin5iGyawcCMtBtgPeIwAqUF6aWkAwZldmNYYSwQIWhnBABGD+9/4EPdMt0QR6jXFGw2Uq4TIvtA/Zhv2AgC2LgEvOeY0GeJ//2Q==
<pre>/* add custom extensions by tagging your stylesheet [[$:/tags/FontAwesome]]. * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: local("FontAwesome"), url(data:application/font-woff;base64,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) format("woff"); font-weight: normal; font-style: normal; } .fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} <$list filter="[tag[$:/tags/FontAwesome]]"> <$transclude> </$list> </pre>
The following tiddlers were imported: # [[About this site]]
<$reveal state="$:/state/sidebar" type="nomatch" text="no"> <$button set="$:/state/sidebar" setTo="no" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-right}}</$button> </$reveal> <$reveal state="$:/state/sidebar" type="match" text="no"> <$button set="$:/state/sidebar" setTo="yes" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class="tc-btn-invisible">{{$:/core/images/chevron-left}}</$button> </$reveal>
<script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-57593504-4', 'auto'); ga('send', 'pageview'); </script>
no
\define inmysocksMobileMenusMakeState(MenuName) $:/state/Menu/$MenuName$/$(CurrentTiddler)$ \end \define inmysocksMobileMenusMakeParentState(MenuName) $:/state/Menu/$MenuName$/$(ParentTiddler)$ \end \define inmysocksMobileMenusEmptyMessage(MenuName MenuType) <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!normal_menu" text="""$MenuType$"""> <$tiddler tiddler={{$:/state/Menu/$MenuName$/current}}> <$button class='tc-btn-invisible'> {{$:/core/images/chevron-left}} ''<$view field=caption> <$view field=title/> </$view>'' <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=''/> </$button> </$tiddler> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents" text="""$MenuType$"""> <$button class='tc-btn-invisible'> {{$:/core/images/chevron-left}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=''/> </$button> <$link to={{$:/state/Menu/$MenuName$/current}}> ''<$view tiddler={{$:/state/Menu/$MenuName$/current}} field=caption><$view tiddler='$:/state/Menu/$MenuName$/current' field=text/></$view>'' </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective" text="""$MenuType$"""> <$button class='tc-btn-invisible'> {{$:/core/images/chevron-left}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=''/> </$button> <$link to={{$:/state/Menu/$MenuName$/current}}> ''<$view tiddler={{$:/state/Menu/$MenuName$/current}} field=caption><$view tiddler='$:/state/Menu/$MenuName$/current' field=text/></$view>'' </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical" text="""$MenuType$"""> <$button class='tc-btn-invisible'> {{$:/core/images/chevron-left}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=''/> </$button> <$link to={{$:/state/Menu/$MenuName$/current}}> ''<$view tiddler={{$:/state/Menu/$MenuName$/current}} field=caption><$view tiddler='$:/state/Menu/$MenuName$/current' field=text/></$view>'' </$link> <br> </$reveal> \end \define inmysocksMobileMenusEmptyMessage2ListItem(MenuName MenuType) <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!normal_menu" text=$MenuType$ tag=span> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<currentTiddler>>> {{$:/core/images/right-arrow}}<$view tiddler=<<currentTiddler>> field='caption'><$view tiddler=<<currentTiddler>> field='title'/></$view> <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents" text=$MenuType$> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<currentTiddler>>> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> <$link to=<<currentTiddler>>> <$view tiddler=<<currentTiddler>> field='caption'><$view tiddler=<<currentTiddler>> field='title'/></$view> </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective" text=$MenuType$> <$list filter='[tag{!!title}limit[1]]' variable=dummy emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<currentTiddler>>> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> </$list> <$link to=<<currentTiddler>>> <$view tiddler=<<currentTiddler>> field='caption'><$view tiddler=<<currentTiddler>> field='title'/></$view> </$link> <br> </$reveal> \end \define inmysocksMobileMenusEmptyMessage2(MenuName MenuType ListField) <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$reveal type='nomatch' state='$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical' text="""$MenuType$"""> <$list filter='[tag<CurrentTiddler>]'> <<inmysocksMobileMenusEmptyMessage2ListItem """$MenuName$""" """$MenuType$""">> </$list> </$reveal> <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical' text="""$MenuType$"""> <$set name=Filter value="""[prefix[$:/state/Menu/$MenuName$/]has[text]]-[[$:/state/Menu/$MenuName$/current]]"""> <$set name=TagsFilter value="""[!is[system]]+[tag{$:/state/Menu/$MenuName$/current}]"""> <$list filter=<<Filter>> emptyMessage=<<inmysocksMobileMenusHierarchicalEmptyMessage1 """$MenuName$""">>> <<inmysocksMobileMenusTemplateHierarchicalListMacro1 """$MenuName$""">> </$list> </$set> </$set> </$reveal> </$reveal> <$reveal type='nomatch' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$tiddler tiddler={{$:/state/Menu/$MenuName$/current}}> <$list filter='[list[!!$ListField$]]'> <<inmysocksMobileMenusEmptyMessage2ListItem """$MenuName$""" """$MenuType$""">> </$list> </$tiddler> </$reveal> \end \define inmysocksMobileMenusTemplateListItemTOCSelectiveIsSpecial(MenuName MenuType ListField) <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$list filter='[tag<ThisTiddler2>limit[1]]' variable=dummy emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<ThisTiddler2>>> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ThisTiddler2>>/> </$button> </$list> </$reveal> <$reveal type='nomatch' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$tiddler tiddler={{$:/state/Menu/$MenuName$/current}}> <$list filter='[list[!!$ListField$]limit[1]]' variable=dummy emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<ThisTiddler2>>> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ThisTiddler2>>/> </$button> </$list> </$tiddler> </$reveal> \end \define inmysocksMobileMenusTemplateListItem(MenuName MenuType ListField) <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!normal_menu" text=$MenuType$> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<ThisTiddler2>>> {{$:/core/images/right-arrow}}<$view tiddler=<<ThisTiddler2>> field='caption'><$view tiddler=<<ThisTiddler2>> field='title'/></$view> <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ThisTiddler2>>/> </$button> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents" text=$MenuType$> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<ThisTiddler2>>> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ThisTiddler2>>/> </$button> <$link to=<<ThisTiddler2>>> <$view tiddler=<<ThisTiddler2>> field='caption'><$view tiddler=<<ThisTiddler2>> field='title'/></$view> </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective" text=$MenuType$> <<inmysocksMobileMenusTemplateListItemTOCSelectiveIsSpecial """$MenuName$""" """$MenuType$""" """$ListField$""">> <$link to=<<ThisTiddler2>>> <$view tiddler=<<ThisTiddler2>> field='caption'><$view tiddler=<<ThisTiddler2>> field='title'/></$view> </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical" text=$MenuType$> <!--THIS PART HERE NEEDS TO BE DONE --> </$reveal> \end \define inmysocksMobileMenusTemplate(MenuName MenuType ListField) <$set name=CurrentTiddler value={{$:/state/Menu/$MenuName$/current}}> <$list filter='[text<CurrentTiddler>removeprefix[$:/state/Menu/$MenuName$/]]-[[current]]+[limit[1]]' variable=ParentTiddler emptyMessage=<<inmysocksMobileMenusEmptyMessage2 """$MenuName$""" """$MenuType$""" """$ListField$""">>> <$reveal type='nomatch' state='$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical' text="""$MenuType$"""> <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$list filter='[tag<CurrentTiddler>]' variable=ThisTiddler2> <<inmysocksMobileMenusTemplateListItem """$MenuName$""" """$MenuType$""" """$ListField$""">> </$list> </$reveal> <$reveal type='nomatch' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$tiddler tiddler={{$:/state/Menu/$MenuName$/current}}> <$list filter='[list[!!$ListField$]]' variable=ThisTiddler2> <<inmysocksMobileMenusTemplateListItem """$MenuName$""" """$MenuType$""" """$ListField$""">> </$list> </$tiddler> </$reveal> </$reveal> <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical' text="""$MenuType$"""> <$set name=Filter value="""[prefix[$:/state/Menu/$MenuName$/]has[text]]-[[$:/state/Menu/$MenuName$/current]]"""> <$set name=TagsFilter value="""[!is[system]]+[tag{$:/state/Menu/$MenuName$/current}]"""> <$list filter=<<Filter>> emptyMessage=<<inmysocksMobileMenusHierarchicalEmptyMessage1 """$MenuName$""">>> <<inmysocksMobileMenusTemplateHierarchicalListMacro1 """$MenuName$""">> </$list> </$set> </$set> </$reveal> </$list> </$set> \end \define inmysocksMobileMenusTemplateHierarchicalListMacro1(MenuName) <$list filter='[is[current]removeprefix[$:/state/Menu/$MenuName$/]]' variable=CurrentTag> <<inmysocksMobileMenusHierarchicalInnerMacro """$MenuName$""">> </$list> \end \define inmysocksMobileMenusHierarchicalInnerMacro(MenuName) <$set name=TagsFilter value='$(TagsFilter)$+[tag[$(CurrentTag)$]]'> <$set name=Filter value='$(Filter)$-[[$(currentTiddler)$]]'> <$list filter=<<Filter>> emptyMessage=<<inmysocksMobileMenusHierarchicalEmptyMessage2 """$MenuName$""">>> <<inmysocksMobileMenusTemplateHierarchicalListMacro1 """$MenuName$""">> </$list> </$set> </$set> \end \define inmysocksMobileMenusHierarchicalEmptyMessage2(MenuName) <$list filter=<<TagsFilter>>> <$list filter='$(TagsFilter)$+[tag[$(currentTiddler)$]]+[limit[1]]' variable=dummy emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<currentTiddler>>> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> </$list> <$link to=<<currentTiddler>>> <$view tiddler=<<currentTiddler>> field='caption'><$view tiddler=<<currentTiddler>> field='title'/></$view> </$link> <br> </$list> \end \define inmysocksMobileMenusHierarchicalEmptyMessage1(MenuName) <$list filter='[tag{$:/state/Menu/$MenuName$/current}]'> <$list filter='[tag{$:/state/Menu/$MenuName$/current}]+[tag<currentTiddler>]+[limit[1]]' variable=dummy emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$button class='tc-btn-invisible' set=<<inmysocksMobileMenusMakeState """$MenuName$""">> setTo=<<currentTiddler>>> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> </$list> <$link to=<<currentTiddler>>> <$view tiddler=<<currentTiddler>> field='caption'><$view tiddler=<<currentTiddler>> field='title'/></$view> </$link> <br> </$list> \end \define inmysocksMobileMenusRootListEntry(MenuName MenuType) <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!normal_menu" text=$MenuType$> <$button class='tc-btn-invisible' set='$:/state/Menu/$MenuName$/current' setTo={{!!title}}> {{$:/core/images/right-arrow}}<$view field='caption'><$view field='title'/></$view> <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents" text=$MenuType$> <$button class='tc-btn-invisible' set='$:/state/Menu/$MenuName$/current' setTo={{!!title}}> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> <$link> <$view field='caption'><$view field='title'/></$view> </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective" text=$MenuType$> <$list filter='[tag{!!title}limit[1]]' variable=dummy emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$button class='tc-btn-invisible' set='$:/state/Menu/$MenuName$/current' setTo={{!!title}}> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> </$list> <$link> <$view field='caption'><$view field='title'/></$view> </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical" text=$MenuType$> <$list filter='[tag{!!title}limit[1]]' variable=dummy emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$button class='tc-btn-invisible' set='$:/state/Menu/$MenuName$/current' setTo={{!!title}}> {{$:/core/images/right-arrow}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value={{!!title}}/> </$button> </$list> <$link> <$view field='caption'><$view field='title'/></$view> </$link> <br> </$reveal> \end \define MobileMenu(RootTag:"RootTag" MenuName:Menu MenuType:Menu MenuTitle:"" ShowSubtitle:no ShowBody:no ListField:"") <$reveal type=nomatch state="""$:/macros/inmysocks/MobileMenu!!include_title""" text="""$MenuTitle$"""> $MenuTitle$ </$reveal> <$reveal type='match' state='$:/state/Menu/$MenuName$/current' text=''> <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$list filter='[tag[$RootTag$]]'> <<inmysocksMobileMenusRootListEntry """$MenuName$""" """$MenuType$""">> </$list> </$reveal> <$reveal type='nomatch' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$list filter={{!!$ListField$}}> <<inmysocksMobileMenusRootListEntry """$MenuName$""" """$MenuType$""">> </$list> </$reveal> </$reveal> <$reveal type='nomatch' state='$:/state/Menu/$MenuName$/current' text=''> <$list filter='[is[system]prefix[$:/state/Menu/$MenuName$/]has[text]]-[[$:/state/Menu/$MenuName$/current]]+[limit[1]]' emptyMessage=<<inmysocksMobileMenusEmptyMessage """$MenuName$""" """$MenuType$""">>> </$list> <$list filter='[text{$:/state/Menu/$MenuName$/current}removeprefix[$:/state/Menu/$MenuName$/]]-[[current]]+[limit[1]]' variable=ParentTiddler> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!normal_menu" text=$MenuType$> <$button class='tc-btn-invisible' style='text-align:left'> {{$:/core/images/chevron-left}} ''<$view tiddler={{$:/state/Menu/$MenuName$/current}} field=caption><$view tiddler={{$:/state/Menu/$MenuName$/current}} field=title/></$view>'' <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ParentTiddler>>/> <$action-setfield $tiddler=<<inmysocksMobileMenusMakeParentState """$MenuName$""">> $value=''/> </$button> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents" text=$MenuType$> <$button class='tc-btn-invisible'> {{$:/core/images/chevron-left}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ParentTiddler>>/> <$action-setfield $tiddler=<<inmysocksMobileMenusMakeParentState """$MenuName$""">> $value=''/> </$button> <$link to={{$:/state/Menu/$MenuName$/current}}> ''<$view tiddler={{$:/state/Menu/$MenuName$/current}} field=caption><$view tiddler={{$:/state/Menu/$MenuName$/current}} field=title/></$view>'' </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective" text=$MenuType$> <$button class='tc-btn-invisible'> {{$:/core/images/chevron-left}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ParentTiddler>>/> <$action-setfield $tiddler=<<inmysocksMobileMenusMakeParentState """$MenuName$""">> $value=''/> </$button> <$link to={{$:/state/Menu/$MenuName$/current}}> ''<$view tiddler={{$:/state/Menu/$MenuName$/current}} field=caption><$view tiddler={{$:/state/Menu/$MenuName$/current}} field=title/></$view>'' </$link> <br> </$reveal> <$reveal type='match' state="$:/macros/inmysocks/MobileMenu!!table_of_contents_selective_hierarchical" text=$MenuType$> <$button class='tc-btn-invisible'> {{$:/core/images/chevron-left}} <$action-setfield $tiddler='$:/state/Menu/$MenuName$/current' $value=<<ParentTiddler>>/> <$action-setfield $tiddler=<<inmysocksMobileMenusMakeParentState """$MenuName$""">> $value=''/> </$button> <$link to={{$:/state/Menu/$MenuName$/current}}> ''<$view tiddler={{$:/state/Menu/$MenuName$/current}} field=caption><$view tiddler={{$:/state/Menu/$MenuName$/current}} field=title/></$view>'' </$link> <br> </$reveal> </$list> <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!include_subtitle' text=$ShowSubtitle$> <$transclude tiddler={{$:/state/Menu/$MenuName$/current}} field='subtitle' mode=block/> </$reveal> <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$list filter='[tag{$:/state/Menu/$MenuName$/current}limit[1]]' variable=ThisTiddler> <<inmysocksMobileMenusTemplate """$MenuName$""" """$MenuType$""" """$ListField$""">> </$list> </$reveal> <$reveal type='nomatch' state='$:/macros/inmysocks/MobileMenu!!empty_field' text="""$ListField$"""> <$tiddler tiddler={{$:/state/Menu/$MenuName$/current}}> <$list filter='[list[!!$ListField$]limit[1]]' variable=ThisTiddler> <<inmysocksMobileMenusTemplate """$MenuName$""" """$MenuType$""" """$ListField$""">> </$list> </$tiddler> </$reveal> <$reveal type='match' state='$:/macros/inmysocks/MobileMenu!!include_body' text=$ShowBody$> <$transclude tiddler={{$:/state/Menu/$MenuName$/current}} mode=block/> </$reveal> </$reveal> \end
\define twitterFollowButton(username) <iframe allowtransparency="true" frameborder="0" scrolling="no" src="//platform.twitter.com/widgets/follow_button.html?screen_name=$username$" style="width:300px; height:20px;"></iframe> \end
{ "tiddlers": { "RenderSitemap": { "created": "20150104141300000", "creator": "Jim", "extension": ".xml", "modified": "20150104141300000", "modifier": "Jim", "tags": "static $:/tags/Exporter", "title": "RenderSitemap", "type": "text/vnd.tiddlywiki", "text": "\\define renderContent()\n<$text text=<<sitemapentries filter:\"\"\"$(exportFilter)$\"\"\">>/>\n\\end\n<<renderContent>>" }, "sitemap": { "created": "20150104144500000", "creator": "Jim", "modified": "20150104144500000", "modifier": "Jim", "tags": "static", "title": "sitemap", "type": "text/vnd.tiddlywiki", "text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n`<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">`<$set name=\"exportFilter\" value=\"[!is[system]!tag[static]!title[Table of Contents]!sort[modifed]]\">\n{{RenderSitemap}}</$set>`</urlset>`" }, "sitemapentries.js": { "created": "20150104141600000", "creator": "Jim", "modified": "20150124151600000", "modifier": "Jim", "module-type": "macro", "tags": "static", "title": "sitemapentries.js", "type": "application/javascript", "text": "/*\\\nMacro to output tiddlers matching a filter to sitemap.xml entries.\nhttp://www.sitemaps.org/protocol.html\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n \nexports.name = \"sitemapentries\";\n\nexports.params = [\n\t{name: \"filter\"}\n];\n\nvar XML = {};\n\nXML.escapify = function(input) {\n\treturn input.replace(/</gm, \"<\").replace(/>/gm, \">\").replace(/&/gm, \"&\").replace(/\"/gm, \""\").replace(/'/gm, \"'\");\n};\n\nXML.twDateToWebDate = function(twDate) {\n\treturn $tw.utils.formatDateString(twDate, \"YYYY-0MM-0DD\");\n}\n\nXML.stringify = function(data) {\n\tvar x = \"\";\n data.forEach(function(element, index, array) {\n \tx += \"\\t<url>\\n\";\n\t\tvar server = $tw.wiki.getTiddlerText(\"sitemapserver\", \"\");\n\t\tif (server.slice(-1) !== \"/\") {\n\t\t\tserver += \"/\";\n\t\t}\n x += \"\\t\\t<loc>\" + server + element.title.replace(/ /g,\"%2520\") + \".html</loc>\\n\";\n\t\tif (element.modified) {\n\t\t x += \"\\t\\t<lastmod>\" + XML.twDateToWebDate($tw.utils.parseDate(element.modified)) + \"</lastmod>\\n\";\n\t\t}\n x += \"\\t\\t<changefreq>\";\n if(element.title.toLowerCase() === \"index\" || element.title.toLowerCase() === \"home\") {\n \tx += \"daily\";\n } else {\n \tx += \"weekly\";\n }\n x += \"</changefreq>\\n\"\n x += \"\\t\\t<priority>\";\n if(element.title.toLowerCase() === \"index\" || element.title.toLowerCase() === \"home\") {\n \tx += \"1.0\";\n } else if(element.title.toLowerCase() === \"siteindex\") {\n \tx += \"0.8\";\n } else {\n \tx += \"0.5\";\n }\n x += \"</priority>\\n\"\n\t x += \"\\t</url>\\n\";\n });\n return x;\n}\n\nexports.run = function(filter) {\n\tvar tiddlers = this.wiki.filterTiddlers(filter),\n\t\tdata = [];\n\tfor(var t=0; t < tiddlers.length; t++) {\n\t\tvar tiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = XML.escapify(tiddler.getFieldString(field));\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn XML.stringify(data);\n};\n\n})();\n" }, "sitemapserver": { "created": "20150104145100000", "creator": "Jim", "modified": "20150104145100000", "modifier": "Jim", "tags": "static", "title": "sitemapserver", "type": "text/vnd.tiddlywiki", "text": "http://ooktech.com/jed/externalbrain/" } } }
{ "tiddlers": { "$:/plugins/inmysocks/Calendar/Calendar Default Macros": { "created": "20150212024632244", "modified": "20150212042506838", "tags": "$:/tags/Macro", "title": "$:/plugins/inmysocks/Calendar/Calendar Default Macros", "text": "\\define CalendarListDailyThings(day)\n<$button class='tc-btn-invisible' style='width:100%;height:100%'>\n<$set name=Day value=$day$>\n<$set name=Month value={{!!month}}>\n<$set name=Year value={{!!year}}>\n<$set name=DateString value=<<CalendarMakeDateString>>>\n<$action-navigate $to=<<CalendarMakeDateString>>/>\n<div style='height:100%;width:100%;position:relative;text-align:left;vertical-align:top;z-index=0'>\n''$day$''<br>\n<$list filter='[has<DateString>]-[[$:/temp/MakeCalendarEntry]]'>\n<$view field='title'/><br>\n</$list>\n</div>\n</$set>\n</$set>\n</$set>\n</$set>\n</$button>\n\\end\n\n\\define CalendarMakeDateString()\n$(Day)$-$(Month)$-$(Year)$\n\\end" }, "$:/plugins/inmysocks/Calendar/Calendar Table Style": { "created": "20150212024632244", "modified": "20150212042506838", "tags": "$:/tags/Stylesheet", "title": "$:/plugins/inmysocks/Calendar/Calendar Table Style", "type": "text/css", "text": ".calendar-table {\n\tborder: 0px;\n overflow: hidden;\n vertical-align: top;\n width: 100%;\n}\n\n.calendar-table table {\n\twidth:100%;\n}\n\n.calendar-table td, th {\n width: 14%;\n vertical-align: top;\n}\n\n.calendar-table td {\n height: 100px;\n}" }, "$:/plugins/inmysocks/Calendar/readme": { "month": "1", "title": "$:/plugins/inmysocks/Calendar/readme", "year": "1990", "text": "To see this plugin in use you can see it on my page [[here|http://ooktech.com/jed/externalbrain/#Blog%20Archives]]\n\nThis plugin has:\n\n*The calendar-month widget\n*Default css class for the calendar month widget\n*Default macro for calendar days\n*This readme\n\n!The calendar-month widget\n\nUsage: `<$calendar-month year=YYYY month=MM day_macro=someMacro class=someCSSClass/>`\n\nContent of the `<$calendar-month>` widget is ignored.\n\n|!Attribute |!Description |\n|year |The year that the month displayed is from. It must be in 4 digit YYYY format and has no default value. |\n|month |The month to display. See list below for valid month values. month has no default value. |\n|day_macro |(optional) The macro that defines the content of each calendar day. It is passed the parameter `day` with the value of the current day of the month. Defaluts to `CalendarListDailyThings` defined in [[Calendar Default Macros|$:/plugins/inmysocks/Calendar/Calendar Default Macros]] |\n|class |(optional) A css class to use. Defaults to the class `calendar-table` defined in [[Calendar Table Style|$:/plugins/inmysocks/Calendar/Calendar Table Style]] |\n\n!The ~CalendarListDailyThings macro\n\nThis macro requires that the tiddler the calendar month widget is in has a field called `year` that contains the current year and a field called `month` that lists the current month. While these don't necessarily have to be numeric, they do need to be valid field names (no capital letters, no spaces, etc.).\n\nThis macro lists any tiddler that has a field named (day)-(month)-(year) with the appropriate day, month and year for that date in the calendar. Each calendar day is a button that when clicked will open the tiddler named (day)-(month)-(year) matching that day.\n\n!Month values\n\nThis is a complete list of the month values the widget understands, if you want some other format added leave a message at [[my site|http://www.inmysocks.tiddlyspot.com]].:\n\n1\n01\nJan\nJan.\nJanuary\n\n2\n02\nFeb\nFeb.\nFebruary\n\n3\n03\nMar\nMar.\nMarch\n\n4\n04\nApr\nApr.\nApril\n\n5\n05\nMay\n\n6\n06\nJun\nJun.\nJune\n\n7\n07\nJul\nJul.\nJuly\n\n8\n08\nAug\nAug.\nAugust\n\n9\n09\nSep\nSep.\nSept\nSept.\nSeptember\n\n10\nOct\nOct.\nOctober\n\n11\nNov\nNov.\nNovember\n\n12\nDec\nDec.\nDecember\n\n!Example:\n\n```\nSelect year: <$select field='year'><$list filter='1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000'><option><<currentTiddler>></option></$list></$select>\n\nSelect month: <$select field='month'><$list filter='1 2 3 4 5 6 7 8 9 10 11 12'><option><<currentTiddler>></option></$list></$select>\n\n<$calendar-month year={{!!year}} month={{!!month}}/>\n```\n\nSelect year: <$select field='year'><$list filter='1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000'><option><<currentTiddler>></option></$list></$select>\n\nSelect month: <$select field='month'><$list filter='1 2 3 4 5 6 7 8 9 10 11 12'><option><<currentTiddler>></option></$list></$select>\n\n<$calendar-month year={{!!year}} month={{!!month}}/>\n" }, "$:/plugins/inmysocks/Calendar/calendar-widget.js": { "text": "/*\\\ntitle: $:/plugins/inmysocks/Calendar/calendar-widget.js\ntype: application/javascript\nmodule-type: widget\n\nA widget that creates a calendar given a year and month.\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;\nvar widgets;\nvar container;\n\nvar Calendar = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCalendar.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCalendar.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar domNode = this.document.createElement(\"div\");\n\tparent.insertBefore(domNode,nextSibling);\n\tdomNode.className = this.CalendarCSS;\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCalendar.prototype.execute = function() {\n\t//Get widget attributes.\n\tvar thisMonth = this.getAttribute(\"month\",-1);\n\tvar thisYear = this.getAttribute(\"year\",-1);\n\tvar thisDayMacro = this.getAttribute(\"day_macro\",\"CalendarListDailyThings\");\n\tvar thisCalendarCSS = this.getAttribute(\"class\", \"calendar-table\");\n\n\tvar badYear;\n\tvar isLeap = 0;\n\tvar numDays;\n\tvar calendarString;\n\n\t//Check to make sure a 4 digit year was passed\n\tif(thisYear/1000 < 1 || thisYear === -1 || isNaN(parseFloat(thisYear))) {\n\t\tbadYear = 1;\n\t} else {\n\t\tbadYear = 0;\n\t}\n\n\t//If it is February, check if the current year is a leap year. Then get the number of days in the current month.\n\tif(thisMonth === \"2\" || thisMonth === \"02\" || thisMonth === \"Feb\" || thisMonth === \"Feb.\" || thisMonth === \"February\") {\n\t\tisLeap = ((((thisYear % 4) === 0) && (thisYear % 100 !== 0)) || (((thisYear % 100) === 0) && (thisYear % 400) === 0));\n\t}\n\tswitch (thisMonth){\n\t\tcase \"1\": numDays = 31; break;\n\t\tcase \"01\": numDays = 31; break;\n\t\tcase \"Jan\": numDays = 31; break;\n\t\tcase \"Jan.\": numDays = 31; break;\n\t\tcase \"January\": numDays = 31; break;\n\t\tcase \"2\": numDays = isLeap ? 29:28; break;\n\t\tcase \"02\": numDays = isLeap ? 29:28; break;\n\t\tcase \"Feb\": numDays = isLeap ? 29:28; break;\n\t\tcase \"Feb.\": numDays = isLeap ? 29:28; break;\n\t\tcase \"February\": numDays = isLeap ? 29:28; break;\n\t\tcase \"3\": numDays = 31; break;\n\t\tcase \"03\": numDays = 31; break;\n\t\tcase \"Mar\": numDays = 31; break;\n\t\tcase \"Mar.\": numDays = 31; break;\n\t\tcase \"March\": numDays = 31; break;\n\t\tcase \"4\": numDays = 30; break;\n\t\tcase \"04\": numDays = 30; break;\n\t\tcase \"Apr\": numDays = 30; break;\n\t\tcase \"Apr.\": numDays = 30; break;\n\t\tcase \"April\": numDays = 30; break;\n\t\tcase \"5\": numDays = 31; break;\n\t\tcase \"05\": numDays = 31; break;\n\t\tcase \"May\": numDays = 31; break;\n\t\tcase \"6\": numDays = 30; break;\n\t\tcase \"06\": numDays = 30; break;\n\t\tcase \"Jun\": numDays = 30; break;\n\t\tcase \"Jun.\": numDays = 30; break;\n\t\tcase \"June\": numDays = 30; break;\n\t\tcase \"7\": numDays = 31; break;\n\t\tcase \"07\": numDays = 31; break;\n\t\tcase \"Jul\": numDays = 31; break;\n\t\tcase \"Jul.\": numDays = 31; break;\n\t\tcase \"July\": numDays = 31; break;\n\t\tcase \"8\": numDays = 31; break;\n\t\tcase \"08\": numDays = 31; break;\n\t\tcase \"Aug\": numDays = 31; break;\n\t\tcase \"Aug.\": numDays = 31; break;\n\t\tcase \"August\": numDays = 31; break;\n\t\tcase \"9\": numDays = 30; break;\n\t\tcase \"09\": numDays = 30; break;\n\t\tcase \"Sep\": numDays = 30; break;\n\t\tcase \"Sep.\": numDays = 30; break;\n\t\tcase \"Sept\": numDays = 30; break;\n\t\tcase \"Sept.\": numDays = 30; break;\n\t\tcase \"September\": numDays = 30; break;\n\t\tcase \"10\": numDays = 31; break;\n\t\tcase \"Oct\": numDays = 31; break;\n\t\tcase \"Oct.\": numDays = 31; break;\n\t\tcase \"October\": numDays = 31; break;\n\t\tcase \"11\": numDays = 30; break;\n\t\tcase \"Nov\": numDays = 30; break;\n\t\tcase \"Nov.\": numDays = 30; break;\n\t\tcase \"November\": numDays = 30; break;\n\t\tcase \"12\": numDays = 31; break;\n\t\tcase \"Dec\": numDays = 31; break;\n\t\tcase \"Dec.\": numDays = 31; break;\n\t\tcase \"December\": numDays = 31; break;\n\t\tdefault: numDays = -1;\t\t\n\t}\n\n\tif(badYear === 1 || numDays === -1) {\n\t\t//If the input doesn't make sense give an error.\n\t\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",\"Invalid month or year. Years need to be 4 digits, months must be given as a numeric value from 1...12.\",{parseAsInline: false});\n \tvar parseTreeNodes = parser ? parser.tree : [];\n\t\tthis.CalendarCSS = thisCalendarCSS;\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.innerHTML = \"Invalid month or year. Years need to be 4 digits, see readme for accepted month names.\";\n\t} else {\n\t\t//Get the first of the month to base everything else off of.\n\t\tvar firstDate = new Date(thisYear,thisMonth-1,1);\n\t\tvar startingDay = firstDate.getDay();\n\t\tconsole.log(startingDay);\n\t\t\n\t\t//Make the first week, adding empty days to the front as needed.\n\t\tvar currentDate = 1;\n\t\tcalendarString = \"<table><tr><th>Sunday</th><th>Monday</th><th>Tuesday</th><th>Wednesday</th><th>Thursday</th><th>Friday</th><th>Saturday</th></tr>\";\n\t\twhile(currentDate <= numDays) {\n\t\t\tcalendarString = calendarString + \"<tr>\";\n\t\t\tfor(var i = 0; i < 7; i++) {\n\t\t\t\tif(currentDate === 1 && i < startingDay) {\n\t\t\t\t\tcalendarString = calendarString + \"<td></td>\";\n\t\t\t\t} else if(currentDate <= numDays) {\n\t\t\t\t\tcalendarString = calendarString + \"<td><$macrocall $name='\" + thisDayMacro + \"' day=\" + currentDate + \"/></td>\";\n\t\t\t\t\tcurrentDate++;\n\t\t\t\t} if(currentDate > numDays && i < 6) {\n\t\t\t\t\tcalendarString = calendarString + \"<td></td>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tcalendarString = calendarString + \"</tr>\";\n\t\t}\n\t\tcalendarString = calendarString + \"</table>\";\n\t}\n\n\tvar stringPassed = calendarString;\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",calendarString,{parseAsInline: false});\n var parseTreeNodes = parser ? parser.tree : [];\n\tthis.CalendarCSS = thisCalendarCSS;\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCalendar.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"month\"] || changedAttributes[\"year\"] || changedAttributes[\"day_macro\"] || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"calendar-month\"] = Calendar;\n\n})();", "title": "$:/plugins/inmysocks/Calendar/calendar-widget.js", "type": "application/javascript", "module-type": "widget" } } }
{ "tiddlers": { "$:/plugins/inmysocks/CategoryLists/CategoryLists": { "tags": "$:/tags/Macro", "title": "$:/plugins/inmysocks/CategoryLists/CategoryLists", "true": "True", "task": "Task", "event": "Event", "text": "\\define inmysocksCategoryListsMakeSubCategorySelect()\nSubcategory: <$select tiddler='$:/state/$(ListType)$List/SelectedSubCategory'>\n\t<option value=''>Show All</option>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(CurrentCategory)$/SubCategories]indexes[]]'>\n\t\t<$set name=CurrentSubCategory value=<<currentTiddler>>>\n\t\t\t<option><$view field='title'/></option>\n\t\t</$set>\n\t</$list>\n</$select>\n\\end\n\n\\define inmysocksCategoryListsMakeSubSubCategorySelect()\n<$list filter='[[$:/data/$(ListType)$ListCategories/$(CurrentCategory)$/SubCategories]indexes[]]'>\n\t<$list filter='[[$:/state/$(ListType)$List/SelectedSubCategory]text<currentTiddler>limit[1]]'>\n\t\tSubsubcategory:\n\t\t<$select tiddler='$:/state/$(ListType)$List/SelectedSubSubCategory'>\n\t\t\t<option value=''>Show All</option>\n\t\t\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(CurrentCategory)$/$(CurrentSubCategory)$/subsubcategories]indexes[]]'>\n\t\t\t\t<$set name=CurrentSubSubCategory value=<<currentTiddler>>>\n\t\t\t\t\t<option><$view field='title'/></option>\n\t\t\t\t</$set>\n\t\t\t</$list>\n\t\t</$select>\n\t</$list>\n</$list>\n\\end\n\n\\define inmysocksCategoryListsSelectCategorySearch()\nTag:\n<$select tiddler='$:/state/$(ListType)$List/search/SelectedTag'>\n\t<option value=''>Show All</option>\n\t<$list filter=\"\"\"[tag[$(Tag)$]!has[draft.of]tags[]sort[title]]-[[$(Tag)$]]-[[$(FinishedTag)$]]\"\"\">\n\t\t<option><$view field='title'/></option>\n\t</$list>\n</$select>\n\\end\n\n\\define inmysocksCategoryListsSearchTag()\ntag{$:/state/$(ListType)$List/search/SelectedTag}\n\\end\n\n\\define inmysocksCategoryListsExpandAllButton()\n<$button>Expand All\n\t<$list filter='[prefix[$:/state/$(ListType)$List/ShowCategory/]!text[show]]'>\n\t\t<$action-setfield $tiddler=<<currentTiddler>> text=show/>\n\t</$list>\n</$button>\n\\end\n\n\\define inmysocksCategoryListsCollapseAllButton()\n<$button>Collapse All\n\t<$list filter='[prefix[$:/state/$(ListType)$List/ShowCategory/]text[show]]'>\n\t\t<$action-setfield $tiddler=<<currentTiddler>> text=hide/>\n\t</$list>\n</$button>\n\\end\n\n\\define inmysocksCategoryListsMainBody()\n<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!true' text=$(ShowSearch)$>\n\tSearch: <$edit-text tiddler='$:/temp/$(ListType)$List/Search' field='search_text' placeholder='Title Search' class='tc-edit-texteditor'/>\n\n\tCategory:\n\t<$select tiddler='$:/state/$(ListType)$List/SelectedCategory'>\n\t\t<option value=''>Show All</option>\n\t\t<$list filter='[[$:/data/$(ListType)$ListCategories]indexes[]]'>\n\t\t\t<$set name=CurrentCategory value=<<currentTiddler>>>\n\t\t\t\t<option><$view field='title'/></option>\n\t\t\t</$set>\n\t\t</$list>\n\t</$select>\n\t<br>\n\t<$set name=CurrentCategory value={{$:/state/$(ListType)$List/SelectedCategory}}>\n\t\t<$reveal type='nomatch' state='$:/state/$(ListType)$List/SelectedCategory' text=''>\n\t\t\t<<inmysocksCategoryListsMakeSubCategorySelect>>\n\t\t</$reveal>\n\t\t<br>\n\t\t<$set name=CurrentSubCategory value={{$:/state/$(ListType)$List/SelectedSubCategory}}>\n\t\t\t<<inmysocksCategoryListsMakeSubSubCategorySelect>>\n\t\t</$set>\n\t</$set>\n\t<br>\n\t<<inmysocksCategoryListsSelectCategorySearch>>\n\n</$reveal>\n\n<<inmysocksCategoryListsExpandAllButton>> <<inmysocksCategoryListsCollapseAllButton>>\n\n<$reveal type='match' state='$:/state/$(ListType)$List/search/SelectedTag' text=''>\n\t<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!true' text=$(ShowFinished)$>\n\t\t<<tabs \"[[$:/plugins/inmysocks/CategoryLists/Unfinished Items]][[$:/plugins/inmysocks/CategoryLists/Finished Items]]\">>\n\t</$reveal>\n\t<$reveal type='nomatch' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!true' text=$(ShowFinished)$>\n\t\t<$transclude tiddler='$:/plugins/inmysocks/CategoryLists/Unfinished Items' mode=block/>\n\t</$reveal>\n</$reveal>\n<$reveal type='nomatch' state='$:/state/$(ListType)$List/search/SelectedTag' text=''>\n\t<$set name=SearchTag value=<<inmysocksCategoryListsSearchTag>>>\n\t\t<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!true' text=$(ShowFinished)$>\n\t\t\t<<tabs \"[[$:/plugins/inmysocks/CategoryLists/Unfinished Items]][[$:/plugins/inmysocks/CategoryLists/Finished Items]]\">>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!true' text=$(ShowFinished)$>\n\t\t\t<$transclude tiddler='$:/plugins/inmysocks/CategoryLists/Unfinished Items' mode=block/>\n\t\t</$reveal>\n\t</$set>\n</$reveal>\n\\end\n\n\\define CategoryList(Tag:\"Task\" FinishedTag:\"Done\" ListType:\"Task\" ShowAddItem:\"True\" ShowSearch:\"True\" ShowFinished:\"True\")\n<$set name=ListType value=$ListType$>\n\t<$set name=Tag value=\"\"\"$Tag$\"\"\">\n\t\t<$set name=FinishedTag value=\"\"\"$FinishedTag$\"\"\">\n\t\t\t<$set name=ShowSearch value=$ShowSearch$>\n\t\t\t\t<$set name=ShowFinished value=$ShowFinished$>\n\n\t\t\t\t\t<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!true' text=$ShowAddItem$>\n\t\t\t\t\t\t<$set name=Tag value=\"\"\"$Tag$\"\"\">\n\t\t\t\t\t\t\t<$button popup='$:/state/Items/MakeItemPopup'>\n\t\t\t\t\t\t\t\tNew $ListType$\n\t\t\t\t\t\t\t</$button>\n\t\t\t\t\t\t\t<$reveal type='popup' state='$:/state/Items/MakeItemPopup'>\n\t\t\t\t\t\t\t\t<div class='tc-popup-keep' style='border:solid;border-color:grey;border-width:1px;background-color:white;width:80vw;padding:1em'>\n\t\t\t\t\t\t\t\t\t<$transclude tiddler='$:/plugins/inmysocks/CategoryLists/Make Entry' mode=block/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</$reveal>\n\t\t\t\t\t\t</$set>\n\t\t\t\t\t</$reveal>\n\n\t\t\t\t\t<<inmysocksCategoryListsMainBody>>\n\n\t\t\t\t</$set>\n\t\t\t</$set>\n\t\t</$set>\n\t</$set>\n</$set>\n\\end" }, "$:/plugins/inmysocks/CategoryLists/EditEntryTemplate": { "tags": "Templates", "title": "$:/plugins/inmysocks/CategoryLists/EditEntryTemplate", "text": "\\define SelectSubcategory()\n<$select tiddler=<<currentTiddler>> field='subcategory'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(ThisCategory)$/SubCategories]indexes[]]'>\n\t\t<option>\n\t\t\t<$view tiddler=<<currentTiddler>> field=title/>\n\t\t</option>\n\t</$list>\n</$select>\n(<$button popup='$:/state/Edit$(ListType)$/AddSubcategoryPopup'>New Subcategory\n</$button>)\n<$reveal type=popup state='$:/state/Edit$(ListType)$/AddSubcategoryPopup'>\n\t<div class='tc-drop-down tc-popup-keep'>\n\t\tSubcategory Name:\n\t\t<$edit-text tiddler=\"$:/temp/Edit$(ListType)$\" field='new_subcategory_name' placeholder='New Subcategory Name'/> \n\t\t<$button>\n\t\t\tCreate Subcategory\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListCategories/$(ThisCategory)$/SubCategories' $index={{$:/temp/Edit$(ListType)$!!new_subcategory_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Edit$(ListType)$' $field='new_subcategory_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n\\end\n\n\\define SelectSubSubCategory()\n<$select tiddler=<<currentTiddler>> field='subsubcategory'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(ThisCategory)$/$(ThisSubCategory)$/subsubcategories]indexes[]]'>\n\t\t<option>\n\t\t\t<$view tiddler=<<currentTiddler>> field=title/>\n\t\t</option>\n\t</$list>\n</$select>\n(<$button popup='$:/state/Edit$(ListType)$/AddSubSubcategoryPopup'>New Subsubcategory\n</$button>)\n<$reveal type=popup state='$:/state/Edit$(ListType)$/AddSubSubcategoryPopup'>\n\t<div class='tc-drop-down tc-popup-keep'>\n\t\tSubsubcategory Name:\n\t\t<$edit-text tiddler='$:/state/Edit$(ListType)$' field='new_subsubcategory_name' placeholder='New Subsubcategory Name'/> \n\t\t<$button>\n\t\t\tCreate Subcategory\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListCategories/$(ThisCategory)$/$(ThisSubCategory)$/subsubcategories' $index={{$:/temp/Edit$(ListType)$!!new_subsubcategory_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/state/Edit$(ListType)$' $field='new_subsubcategory_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n\\end\n\n\\define thisSelectSubCategoryAndSubSubCategory()\n<$reveal type='nomatch' state='!!category' text=''>\n\t$(ListType)$ Subcategory:\n\t<<SelectSubcategory>>\n\t<br>\n\t<$reveal type='nomatch' state='!!subcategory' text=''>\n\t\t$(ListType)$ Subsubcategory:\n\t\t<<SelectSubSubCategory>>\n\t</$reveal>\n</$reveal>\n\\end\n\n\\define thisMainBody()\n<div mode=block>\n\n$(ListType)$ Name: ''__<$view field='title'/>__''\n\n$(ListType)$ Category: \n<$select tiddler=<<currentTiddler>> field='category'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories]indexes[]]'>\n\t\t<option>\n\t\t\t<$view tiddler=<<currentTiddler>> field=title/>\n\t\t</option>\n\t</$list>\n</$select>\n(<$button popup='$:/state/Edit$(ListType)$/AddCategoryPopup'>New Category</$button>)\n<$reveal type=popup state='$:/state/Edit$(ListType)$/AddCategoryPopup'>\n\t<div class='tc-drop-down tc-popup-keep' style='position:absolute'>\n\t\tCategory Name:\n\t\t<$edit-text tiddler=$:/temp/Edit$(ListType)$' field='new_category_name' placeholder='New Category Name'/> \n\t\t<$button>\n\t\t\tCreate Category\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListCategories' $index={{$:/temp/Edit$(ListType)$!!new_category_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Edit$(ListType)$' $field='new_category_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n<br>\n<$set name=ThisCategory value={{!!category}}>\n\t<$set name=ThisSubCategory value={{!!subcategory}}>\n\t\t<<thisSelectSubCategoryAndSubSubCategory>>\n\t</$set>\n</$set>\n\nShort Description: \n<$edit-text field='description' class='tc-edit-texteditor' placeholder='Short Description'/>\n\nDetails: \n<$edit-text field='text' class='tc-edit-texteditor' placeholder='Details'/>\n\n\nTags:\n\nAdd tag: <$select tiddler='$:/state/Edit$(ListType)$' field='selected_tag'>\n\t<$list filter='[[$:/data/$(ListType)$ListTags]indexes[]]'>\n\t\t<option>\n\t\t\t<<currentTiddler>>\n\t\t</option>\n\t</$list>\n</$select>\n<$fieldmangler tiddler=<<currentTiddler>>>\n\t<$button>Add Tag\n\t\t<$action-sendmessage $message='tm-add-tag' $param={{$:/state/Edit$(ListType)$!!selected_tag}}/>\n\t</$button>\n</$fieldmangler> (<$button popup='$:/state/Edit$(ListType)$/AddTagPopup'>New Tag</$button>)\n<$reveal type='popup' state='$:/state/Edit$(ListType)$/AddTagPopup'>\n\t<div class='tc-drop-down tc-popup-keep'>\n\t\tTag Name: <$edit-text tiddler='$:/temp/Edit$(ListType)$' field='new_tag_name' placeholder='New Tag Name'/>\n\t\t<$button>Create Tag\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListTags' $index={{$:/temp/Edit$(ListType)$!!new_tag_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Edit$(ListType)$' $field='new_tag_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n\nCurrent Tags:\n\n<$list filter='[is[current]tags[]]-[[$(Tag)$]]-[[$(FinishedTag)$]]' variable=ThisTag>\n<$fieldmangler tiddler=<<currentTiddler>>>\n<<ThisTag>> <$button>Remove<$action-sendmessage $message='tm-remove-tag' $param=<<ThisTag>>/></$button>\n</$fieldmangler><br>\n</$list>\n</div>\n\\end\n\n<<thisMainBody>>" }, "$:/plugins/inmysocks/CategoryLists/Finished Items": { "caption": "Finished Items", "tags": "", "title": "$:/plugins/inmysocks/CategoryLists/Finished Items", "text": "\\define thisListTemplate()\n<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!task' text=$(ListType)$ tag=tr>\n\t<td style=\"\"\"position:relative;width:5%;\"\"\">\n\t\t<$button class=\"\"\"tc-btn-invisible\"\"\" popup=\"\"\"$:/state/popup/$(ListType)$list/$(CurrentEntry)$\"\"\" tooltip='$(ListType)$ Info'>{{$:/core/images/info-button}}\n\t\t</$button>\n\t\t<<thisEntryPopup>>\n\t</td>\n\t<td style='width:5%;'>\n\t\t<$checkbox tiddler=<<CurrentEntry>> tag=\"\"\"$(FinishedTag)$\"\"\"/>\n\t</td>\n\t<td style=\"\"\"width:50%\"\"\">\n\t\t<$link to=<<CurrentEntry>>>\n\t\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"title\"\"\"/>\n\t\t</$link>\n\t</td>\n\t<td style=\"\"\"width:40%\"\"\">\n\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"description\"\"\"/>\n\t</td>\n\t<td style='position:relative;'>\n\t\t<$button class='tc-btn-invisible' tooltip='Edit $(ListType)$' popup=\"\"\"$:/state/Edit$(ListType)$/popup/$(CurrentEntry)$\"\"\">\n\t\t\t{{$:/core/images/edit-button}}\n\t\t</$button>\n\t</td>\n\t<td style=\"\"\"text-align:right;width:10%\"\"\">\n\t\t<$fieldmangler tiddler=<<CurrentEntry>>>\n\t\t\t<$button class='tc-btn-invisible' tooltip='Remove $(ListType)$'>{{$:/core/images/cancel-button}}\n\t\t\t\t<$action-sendmessage $message=\"\"\"tm-remove-tag\"\"\" $param=\"\"\"$(Tag)$\"\"\"/>\n\t\t\t\t<$action-sendmessage $message=\"\"\"tm-remove-tag\"\"\" $param=\"\"\"$(FinishedTag)$\"\"\"/>\n\t\t\t</$button>\n\t\t</$fieldmangler>\n\t</td>\n</$reveal>\n<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!event' text=$(ListType)$ tag=tr>\n\t<td style=\"\"\"position:relative;width:5%;\"\"\">\n\t\t<$button class=\"\"\"tc-btn-invisible\"\"\" popup=\"\"\"$:/state/popup/$(ListType)$list/$(CurrentEntry)$\"\"\" tooltip='$(ListType)$ Info'>{{$:/core/images/info-button}}\n\t\t</$button>\n\t\t<<thisEntryPopup>>\n\t</td>\n\t<td style='position:relative;'>\n\t\t<$button class='tc-btn-invisible' tooltip='Edit $(ListType)$' popup=\"\"\"$:/state/Edit$(ListType)$/popup/$(CurrentEntry)$\"\"\">\n\t\t\t{{$:/core/images/edit-button}}\n\t\t</$button>\n\t</td>\n\t<td style=\"\"\"width:50%\"\"\">\n\t\t<$link to=<<CurrentEntry>>>\n\t\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"title\"\"\"/>\n\t\t</$link>\n\t</td>\n\t<td style=\"\"\"width:40%\"\"\">\n\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"description\"\"\"/>\n\t</td>\n\t<td style=\"\"\"text-align:right;width:20%\"\"\">\n\t\t<$view tiddler=<<CurrentEntry>> field='start_day'/>/<$view tiddler=<<CurrentEntry>> field='start_month'/>/<$view tiddler=<<CurrentEntry>> field='start_year'/>\n\t</td>\n</$reveal>\n<tr>\n\t<td colspan=6 style='position:relative;top:100%'>\n\t\t<$reveal type='popup' state=\"\"\"$:/state/Edit$(ListType)$/popup/$(CurrentEntry)$\"\"\">\n\t\t\t<div class='tc-popup-keep' style='border:solid;border-color:grey;border-width:1px;background-color:white;max-width:800px;padding:1em;width:95vw;top:1em;position:absolute;max-width:700px;top:-1em'>\n\n\t\t\t\t<$tiddler tiddler=<<CurrentEntry>>>\n\n\t\t\t\t\t<$transclude tiddler='$:/plugins/inmysocks/CategoryLists/EditEntryTemplate' mode=block/>\n\n\t\t\t\t</$tiddler>\n\n\t\t\t</div>\n\t\t</$reveal>\n\t</td>\n</tr>\n\\end\n\n\\define thisEntryPopup()\n<$reveal type=\"\"\"popup\"\"\" state=\"\"\"$:/state/popup/$(ListType)$list/$(CurrentEntry)$\"\"\">\n\t<div class=\"\"\"tc-popup-keep tc-drop-down\"\"\">\n\n\t\t<$transclude tiddler=<<CurrentEntry>> mode=block/>\n\n\t</div>\n</$reveal>\n\\end\n\n\\define thisMakeShowCategoryButton()\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$]!text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$\"\"\" setTo=show>\n\t\t<div style='width:100%;text-align:left;position:absolute;'>\n\t\t\t{{$:/core/images/right-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;position:absolute;text-align:center;'>\n\t\t\t<$view tiddler=<<CurrentCategory>> field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;'>\n\t\t\t{{$:/core/images/left-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$]text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$\"\"\" setTo=hide>\n\t\t<div style='width:100%;text-align:left;position:absolute;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;position:absolute;text-align:center;'>\n\t\t\t<$view tiddler=<<CurrentCategory>> field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n\\end\n\n\\define thisMakeCurrentCategoryDisplayState()\n$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$\n\\end\n\n\\define thisMakeShowSubCategoryButton()\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$]!text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$\"\"\" setTo=show>\n\t\t<div style='width:100%;text-align:left;position:absolute'>\n\t\t\t{{$:/core/images/right-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;text-align:center;position:absolute'>\n\t\t\t<$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;position:relative;'>\n\t\t\t{{$:/core/images/left-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$]text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$\"\"\" setTo=hide>\n\t\t<div style='width:100%;text-align:left;position:absolute;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;text-align:center;position:absolute;'>\n\t\t\t<$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;position:relative;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n\\end\n\n\\define thisMakeCurrentSubCategoryDisplayState()\n$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$\n\\end\n\n\\define thisMakeShowSubSubCategoryButton()\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$]!text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;background-color:beige;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$\"\"\" setTo=show>\n\t\t<div style='width:100%;text-align:center;'>\n\t\t\t{{$:/core/images/right-arrow}} <$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> :<$view tiddler=\"\"\"$(CurrentSubSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> {{$:/core/images/left-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$]text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;background-color:beige;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$\"\"\" setTo=hide>\n\t\t<div style='width:100%;text-align:center;'>\n\t\t\t{{$:/core/images/down-arrow}} <$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> {{$:/core/images/down-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n\\end\n\n\\define thisMakeCurrentSubSubCategoryDisplayState()\n$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$\n\\end\n\n\\define thisMakeTable()\n<table style=\"\"\"position:relative;width:100%\"\"\">\n\t<$set name=CurrentCategory value='No Category'>\n\t\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]!has[category]!has[draft.of]limit[1]]\"\"\">\n\t\t\t<tr>\n\t\t\t\t<th colspan=6 style=\"\"\"background-color:grey\"\"\">\n\t\t\t\t\t<<thisMakeShowCategoryButton>>\n\t\t\t\t</th>\n\t\t\t</tr>\n\t\t</$list>\n\t\t<$list filter='[<thisMakeCurrentCategoryDisplayState>text[show]]'>\n\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]!has[category]!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t<<thisListTemplate>>\n\t\t\t</$list>\n\t\t</$list>\n\t</$set>\n\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]has[category]each[category]get[category]!has[draft.of]sort[title]]\"\"\" variable=\"\"\"CurrentCategory\"\"\">\n\t\t<tr style='width:100%;'>\n\t\t\t<th colspan=6 style=\"\"\"background-color:grey\"\"\">\n\t\t\t\t<<thisMakeShowCategoryButton>>\n\t\t\t</th>\n\t\t</tr>\n\t\t<$list filter='[<thisMakeCurrentCategoryDisplayState>text[show]]'>\n\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>!has[subcategory]!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t<<thisListTemplate>>\n\t\t\t</$list>\n\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>has[subcategory]each[subcategory]get[subcategory]!has[draft.of]sort[title]]\"\"\" variable=\"\"\"CurrentSubCategory\"\"\">\n\t\t\t\t<tr style='width:100%;position:relative;background-color:lightgrey'>\n\t\t\t\t\t<td colspan=2 style='width:10%'>\n\t\t\t\t\t</td>\n\t\t\t\t\t<th colspan=2 style=\"\"\"position:relative;width:80%;background-color:lightgrey\"\"\">\n\t\t\t\t\t\t<<thisMakeShowSubCategoryButton>>\n\t\t\t\t\t</th>\n\t\t\t\t\t<td colspan=2 style='width:10%'>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<$list filter='[<thisMakeCurrentSubCategoryDisplayState>text[show]]'>\n\t\t\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]!has[subsubcategory]category<CurrentCategory>subcategory<CurrentSubCategory>!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t\t\t<<thisListTemplate>>\n\t\t\t\t\t</$list>\n\t\t\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>subcategory<CurrentSubCategory>has[subsubcategory]each[subsubcategory]get[subsubcategory]!has[draft.of]sort[title]]\"\"\" variable=\"\"\"CurrentSubSubCategory\"\"\">\n\t\t\t\t\t\t<tr style='width:100%;background-color:beige'>\n\t\t\t\t\t\t\t<td colspan=2 style='width:10%;'>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<th colspan=2 style=\"\"\"position:relative;width:80%;background-color:beige;\"\"\">\n\t\t\t\t\t\t\t\t<<thisMakeShowSubSubCategoryButton>>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<td colspan=2 style='width:10%;'>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<$list filter='[<thisMakeCurrentSubSubCategoryDisplayState>text[show]]'>\n\t\t\t\t\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>subcategory<CurrentSubCategory>subsubcategory<CurrentSubSubCategory>!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t\t\t\t\t<<thisListTemplate>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t</$list>\n\t\t\t\t</$list>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n</table>\n\\end\n\n\\define thisMakeSelectedCategory()\ncategory[$(CurrentCategory)$]\n\\end\n\n\\define thisMakeSelectedSubCategory()\nsubcategory[$(CurrentSubCategory)$]\n\\end\n\n\\define thisMakeSelectedSubSubCategory()\nsubsubcategory[$(CurrentSubSubCategory)$]\n\\end\n\n\\define thisMainBody()\n<$set name=RegExpSearch value={{$:/temp/$(ListType)$List/Search!!search_text}}>\n\t<!-- Category Selected -->\n\t<$reveal type='nomatch' state='$:/state/$(ListType)$List/SelectedCategory' text=''>\n\t\t<!-- Subcategory Selected -->\n\t\t<$reveal type='nomatch' state='$:/state/$(ListType)$List/SelectedSubCategory' text=''>\n\t\t\t<!-- Subsubcategory Selected -->\n\t\t\t<$reveal type='nomatch' state='$:/state/$(ListType)$List/SelectedSubSubCategory' text=''>\n\t\t\t\t<$set name=CurrentCategory value={{$:/state/$(ListType)$List/SelectedCategory}}>\n\t\t\t\t\t<$set name=SelectedCategory value=<<thisMakeSelectedCategory>>>\n\t\t\t\t\t\t<$set name=CurrentSubCategory value={{$:/state/$(ListType)$List/SelectedSubCategory}}>\n\t\t\t\t\t\t\t<$set name=SelectedSubCategory value=<<thisMakeSelectedSubCategory>>>\n\t\t\t\t\t\t\t\t<$set name=CurrentSubSubCategory value={{$:/state/$(ListType)$List/SelectedSubSubCategory}}>\n\t\t\t\t\t\t\t\t\t<$set name=SelectedSubSubCategory value=<<thisMakeSelectedSubSubCategory>>>\n\t\t\t\t\t\t\t\t\t\t<<thisMakeTable>>\n\t\t\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t</$set>\n\t\t\t\t\t</$set>\n\t\t\t\t</$set>\n\t\t\t</$reveal>\n\t\t\t<!-- No Subsubcategory Selected -->\n\t\t\t<$reveal type='match' state='$:/state/$(ListType)$List/SelectedSubSubCategory' text=''>\n\t\t\t\t<$set name=CurrentCategory value={{$:/state/$(ListType)$List/SelectedCategory}}>\n\t\t\t\t\t<$set name=SelectedCategory value=<<thisMakeSelectedCategory>>>\n\t\t\t\t\t\t<$set name=CurrentSubCategory value={{$:/state/$(ListType)$List/SelectedSubCategory}}>\n\t\t\t\t\t\t\t<$set name=SelectedSubCategory value=<<thisMakeSelectedSubCategory>>>\n\t\t\t\t\t\t\t\t<<thisMakeTable>>\n\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t</$set>\n\t\t\t\t\t</$set>\n\t\t\t\t</$set>\n\t\t\t</$reveal>\n\t\t</$reveal>\n\t\t<!-- No Subcategory Selected -->\n\t\t<$reveal type='match' state='$:/state/$(ListType)$List/SelectedSubCategory' text=''>\n\t\t\t<$set name=CurrentCategory value={{$:/state/$(ListType)$List/SelectedCategory}}>\n\t\t\t\t<$set name=SelectedCategory value=<<thisMakeSelectedCategory>>>\n\t\t\t\t\t<<thisMakeTable>>\n\t\t\t\t</$set>\n\t\t\t</$set>\n\t\t</$reveal>\n\t</$reveal>\n\t<!-- No Selected Category -->\n\t<$reveal type='match' state='$:/state/$(ListType)$List/SelectedCategory' text=''>\n\t\t<<thisMakeTable>>\n\t</$reveal>\n</$set>\n\\end\n\n<<thisMainBody>>" }, "$:/plugins/inmysocks/CategoryLists/Make Entry": { "caption": "Make Entry", "tags": "", "title": "$:/plugins/inmysocks/CategoryLists/Make Entry", "text": "\\define CreateEntryButton()\n<$fieldmangler tiddler={{$:/temp/Make$(ListType)$!!task_name}}>\n\t<$button>Create $(ListType)$\n\t\t<$reveal type='nomatch' state='$:/temp/Make$(ListType)$!!category' text=''>\n\t\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=category $value={{$:/temp/Make$(ListType)$!!category}}/>\n\t\t\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(ThisCategory)$/SubCategories]indexes[]]'>\n\t\t\t\t<$list filter='[[$:/temp/Make$(ListType)$]has[category]subcategory<currentTiddler>limit[1]]'>\n\t\t\t\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=subcategory $value={{$:/temp/Make$(ListType)$!!subcategory}}/>\n\t\t\t\t\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(ThisCategory)$/$(ThisSubCategory)$/subsubcategories]indexes[]]'>\n\t\t\t\t\t\t<$list filter='[[$:/temp/Make$(ListType)$]has[subsubcategory]subsubcategory<currentTiddler>limit[1]]'>\n\t\t\t\t\t\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=subsubcategory $value={{$:/temp/Make$(ListType)$!!subsubcategory}}/>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t</$list>\n\t\t\t\t</$list>\n\t\t\t</$list>\n\t\t</$reveal>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=description $value={{$:/temp/Make$(ListType)$!!short_description}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=text $value={{$:/temp/Make$(ListType)$!!text}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=tags $value={{$:/temp/Make$(ListType)$!!tags}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=start_day $value={{$:/temp/Make$(ListType)$!!start_day}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=start_month $value={{$:/temp/Make$(ListType)$!!start_month}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=start_year $value={{$:/temp/Make$(ListType)$!!start_year}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=due_day $value={{$:/temp/Make$(ListType)$!!due_day}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=due_month $value={{$:/temp/Make$(ListType)$!!due_month}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=due_year $value={{$:/temp/Make$(ListType)$!!due_year}}/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=created_day $value=<<now 0DD>>/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=created_month $value=<<now 0MM>>/>\n\t\t<$action-setfield $tiddler={{$:/temp/Make$(ListType)$!!task_name}} $field=created_year $value=<<now YYYY>>/>\n\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field=short_description $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field=text $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field=task_name $value=''/>\n\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field=tags $value=''/>\n\t\t<$action-sendmessage $message=tm-add-tag $param=\"\"\"$(Tag)$\"\"\"/>\n\t</$button>\n</$fieldmangler>\n\\end\n\n\\define SelectSubcategory()\n<$select tiddler='$:/temp/Make$(ListType)$' field='subcategory'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(ThisCategory)$/SubCategories]indexes[]]'>\n\t\t<option>\n\t\t\t<$view tiddler=<<currentTiddler>> field=title/>\n\t\t</option>\n\t</$list>\n</$select>\n(<$button popup='$:/state/Make$(ListType)$/AddSubcategoryPopup'>New Subcategory\n</$button>)\n<$reveal type=popup state='$:/state/Make$(ListType)$/AddSubcategoryPopup'>\n\t<div class='tc-drop-down tc-popup-keep'>\n\t\tSubcategory Name:\n\t\t<$edit-text tiddler='$:/temp/Make$(ListType)$' field='new_subcategory_name' placeholder='New Subcategory Name'/> \n\t\t<$button>\n\t\t\tCreate Subcategory\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListCategories/$(ThisCategory)$/SubCategories' $index={{$:/temp/Make$(ListType)$!!new_subcategory_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field='new_subcategory_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n\\end\n\n\\define SelectSubSubCategory()\n<$select tiddler='$:/temp/Make$(ListType)$' field='subsubcategory'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(ThisCategory)$/$(ThisSubCategory)$/subsubcategories]indexes[]]'>\n\t\t<option>\n\t\t\t<$view tiddler=<<currentTiddler>> field=title/>\n\t\t</option>\n\t</$list>\n</$select>\n(<$button popup='$:/state/Make$(ListType)$/AddSubSubcategoryPopup'>New Subsubcategory\n</$button>)\n<$reveal type=popup state='$:/state/Make$(ListType)$/AddSubSubcategoryPopup'>\n\t<div class='tc-drop-down tc-popup-keep'>\n\t\tSubsubcategory Name:\n\t\t<$edit-text tiddler='$:/temp/Make$(ListType)$' field='new_subsubcategory_name' placeholder='New Subsubcategory Name'/> \n\t\t<$button>\n\t\t\tCreate Subsubcategory\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListCategories/$(ThisCategory)$/$(ThisSubCategory)$/subsubcategories' $index={{$:/temp/Make$(ListType)$!!new_subsubcategory_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field='new_subsubcategory_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n\\end\n\n\\define thisSelectSubCategoryAndSubSubCategory()\n<$reveal type='nomatch' state='$:/temp/Make$(ListType)$!!category' text=''>\n\t$(ListType)$ Subcategory:\n\t<<SelectSubcategory>>\n\t<br>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories/$(ThisCategory)$/SubCategories]indexes[]]'>\n\t\t<$reveal type='match' state='$:/temp/Make$(ListType)$!!subcategory' text=<<currentTiddler>>>\n\t\t\t$(ListType)$ Subsubcategory:\n\t\t\t<<SelectSubSubCategory>>\n\t\t</$reveal>\n\t</$list>\n</$reveal>\n\\end\n\n\\define thisSetStartDate()\nDay: <$select tiddler='$:/temp/Make$(ListType)$' field='start_day'><option value=''>--</option><$list filter='1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31'><option><<currentTiddler>></option></$list></$select>\nMonth: <$select tiddler='$:/temp/Make$(ListType)$' field='start_month'><option value=''>--</option><$list filter='1 2 3 4 5 6 7 8 9 10 11 12'><option><<currentTiddler>></option></$list></$select>\nYear: <$select tiddler='$:/temp/Make$(ListType)$' field='start_year'><option value=''>--</option><$list filter='2015 2016 2017 2018 2019 2020'><option><<currentTiddler>></option></$list></$select>\n\\end\n\n\\define thisSetDueDate()\nDay: <$select tiddler='$:/temp/Make$(ListType)$' field='due_day'><option value=''>--</option><$list filter='1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31'><option><<currentTiddler>></option></$list></$select>\nMonth: <$select tiddler='$:/temp/Make$(ListType)$' field='due_month'><option value=''>--</option><$list filter='1 2 3 4 5 6 7 8 9 10 11 12'><option><<currentTiddler>></option></$list></$select>\nYear: <$select tiddler='$:/temp/Make$(ListType)$' field='due_year'><option value=''>--</option><$list filter='2015 2016 2017 2018 2019 2020'><option><<currentTiddler>></option></$list></$select>\n\\end\n\n\\define thisMainBody()\n$(ListType)$ Name: <$edit-text tiddler='$:/temp/Make$(ListType)$' field='task_name' class='tc-edit-texteditor' placeholder='$(ListType)$ Name'/>\n\n$(ListType)$ Category: \n<$select tiddler='$:/temp/Make$(ListType)$' field='category'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/$(ListType)$ListCategories]indexes[]]'>\n\t\t<option>\n\t\t\t<$view tiddler=<<currentTiddler>> field=title/>\n\t\t</option>\n\t</$list>\n</$select>\n(<$button popup='$:/state/Make$(ListType)$/AddCategoryPopup'>New Category</$button>)\n<$reveal type=popup state='$:/state/Make$(ListType)$/AddCategoryPopup'>\n\t<div class='tc-drop-down tc-popup-keep'>\n\t\tCategory Name:\n\t\t<$edit-text tiddler='$:/temp/Make$(ListType)$' field='new_category_name' placeholder='New Category Name'/> \n\t\t<$button>\n\t\t\tCreate Category\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListCategories' $index={{$:/temp/Make$(ListType)$!!new_category_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field='new_category_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n<br>\n<$set name=ThisCategory value={{$:/temp/Make$(ListType)$!!category}}>\n\t<$set name=ThisSubCategory value={{$:/temp/Make$(ListType)$!!subcategory}}>\n\t\t<<thisSelectSubCategoryAndSubSubCategory>>\n\t</$set>\n</$set>\n\nShort Description: \n<$edit-text tiddler='$:/temp/Make$(ListType)$' field='short_description' class='tc-edit-texteditor' placeholder='Short Description'/>\n\nDetails: \n<$edit-text tiddler='$:/temp/Make$(ListType)$' field='text' class='tc-edit-texteditor' placeholder='Details'/>\n\nStart Date:<br>\n<<thisSetStartDate>>\n\nDue Date:<br>\n<<thisSetDueDate>>\n\nTags:\n\nAdd tag: <$select tiddler='$:/temp/Make$(ListType)$' field='selected_tag'>\n\t<$list filter='[[$:/data/$(ListType)$ListTags]indexes[]]'>\n\t\t<option>\n\t\t\t<<currentTiddler>>\n\t\t</option>\n\t</$list>\n</$select>\n<$fieldmangler tiddler='$:/temp/Make$(ListType)$'>\n\t<$button>Add Tag\n\t\t<$action-sendmessage $message='tm-add-tag' $param={{$:/temp/Make$(ListType)$!!selected_tag}}/>\n\t</$button>\n</$fieldmangler> (<$button popup='$:/state/Make$(ListType)$/AddTagPopup'>New Tag</$button>)\n<$reveal type='popup' state='$:/state/Make$(ListType)$/AddTagPopup'>\n\t<div class='tc-drop-down tc-popup-keep'>\n\t\tTag Name: <$edit-text tiddler='$:/temp/Make$(ListType)$' field='new_tag_name' placeholder='New Tag Name'/>\n\t\t<$button>Create Tag\n\t\t\t<$action-setfield $tiddler='$:/data/$(ListType)$ListTags' $index={{$:/temp/Make$(ListType)$!!new_tag_name}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/temp/Make$(ListType)$' $field='new_tag_name' $value=''/>\n\t\t</$button>\n\t</div>\n</$reveal>\n\nCurrent Tags:\n\n<$list filter='[[$:/temp/Make$(ListType)$]tags[]]'>\n<$fieldmangler tiddler='$:/temp/Make$(ListType)$'>\n<$view field='title'/> <$button>Remove<$action-sendmessage $message='tm-remove-tag' $param=<<currentTiddler>>/></$button>\n</$fieldmangler><br>\n</$list>\n\n<$set name=ThisCategory value={{$:/temp/Make$(ListType)$!!category}}>\n\t<$set name=ThisSubCategory value={{$:/temp/Make$(ListType)$!!subcategory}}>\n\t\t<$list filter='[{$:/temp/Make$(ListType)$!!task_name}has[title]]' emptyMessage=<<CreateEntryButton>>>\n\t\t\t''Your task has the same name as another tiddler, change the task name. You can edit tasks using the [[task editor]]''\n\t\t</$list>\n\t</$set>\n</$set>\n\\end\n\n<<thisMainBody>>" }, "$:/plugins/inmysocks/CategoryLists/Unfinished Items": { "caption": "Unfinished Items", "tags": "", "title": "$:/plugins/inmysocks/CategoryLists/Unfinished Items", "text": "\\define thisListTemplate()\n<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!task' text=$(ListType)$ tag=tr>\n\t<td style=\"\"\"position:relative;width:5%;\"\"\">\n\t\t<$button class=\"\"\"tc-btn-invisible\"\"\" popup=\"\"\"$:/state/popup/$(ListType)$list/$(CurrentEntry)$\"\"\" tooltip='$(ListType)$ Info'>{{$:/core/images/info-button}}\n\t\t</$button>\n\t\t<<thisEntryPopup>>\n\t</td>\n\t<td style='width:5%;'>\n\t\t<$checkbox tiddler=<<CurrentEntry>> tag=\"\"\"$(FinishedTag)$\"\"\"/>\n\t</td>\n\t<td style=\"\"\"width:50%\"\"\">\n\t\t<$link to=<<CurrentEntry>>>\n\t\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"title\"\"\"/>\n\t\t</$link>\n\t</td>\n\t<td style=\"\"\"width:40%\"\"\">\n\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"description\"\"\"/>\n\t</td>\n\t<td style='position:relative;'>\n\t\t<$button class='tc-btn-invisible' tooltip='Edit $(ListType)$' popup=\"\"\"$:/state/Edit$(ListType)$/popup/$(CurrentEntry)$\"\"\">\n\t\t\t{{$:/core/images/edit-button}}\n\t\t</$button>\n\t</td>\n\t<td style=\"\"\"text-align:right;width:10%\"\"\">\n\t\t<$fieldmangler tiddler=<<CurrentEntry>>>\n\t\t\t<$button class='tc-btn-invisible' tooltip='Remove $(ListType)$'>{{$:/core/images/cancel-button}}\n\t\t\t\t<$action-sendmessage $message=\"\"\"tm-remove-tag\"\"\" $param=\"\"\"$(Tag)$\"\"\"/>\n\t\t\t\t<$action-sendmessage $message=\"\"\"tm-remove-tag\"\"\" $param=\"\"\"$(FinishedTag)$\"\"\"/>\n\t\t\t</$button>\n\t\t</$fieldmangler>\n\t</td>\n</$reveal>\n<$reveal type='match' state='$:/plugins/inmysocks/CategoryLists/CategoryLists!!event' text=$(ListType)$ tag=tr>\n\t<td style=\"\"\"position:relative;width:5%;\"\"\">\n\t\t<$button class=\"\"\"tc-btn-invisible\"\"\" popup=\"\"\"$:/state/popup/$(ListType)$list/$(CurrentEntry)$\"\"\" tooltip='$(ListType)$ Info'>{{$:/core/images/info-button}}\n\t\t</$button>\n\t\t<<thisEntryPopup>>\n\t</td>\n\t<td style='position:relative;'>\n\t\t<$button class='tc-btn-invisible' tooltip='Edit $(ListType)$' popup=\"\"\"$:/state/Edit$(ListType)$/popup/$(CurrentEntry)$\"\"\">\n\t\t\t{{$:/core/images/edit-button}}\n\t\t</$button>\n\t</td>\n\t<td style=\"\"\"width:50%\"\"\">\n\t\t<$link to=<<CurrentEntry>>>\n\t\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"title\"\"\"/>\n\t\t</$link>\n\t</td>\n\t<td style=\"\"\"width:40%\"\"\">\n\t\t<$view tiddler=<<CurrentEntry>> field=\"\"\"description\"\"\"/>\n\t</td>\n\t<td style=\"\"\"text-align:right;width:20%\"\"\">\n\t\t<$view tiddler=<<CurrentEntry>> field='start_day'/>/<$view tiddler=<<CurrentEntry>> field='start_month'/>/<$view tiddler=<<CurrentEntry>> field='start_year'/>\n\t</td>\n</$reveal>\n<tr>\n\t<td colspan=6 style='position:relative;top:100%'>\n\t\t<$reveal type='popup' state=\"\"\"$:/state/Edit$(ListType)$/popup/$(CurrentEntry)$\"\"\">\n\t\t\t<div class='tc-popup-keep' style='border:solid;border-color:grey;border-width:1px;background-color:white;max-width:800px;padding:1em;width:95vw;top:1em;position:absolute;max-width:700px;top:-1em'>\n\n\t\t\t\t<$tiddler tiddler=<<CurrentEntry>>>\n\n\t\t\t\t\t<$transclude tiddler='$:/plugins/inmysocks/CategoryLists/EditEntryTemplate' mode=block/>\n\n\t\t\t\t</$tiddler>\n\n\t\t\t</div>\n\t\t</$reveal>\n\t</td>\n</tr>\n\\end\n\n\\define thisEntryPopup()\n<$reveal type=\"\"\"popup\"\"\" state=\"\"\"$:/state/popup/$(ListType)$list/$(CurrentEntry)$\"\"\">\n\t<div class=\"\"\"tc-popup-keep tc-drop-down\"\"\">\n\n\t\t<$transclude tiddler=<<CurrentEntry>> mode=block/>\n\n\t</div>\n</$reveal>\n\\end\n\n\\define thisMakeShowCategoryButton()\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$]!text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$\"\"\" setTo=show>\n\t\t<div style='width:100%;text-align:left;position:absolute;'>\n\t\t\t{{$:/core/images/right-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;position:absolute;text-align:center;'>\n\t\t\t<$view tiddler=<<CurrentCategory>> field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;'>\n\t\t\t{{$:/core/images/left-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$]text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$\"\"\" setTo=hide>\n\t\t<div style='width:100%;text-align:left;position:absolute;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;position:absolute;text-align:center;'>\n\t\t\t<$view tiddler=<<CurrentCategory>> field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n\\end\n\n\\define thisMakeCurrentCategoryDisplayState()\n$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$\n\\end\n\n\\define thisMakeShowSubCategoryButton()\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$]!text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$\"\"\" setTo=show>\n\t\t<div style='width:100%;text-align:left;position:absolute'>\n\t\t\t{{$:/core/images/right-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;text-align:center;position:absolute'>\n\t\t\t<$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;position:relative;'>\n\t\t\t{{$:/core/images/left-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$]text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$\"\"\" setTo=hide>\n\t\t<div style='width:100%;text-align:left;position:absolute;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t\t<div style='width:100%;text-align:center;position:absolute;'>\n\t\t\t<$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/>\n\t\t</div>\n\t\t<div style='width:100%;text-align:right;position:relative;'>\n\t\t\t{{$:/core/images/down-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n\\end\n\n\\define thisMakeCurrentSubCategoryDisplayState()\n$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$\n\\end\n\n\\define thisMakeShowSubSubCategoryButton()\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$]!text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;background-color:beige;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$\"\"\" setTo=show>\n\t\t<div style='width:100%;text-align:center;'>\n\t\t\t{{$:/core/images/right-arrow}} <$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> :<$view tiddler=\"\"\"$(CurrentSubSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> {{$:/core/images/left-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n<$list filter='[[$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$]text[show]]'>\n\t<$button class='tc-btn-invisible' style='width:100%;height:100%;position:relative;background-color:beige;' set=\"\"\"$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$\"\"\" setTo=hide>\n\t\t<div style='width:100%;text-align:center;'>\n\t\t\t{{$:/core/images/down-arrow}} <$view tiddler=\"\"\"$(CurrentCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> : <$view tiddler=\"\"\"$(CurrentSubSubCategory)$\"\"\" field=\"\"\"title\"\"\"/> {{$:/core/images/down-arrow}}\n\t\t</div>\n\t</$button>\n</$list>\n\\end\n\n\\define thisMakeCurrentSubSubCategoryDisplayState()\n$:/state/$(ListType)$List/ShowCategory/$(CurrentCategory)$/$(CurrentSubCategory)$/$(CurrentSubSubCategory)$\n\\end\n\n\\define thisMakeTable()\n<table style=\"\"\"position:relative;width:100%\"\"\">\n\t<$set name=CurrentCategory value='No Category'>\n\t\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]!has[category]!has[draft.of]limit[1]]\"\"\">\n\t\t\t<tr>\n\t\t\t\t<th colspan=6 style=\"\"\"background-color:grey\"\"\">\n\t\t\t\t\t<<thisMakeShowCategoryButton>>\n\t\t\t\t</th>\n\t\t\t</tr>\n\t\t</$list>\n\t\t<$list filter='[<thisMakeCurrentCategoryDisplayState>text[show]]'>\n\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]!has[category]!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t<<thisListTemplate>>\n\t\t\t</$list>\n\t\t</$list>\n\t</$set>\n\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]has[category]each[category]get[category]!has[draft.of]sort[title]]\"\"\" variable=\"\"\"CurrentCategory\"\"\">\n\t\t<tr style='width:100%;'>\n\t\t\t<th colspan=6 style=\"\"\"background-color:grey\"\"\">\n\t\t\t\t<<thisMakeShowCategoryButton>>\n\t\t\t</th>\n\t\t</tr>\n\t\t<$list filter='[<thisMakeCurrentCategoryDisplayState>text[show]]'>\n\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>!has[subcategory]!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t<<thisListTemplate>>\n\t\t\t</$list>\n\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>has[subcategory]each[subcategory]get[subcategory]!has[draft.of]sort[title]]\"\"\" variable=\"\"\"CurrentSubCategory\"\"\">\n\t\t\t\t<tr style='width:100%;position:relative;background-color:lightgrey'>\n\t\t\t\t\t<td colspan=2 style='width:10%'>\n\t\t\t\t\t</td>\n\t\t\t\t\t<th colspan=2 style=\"\"\"position:relative;width:80%;background-color:lightgrey\"\"\">\n\t\t\t\t\t\t<<thisMakeShowSubCategoryButton>>\n\t\t\t\t\t</th>\n\t\t\t\t\t<td colspan=2 style='width:10%'>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<$list filter='[<thisMakeCurrentSubCategoryDisplayState>text[show]]'>\n\t\t\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]!has[subsubcategory]category<CurrentCategory>subcategory<CurrentSubCategory>!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t\t\t<<thisListTemplate>>\n\t\t\t\t\t</$list>\n\t\t\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>subcategory<CurrentSubCategory>has[subsubcategory]each[subsubcategory]get[subsubcategory]!has[draft.of]sort[title]]\"\"\" variable=\"\"\"CurrentSubSubCategory\"\"\">\n\t\t\t\t\t\t<tr style='width:100%;background-color:beige'>\n\t\t\t\t\t\t\t<td colspan=2 style='width:10%;'>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<th colspan=2 style=\"\"\"position:relative;width:80%;background-color:beige;\"\"\">\n\t\t\t\t\t\t\t\t<<thisMakeShowSubSubCategoryButton>>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<td colspan=2 style='width:10%;'>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<$list filter='[<thisMakeCurrentSubSubCategoryDisplayState>text[show]]'>\n\t\t\t\t\t\t\t<$list filter=\"\"\"[tag[$(Tag)$]!tag[$(FinishedTag)$]$(SearchTag)$$(SelectedCategory)$$(SelectedSubCategory)$$(SelectedSubSubCategory)$regexp[(?i)$(RegExpSearch)$]category<CurrentCategory>subcategory<CurrentSubCategory>subsubcategory<CurrentSubSubCategory>!has[draft.of]sort[title]]\"\"\" variable=CurrentEntry>\n\t\t\t\t\t\t\t\t<<thisListTemplate>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</$list>\n\t\t\t\t\t</$list>\n\t\t\t\t</$list>\n\t\t\t</$list>\n\t\t</$list>\n\t</$list>\n</table>\n\\end\n\n\\define thisMakeSelectedCategory()\ncategory[$(CurrentCategory)$]\n\\end\n\n\\define thisMakeSelectedSubCategory()\nsubcategory[$(CurrentSubCategory)$]\n\\end\n\n\\define thisMakeSelectedSubSubCategory()\nsubsubcategory[$(CurrentSubSubCategory)$]\n\\end\n\n\\define thisMainBody()\n<$set name=RegExpSearch value={{$:/temp/$(ListType)$List/Search!!search_text}}>\n\t<!-- Category Selected -->\n\t<$reveal type='nomatch' state='$:/state/$(ListType)$List/SelectedCategory' text=''>\n\t\t<!-- Subcategory Selected -->\n\t\t<$reveal type='nomatch' state='$:/state/$(ListType)$List/SelectedSubCategory' text=''>\n\t\t\t<!-- Subsubcategory Selected -->\n\t\t\t<$reveal type='nomatch' state='$:/state/$(ListType)$List/SelectedSubSubCategory' text=''>\n\t\t\t\t<$set name=CurrentCategory value={{$:/state/$(ListType)$List/SelectedCategory}}>\n\t\t\t\t\t<$set name=SelectedCategory value=<<thisMakeSelectedCategory>>>\n\t\t\t\t\t\t<$set name=CurrentSubCategory value={{$:/state/$(ListType)$List/SelectedSubCategory}}>\n\t\t\t\t\t\t\t<$set name=SelectedSubCategory value=<<thisMakeSelectedSubCategory>>>\n\t\t\t\t\t\t\t\t<$set name=CurrentSubSubCategory value={{$:/state/$(ListType)$List/SelectedSubSubCategory}}>\n\t\t\t\t\t\t\t\t\t<$set name=SelectedSubSubCategory value=<<thisMakeSelectedSubSubCategory>>>\n\t\t\t\t\t\t\t\t\t\t<<thisMakeTable>>\n\t\t\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t</$set>\n\t\t\t\t\t</$set>\n\t\t\t\t</$set>\n\t\t\t</$reveal>\n\t\t\t<!-- No Subsubcategory Selected -->\n\t\t\t<$reveal type='match' state='$:/state/$(ListType)$List/SelectedSubSubCategory' text=''>\n\t\t\t\t<$set name=CurrentCategory value={{$:/state/$(ListType)$List/SelectedCategory}}>\n\t\t\t\t\t<$set name=SelectedCategory value=<<thisMakeSelectedCategory>>>\n\t\t\t\t\t\t<$set name=CurrentSubCategory value={{$:/state/$(ListType)$List/SelectedSubCategory}}>\n\t\t\t\t\t\t\t<$set name=SelectedSubCategory value=<<thisMakeSelectedSubCategory>>>\n\t\t\t\t\t\t\t\t<<thisMakeTable>>\n\t\t\t\t\t\t\t</$set>\n\t\t\t\t\t\t</$set>\n\t\t\t\t\t</$set>\n\t\t\t\t</$set>\n\t\t\t</$reveal>\n\t\t</$reveal>\n\t\t<!-- No Subcategory Selected -->\n\t\t<$reveal type='match' state='$:/state/$(ListType)$List/SelectedSubCategory' text=''>\n\t\t\t<$set name=CurrentCategory value={{$:/state/$(ListType)$List/SelectedCategory}}>\n\t\t\t\t<$set name=SelectedCategory value=<<thisMakeSelectedCategory>>>\n\t\t\t\t\t<<thisMakeTable>>\n\t\t\t\t</$set>\n\t\t\t</$set>\n\t\t</$reveal>\n\t</$reveal>\n\t<!-- No Selected Category -->\n\t<$reveal type='match' state='$:/state/$(ListType)$List/SelectedCategory' text=''>\n\t\t<<thisMakeTable>>\n\t</$reveal>\n</$set>\n\\end\n\n<<thisMainBody>>" }, "$:/plugins/inmysocks/CategoryLists/readme": { "title": "$:/plugins/inmysocks/CategoryLists/readme", "text": "At the moment this is presented as a task list, but it can be used for other things. I am currently using it as an [[issue tracker and change log|http://inmysocks.tiddlyspot.com/#Change%20Log]] for the work I do with TiddlyWiki.\n\n__Description:__\n\nA list split into categories. You can see an example [[here|http://inmysocks.tiddlyspot.com/#Change%20Log]]. Clicking on a section title collapses that section, clicking on the {{$:/core/images/info-button}} icon gives information about the task, the checkbox marks the task as finished, the {{$:/core/images/edit-button}} lets you edit a task and the {{$:/core/images/cancel-button}} removes the task from the list, if you are using a task list.\n\n__Features:__\n\n*multiple independent lists are possibly by changing the `Tag` and `FinishedTag` parameters\n*task list or event list\n*collapsible categories\n*collapse all/expand all\n*searchable by title\n*searchable by category\n*searchable by tag\n*task creation interface\n*remove old entries (this just removes the tags that label it for the list, it doesn't delete the tiddler)\n*start dates\n*due dates*\n*task creation date*\n@@font-size:12px; *At the moment these values aren't used by the list, but I am planning on integrating the task list with my [[calendar plugin|http://inmysocks.tiddlyspot.com/#Calendar%20Plugin]] so that tasks entered on the list can be made to appear on the calendar. @@\n\n__Planned features:__\n\n*add sorting options\n*making more lists types (the display options will be different, there may not be other differences)\n*integration with the [[calendar plugin|http://inmysocks.tiddlyspot.com/#Calendar%20Plugin]]\n*searchable by due, start and creation dates\n*set events as finished once their date has passed\n*(possibly) allow an infinite number of nested categories, this may not be practical\n\n__Usage:__\n\n```\n<<CategoryList Tag:\"Task\" FinishedTag:\"Done\" ListType:\"Task\" ShowAddItem:\"True\" ShowSearch:\"True\" ShowFinished:\"True\">>\n```\n\n__Parameters:__\n\n|!Name |!Description |\n|~Tag |The tag used to indicate that a tiddler should be on the list (Default: Task) |\n|~FinishedTag |The tag added to finished tasks (Default: Done) |\n|~ListType |The type of list to make, options are Task and Event (Default:Task) |\n|~ShowAddItem |If this is set to anything other than `True` the `New Task` button doesn't appear. (Default: True) |\n|~ShowSearch |If this is set to anything other than `True` than the search interface is hidden. (Default: True) |\n|~ShowFinished |If this is set to anything other than `True` than the finished tasks/events are hidden. (Default: True) |\n\n__Notes:__\n\nIf you only want to have a single task list using the tags `Task` and `Done` than simply using `<<CategoryList>>` will work. If you want to have another list that is independent of the first list you can just put `<<CategoryList Tag:\"School Task\">>`. You can have as many lists as you want by changing the `TaskTag`, and if you want the `FinishedTag`." } } }
{ "tiddlers": { "Contents": { "caption": "Table of Contents", "created": "20140907171933267", "creator": "inmysocks", "list": "Dashboard [[What to do]] [[Wiki Examples]] [[Things to import to make everything work]] Contacts", "modified": "20141203194827582", "modifier": "inmysocks", "no_edit": "true", "tags": "$:/tags/SideBar", "title": "Contents", "text": "<div class='tc-table-of-contents'>\n<<toc-selective-expandable 'Contents' 'sort[list]'>>\n</div>" }, "Dashboard": { "created": "20141203190920779", "list-before": "", "modified": "20141210060635302", "no_edit": "true", "tags": "Contents", "title": "Dashboard", "text": "<<tabs \"DashboardTemplate [tag[Dashboard Tab]]\" DashboardTemplate>>" }, "DashboardTemplate": { "caption": "Main Dashboard", "created": "20141203194541067", "modified": "20141206183332945", "tags": "Templates", "title": "DashboardTemplate", "text": "<<toc-tabbed-internal-nav tag:\"Dashboard\" selectedTiddler:\"$:/temp/toc/selectedTiddler\" unselectedText:\"Select a topic in the table of contents. Click the arrow to expand a topic.\" default:\"Introduction\">>" }, "Introduction": { "created": "20141204203357041", "list-before": "", "modified": "20141204210324190", "no_edit": "true", "tags": "Dashboard", "title": "Introduction", "text": "!Welcome to ~TiddlyWiki!\n\n''If you just want to import functions into your own existing wiki go to http://inmysocks.tiddlyspot.com/#How%20to%20add%20to%20the%20Dashboard for instructions and a list of the available plugins''\n\n~TiddlyWiki is a personal organizer or personal wiki. This is a version designed specifically so that there is almost no learning required to use it. There will (hopefully) be versions that just accomplish individual tasks, such as a task list or contacts database. This wiki contains all of the available content for the no learning required versions.\n\n!!To get started\n\nIf you just want to get started working then you can click on one of the options to the left. Currently `Introduction` is highlighted to show that you are looking at the introduction tab. If you click on another option on the list than you will see the content for that option.\n\nCurrently the options are:\n\n*`Citation Library` - a simple citation database\n*`Contacts` - a contact database with a simple interface\n*`Create or Edit Tiddlers` - a simple interface for adding more tiddlers to this wiki\n*`Dictionary` - a searchable and editable dictionary\n*`Manage Table of Contents` - a TOC manager for tiddlywiki\n*`Minimal Task List` - a task list that just lists tasks and allows you to check them off when they are finished.\n*`Quick Notes` - a simple searchable notepad\n*`Task List` - a more advanced task list that has options for adding short descriptions, deadlines and a more detailed explanation to the task. On this list if you click on a task name it will open up the details you have given that task.\n\n!!What do these words mean?\n\nHere is a list of words and definitions related to this wiki that you may not be familiar with:\n\n*''Wiki'' - a user editable document. Wikipedia is probably the most famous example of a wiki. A wiki contains pages or articles that can link to each other to allow navigation through the different articles. What you are currently reading is an example of a wiki called ~TiddlyWiki\n*''Link'' - A link is a word or phrase that you can click on that will bring you to a new place or open up a new page. Links in this wiki are colored blue and when you hover over one it will become underlined. Clicking on links is one of the main ways to navigate this wiki.\n*''Tiddler'' - A single unit used by ~TiddlyWiki. Everything on this wiki is made up of tiddlers, and when you create something here it will be a tiddler. An article on wikipedia would be equivalent to a tiddler. But a tiddler can be significantly more than what is done on wikipedia. Don't worry too much about specifics if you don't want to, the important thing to know now is that when you open something on this wiki what you open is a tiddler. For examples and more explaination go to www.tiddlywiki.com\n*''~TiddlyWiki'' - ~TiddlyWiki is a program that can be used in many different ways, what you are reading right now is an example of a ~TiddlyWiki, but there are many more things that can be done with one. <!-- add history or something here -->\n\n!!If you want to get rid of this message\nIf you want to prevent this message from appearing anymore you can click on the button below. Once you do this than this message won't appear again, so make sure you understand the basics of how to use this wiki before you press it. \n\nIf you want this message to stay available than just click on one of the options to the left to get started using the wiki. If you click on the word `Introduction` than this message will appear again.\n\nClick the button down below that says `Don't show this again` and this message will no longer appear when you open your wiki.\n\n<$button message='tm-modal' param=RemoveIntroMessageModal>Don't show this again</$button>" }, "RemoveIntroMessageModal": { "created": "20141204205959063", "footer": "", "modified": "20141209213124307", "no_edit": "true", "subtitle": "Remove the Introduction?", "tags": "", "title": "RemoveIntroMessageModal", "text": "Are you sure you want to remove the introduction message? Even if you remove it here you can still view it by going to the `Table of Contents` tab and clicking on it there.\n\n<$fieldmangler tiddler=Introduction><$button><$action-sendmessage $message='tm-remove-tag' $param=Dashboard/><$action-sendmessage $message='tm-close-tiddler'/><$action-sendmessage $message='tm-delete-tiddler' $param='$:/temp/toc/selectedTiddler'/>Yes</$button></$fieldmangler> <$button message='tm-close-tiddler'>No</$button>" }, "Wiki Settings": { "created": "20141104204758595", "creator": "inmysocks", "modified": "20141206190532660", "modifier": "inmysocks", "no_edit": "true", "tags": "Contents", "title": "Wiki Settings", "text": "These tiddlers change the behavior or appearance of the other parts of the wiki.\n\n<$list filter=[tag[Wiki Settings]]>\n</$list>" } } }
{ "tiddlers": { "$:/.tb/macros/calc": { "created": "20150126131341956", "creator": "Tobias Beer", "modified": "20150211234300814", "modifier": "inmysocks", "module-type": "macro", "summary": "allows simple calculations based on tiddler fields", "tags": "[[Icon Menus]]", "title": "$:/.tb/macros/calc", "type": "application/javascript", "text": "/*\\\ntitle: $:/.tb/macros/calc.js\ntype: application/javascript\nmodule-type: macro\n\nComputes a (Field) value +,-,*,/ a provided value.\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 = \"calc\";\n\nexports.params = [\n\t{name: \"value\"},\n\t{name: \"operation\"},\n\t{name: \"until\"},\n\t{name: \"beyond\"},\n\t{name: \"decimals\"},\n\t{name: \"tiddler\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(value, operation, until, beyond, decimals, tiddler) {\n\tif(!value) {\n\t\treturn;\n\t}\n\tif(\"\" == operation){\n\t\toperation = \"0\";\n\t}\n\n\tvar \n\t\tcurr,dec,op,r,result,val,\n\t\tops = [\"+\",\"-\",\"*\",\"/\"];\n\n\tcurr = parseFloat(\n\t\t0 > value.indexOf('!!') ?\n\t\tvalue :\n\t\tthis.wiki.getTextReference(value, \"NaN\", tiddler || this.getVariable(\"currentTiddler\"))\n\t);\n\n\tuntil = parseFloat(until);\n\tdecimals = parseInt(decimals);\n\n\top = operation.charAt(0);\n\tval = parseFloat(0 > ops.indexOf(op) ? operation : operation.substr(1));\n\top = 0 > ops.indexOf(op) ? \"+\" : op;\n\n\tif(isNaN(curr)) {\n\t\tresult = \"NaN\";\n\t} else {\n\t\tswitch (op){\n\t\t\tcase \"-\": result = curr - val; break;\n\t\t\tcase \"*\": result = curr * val; break;\n\t\t\tcase \"/\": result = curr / val; break;\n\t\t\tcase \"+\":\n\t\t\tdefault: result = curr + val;\t\t\n\t\t}\n\t\tif(!isNaN(until)) {\n\t\t\tif (!(\n\t\t\t\t\"+\" == op || \"*\" == op ?\n\t\t\t\tresult <= until :\n\t\t\t\tresult >= until\n\t\t\t)) {\n\t\t\t\tif(\"true\" == beyond) {\n\t\t\t\t\tresult = true;\n\t\t\t\t} else {\n\t\t\t\t\tresult = until;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(beyond && result !== true) {\n\t\t\t\tresult = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif(!isNaN(result)){\n\t\tr = result.toString();\n\t\tdec = r.indexOf('.');\n\t\tif(dec > -1){\n\t\t\tdec = r.substr(dec).length;\n\t\t\tif(\n\t\t\t\t!isNaN(decimals) && dec > decimals ||\n\t\t\t\tisNaN(decimals) && dec > 2\n\t\t\t){\n\t\t\t\tresult = result.toFixed(isNaN(decimals) ? 2 : decimals);\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\treturn result;\n};\n\n})();\n" }, "$:/plugins/inmysocks/iconmenus/Bottom Bar Basic Style": { "caption": "Bottom Bar Basic Style", "created": "20150218055430633", "creator": "inmysocks", "modified": "20150218062317869", "modifier": "inmysocks", "tags": "[[Icon Menus]] [[Bottom Bar Style]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Bar Basic Style", "text": "html .tc-iconmenubottombar {\n display:block;\n width:100%;\n position:fixed;\n text-align:center;\n line-width:100%;\n left:0%;\n bottom: 0px;\n background-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_background_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_text_size}};\n border-top-style:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_border}};\n border-top-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_border_color}};\n height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n overflow: hidden;\n z-index: 70;\n} " }, "$:/plugins/inmysocks/iconmenus/Bottom Bar Pop Out on Hover Style": { "caption": "Bottom Bar Pop Out on Hover Style", "created": "20150218070608761", "creator": "inmysocks", "modified": "20150218072609780", "modifier": "inmysocks", "tags": "[[Icon Menus]] [[Bottom Bar Style]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Bar Pop Out on Hover Style", "text": "html .tc-iconmenubottombar {\n display:block;\n width:100%;\n position:fixed;\n text-align:center;\n line-width:100%;\n left:0%;\n bottom:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_hidden_size}};\n background-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_background_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_text_size}};\n border-top-style:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_border}};\n border-top-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_border_color}};\n height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n} \n\nhtml .tc-iconmenubottombar:hover {\n display:block;\n width:100%;\n position:fixed;\n text-align:center;\n line-width:100%;\n left:0%;\n bottom:0px;\n background-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_background_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_text_size}};\n border-top-style:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_border}};\n border-top-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_border_color}};\n height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n} " }, "$:/plugins/inmysocks/iconmenus/Bottom Bar Settings": { "caption": "Bottom Bar Settings", "created": "20150218062005015", "creator": "inmysocks", "modified": "20150218062133982", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Bar Settings", "text": "Bottom Bar Height: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_bar_height'/><br>\nAmount of Bottom Bar Hidden: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_bar_hidden_size'/> (Used for the pop out on hover style, this should be negative and Bottom Bar Height+Amount Hidden>0)<br>\nBottom Bar Background Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_bar_background_color'/><br>\nShow Bottom Bar Border: <$checkbox tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_bar_border' checked=solid unchecked=none/><br>\nBottom Bar Border Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_bar_border_color'/><br>\nBottom Bar Text Size: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_bar_text_size'/>" }, "$:/plugins/inmysocks/iconmenus/Bottom Left Menu Basic Style": { "caption": "Bottom Left Menu Basic Style", "created": "20150218060908174", "creator": "inmysocks", "modified": "20150218072638363", "modifier": "inmysocks", "tags": "[[Icon Menus]] [[Bottom Left Menu Style]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Left Menu Basic Style", "text": "html .tc-bottomleftmenu {\n display: block;\n padding: 0px 0px 0px 0px;\n position: absolute;\n left: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_left_menu_left_offset}};\n bottom: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_left_menu_vertical_offset}};\n z-index: 199;\n border-top-style: none;\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_left_menu_font_size}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_left_menu_text_color}};\n height: inherit;\n overflow: inherit;\n text-align: left;\n}" }, "$:/plugins/inmysocks/iconmenus/Bottom Left Menu Settings": { "caption": "Bottom Left Menu Settings", "created": "20150218063423349", "creator": "inmysocks", "modified": "20150218074017097", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Left Menu Settings", "text": "Vertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_left_menu_vertical_offset'/><br>\nLeft Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_left_menu_left_offset'/><br>\nFont Size <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_left_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_left_menu_text_color'/> \n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]nsort[bottom_left_menu_order]][plugintiddlers[]tag[Menu Icon]nsort[bottom_left_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/BottomLeftMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!bottom_left_menu_order\" setTo=<<calc !!bottom_left_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!bottom_left_menu_order\" setTo=<<calc !!bottom_left_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='bottom_left_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/plugins/inmysocks/iconmenus/Bottom Middle Menu Basic Style": { "caption": "Bottom Middle Menu Basic Style", "created": "20150218064331010", "creator": "inmysocks", "modified": "20150218065212654", "modifier": "inmysocks", "tags": "[[Icon Menus]] [[Bottom Middle Menu Style]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Middle Menu Basic Style", "text": "html .tc-bottomcentermenu {\n width: 100%;\n text-align: center;\n display: block;\n padding: 0px 0px 0px 0px;\n position: absolute;\n bottom: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_middle_menu_vertical_offset}};\n z-index: 99;\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_middle_menu_font_size}};\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_middle_menu_text_color}};\n line-height: inherit;\n height: inherit;\n overflow: inherit;\n}" }, "$:/plugins/inmysocks/iconmenus/Bottom Middle Menu Settings": { "caption": "Bottom Middle Menu Settings", "created": "20150218064443583", "creator": "inmysocks", "modified": "20150218065448341", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Middle Menu Settings", "text": "Vertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_middle_menu_vertical_offset'/><br>\nFont Size: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_middle_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_middle_menu_text_color'/><br>\n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]nsort[bottom_middle_menu_order]][plugintiddlers[]tag[Menu Icon]nsort[bottom_middle_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/BottomMiddleMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!bottom_middle_menu_order\" setTo=<<calc !!bottom_middle_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!bottom_middle_menu_order\" setTo=<<calc !!bottom_middle_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='bottom_middle_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/plugins/inmysocks/iconmenus/Bottom Right Menu Basic Style": { "caption": "Bottom Right Menu Basic Style", "created": "20150218065745731", "creator": "inmysocks", "modified": "20150218070226373", "modifier": "inmysocks", "tags": "[[Icon Menus]] [[Bottom Right Menu Style]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Right Menu Basic Style", "text": "html .tc-bottomrightmenu {\n display: block;\n padding: 0px 0px 0px 0px;\n position: absolute;\n right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_right_menu_right_offset}};\n bottom: inherit;\n z-index: 99;\n border-bottom-style: none;\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_right_menu_font_size}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_height}};\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_right_menu_text_color}};\n height: inherit;\n overflow: inherit;\n text-align: right;\n}\n" }, "$:/plugins/inmysocks/iconmenus/Bottom Right Menu Settings": { "caption": "Bottom Right Menu Settings", "created": "20150218065919970", "creator": "inmysocks", "modified": "20150218074153026", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Bottom Right Menu Settings", "text": "Vertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_right_menu_vertical_offset'/><br>\nRight Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_right_menu_right_offset'/><br>\nFont Size <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_right_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_right_menu_text_color'/>\n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]nsort[top_right_menu_order]][plugintiddlers[]tag[Menu Icon]nsort[top_right_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/BottomRightMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!bottom_right_menu_order\" setTo=<<calc !!bottom_right_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!bottom_right_menu_order\" setTo=<<calc !!bottom_right_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='bottom_right_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/plugins/inmysocks/iconmenus/BottomBar/menu": { "created": "20150218055034581", "creator": "inmysocks", "modified": "20150218072006520", "modifier": "inmysocks", "show_left": "show", "show_middle": "show", "show_right": "show", "tags": "[[Icon Menus]] $:/tags/PageTemplate", "title": "$:/plugins/inmysocks/iconmenus/BottomBar/menu", "text": "<div class=\"tc-iconmenubottombar tc-page-controls\">\n<$reveal type=match state='$:/plugins/inmysocks/iconmenus/BottomBar/menu!!show_left' text=show>\n<div class='tc-bottomleftmenu'>\n<$list filter='[tag[$:/tags/BottomLeftMenu]nsort[bottom_left_menu_order]]'><$transclude/></$list>\n</div>\n</$reveal>\n<$reveal type=match state='$:/plugins/inmysocks/iconmenus/BottomBar/menu!!show_middle' text=show>\n<div class='tc-bottomcentermenu'>\n<$list filter='[tag[$:/tags/BottomMiddleMenu]nsort[bottom_middle_menu_order]]'><$transclude/></$list>\n</div>\n</$reveal>\n<$reveal type=match state='$:/plugins/inmysocks/iconmenus/BottomBar/menu!!show_right' text=show>\n<div class='tc-bottomrightmenu'>\n<$list filter='[tag[$:/tags/BottomRightMenu]nsort[bottom_right_menu_order]]'><$transclude/></$list>\n</div>\n</$reveal>\n</div>\n" }, "$:/plugins/inmysocks/iconmenus/Icon Menu Settings": { "caption": "Icon Menu Settings", "created": "20150123193933540", "creator": "inmysocks", "modified": "20150218075309346", "modifier": "inmysocks", "tags": "$:/tags/ControlPanel [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Icon Menu Settings", "topbar_height": "2", "text": "\\define thisMakeTiddlerReference()\n\"\"\"{{$(TiddlerName)$}}\"\"\"\n\\end\n\n\\define thisMakeOption()\n<option value=<<thisMakeTiddlerReference <<TiddlerName>>>>><<currentTiddler>></option>\n\\end\n\n\\define thisTopBarStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_bar_style'>\n<$list filter='[tag[Top Bar Style]][plugintiddlers[]tag[Top Bar Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisTopLeftMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_left_menu_style'>\n<$list filter='[tag[Top Left Menu Style]][plugintiddlers[]tag[Top Left Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisTopRightMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_right_menu_style'>\n<$list filter='[tag[Top Right Menu Style]][plugintiddlers[]tag[Top Right Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisTopMiddleMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_middle_menu_style'>\n<$list filter='[tag[Top Middle Menu Style]][plugintiddlers[]tag[Top Middle Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisLeftMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_style'>\n<$list filter='[tag[Left Menu Style]][plugintiddlers[]tag[Left Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisRightMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_style'>\n<$list filter='[tag[Right Menu Style]][plugintiddlers[]tag[Right Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisBottomBarStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_bar_style'>\n<$list filter='[tag[Bottom Bar Style]][plugintiddlers[]tag[Bottom Bar Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisBottomLeftMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_left_menu_style'>\n<$list filter='[tag[Bottom Left Menu Style]][plugintiddlers[]tag[Bottom Left Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisBottomRightMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_right_menu_style'>\n<$list filter='[tag[Bottom Right Menu Style]][plugintiddlers[]tag[Bottom Right Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n\\define thisBottomMiddleMenuStyleSelector()\n<$select tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='bottom_middle_menu_style'>\n<$list filter='[tag[Bottom Middle Menu Style]][plugintiddlers[]tag[Bottom Middle Menu Style]]'>\n<$set name=TiddlerName value=<<currentTiddler>>>\n<option value=<<thisMakeTiddlerReference>>><$view field=caption/></option>\n</$set>\n</$list>\n</$select>\n\\end\n\n<$button>Set tiddler top position<$action-setfield $tiddler='$:/themes/tiddlywiki/vanilla/metrics/storytop' $field=text $value=\"\"\"{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}}\"\"\"/></$button> - This sets the position of the top of the story river to the bottom of the top bar. It isn't perfect, but it mostly works.\n\nToggle menus and set css styles, further custimization is available in the tabs below. \n\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/TopBar/menu' tag='$:/tags/TopRightBar'>Show Top Bar</$checkbox>|<<thisTopBarStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/leftmenu-icons' tag='$:/tags/PageTemplate'>Show Left Menu</$checkbox>|<<thisLeftMenuStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/rightmenu-icons' tag='$:/tags/PageTemplate'>Show Right Menu</$checkbox>|<<thisRightMenuStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/TopBar/menu' field='show_middle' checked='show' unchecked='hide'> Show Top Middle Menu</$checkbox>|<<thisTopMiddleMenuStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenu/TopBar/menu' field='show_left' checked='show' unchecked='hide'> Show Top Left Menu</$checkbox>|<<thisTopLeftMenuStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenu/TopBar/menu' field='show_right' checked='show' unchecked='hide'> Show Top Right Menu</$checkbox>|<<thisTopRightMenuStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/BottomBar/menu' tag='$:/tags/PageTemplate'>Show Bottom Bar</$checkbox>|<<thisBottomBarStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/BottomBar/menu' field='show_left' checked='show' unchecked='hide'>Show Bottom Left Menu</$checkbox>|<<thisBottomLeftMenuStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/BottomBar/menu' field='show_right' checked='show' unchecked='hide'>Show Bottom Right Menu</$checkbox>|<<thisBottomRightMenuStyleSelector>>|\n|<$checkbox tiddler='$:/plugins/inmysocks/iconmenus/BottomBar/menu' field='show_middle' checked='show' unchecked='hide'>Show Bottom Middle</$checkbox>|<<thisBottomMiddleMenuStyleSelector>>|\n\n\nTiddlers labeled `<menu name> Style` appear as options here. (So `Top Bar Style`, `Right Menu Style`, etc.)\n\nMenus on the top bar will inherit attributes from the top bar settings if an attribute is set to `inherit` or left blank.\n\n<<tabs \"[[$:/plugins/inmysocks/iconmenus/Top Bar Settings]] [[$:/plugins/inmysocks/iconmenus/Left Menu Settings]] [[$:/plugins/inmysocks/iconmenus/Right Menu Settings]] [[$:/plugins/inmysocks/iconmenus/Top Left Menu Settings]] [[$:/plugins/inmysocks/iconmenus/Top Middle Menu Settings]] [[$:/plugins/inmysocks/iconmenus/Top Right Menu Settings]] [[$:/plugins/inmysocks/iconmenus/Bottom Bar Settings]] [[$:/plugins/inmysocks/iconmenus/Bottom Left Menu Settings]] [[$:/plugins/inmysocks/iconmenus/Bottom Middle Menu Settings]] [[$:/plugins/inmysocks/iconmenus/Bottom Right Menu Settings]]\" [[$:/plugins/inmysocks/iconmenus/Top Bar Settings]]>>" }, "$:/plugins/inmysocks/iconmenus/Left Menu Appear on Hover Style": { "caption": "Left Menu Appear on Hover Style", "created": "20150125145441628", "creator": "inmysocks", "modified": "20150211235141695", "modifier": "inmysocks", "tags": "[[Left Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Left Menu Appear on Hover Style", "text": "html .tc-leftmenu {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_left_offset}};\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}};\n width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_width}};\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}};\n}\n\n\nhtml .tc-leftmenu-wrapper {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: 0px;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}};\n width: 30px;\n height: 100%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}};\n background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_background_color}};\n opacity: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_hidden_opacity}};\n border-right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_show_border}};\n}\n\nhtml .tc-leftmenu-wrapper:hover {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: 0px;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}};\n width: 30px;\n height 100%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}};\n background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_background_color}};\n opacity: 1;\n border-right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_show_border}};\n}" }, "$:/plugins/inmysocks/iconmenus/Left Menu Basic Style": { "caption": "Left Menu Basic Style", "created": "20150125143220099", "creator": "inmysocks", "modified": "20150211235210592", "modifier": "inmysocks", "tags": "[[Left Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Left Menu Basic Style", "text": "html .tc-leftmenu {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_left_offset}};\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}};\n width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_width}};\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}};\n}\n" }, "$:/plugins/inmysocks/iconmenus/Left Menu Pop Out on Hover Style": { "caption": "Left Menu Pop Out on Hover Style", "created": "20150125215119078", "creator": "inmysocks", "modified": "20150211235239719", "modifier": "inmysocks", "tags": "[[Left Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Left Menu Pop Out on Hover Style", "text": "html .tc-leftmenu {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: inherit;\n top: inherit;\n width: inherit;\n z-index: 99;\n color:inherit;\n font-size:inherit;\n opacity: 1;\n height: inherit;\n}\n\nhtml .tc-leftmenu:hover {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: inherit;\n top: inherit;\n width: inherit;\n z-index: 99;\n color:inherit;\n font-size:inherit;\n opacity: 1;\n height: inherit;\n text-align: center;\n}\n\nhtml .tc-leftmenu-wrapper {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_hidden_size}};\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}};\n width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_width}};\n height: 110%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}};\n background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_background_color}};\n opacity: 1; \n overflow: hidden;\n border-right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_show_border}};\n border-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_border_color}};\n}\n\nhtml .tc-leftmenu-wrapper:hover {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: 0px;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}};\n width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_width}};\n height 110%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}};\n background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_background_color}};\n opacity: 1;\n overflow: hidden;\n border-right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_show_border}};\n border-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_border_color}};\n}" }, "$:/plugins/inmysocks/iconmenus/Left Menu Settings": { "caption": "Left Menu Settings", "created": "20150121172547555", "creator": "inmysocks", "modified": "20150211235324783", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Left Menu Settings", "text": "Left Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_left_offset'/> (Distance from the left side of the screen)<br>\nVertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_vertical_offset'/> (Distance from the bottom of the top bar or top of the screen)<br>\nWidth: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_width'/> (Menu width)<br>\nFont Size: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_text_color'/><br>\nBackground Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_background_color'/><br>\nShow Border: <$checkbox tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field=left_menu_show_border checked=solid unchecked=''/><br>\nBorder Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field=left_menu_border_color/><br>\nOpacity When Hidden: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_hidden_opacity'/> (used for the 'appear on hover' style)<br>\nPosition of Hidden Menu: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='left_menu_hidden_size'/> (used for the 'pop out on hover' style)<br>\n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]][plugintiddlers[]tag[Menu Icon]]+[nsort[left_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/LeftMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!left_menu_order\" setTo=<<calc !!left_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!left_menu_order\" setTo=<<calc !!left_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='left_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/inmysocks/iconmenus/icon/Old Hide Menu Button": { "caption": "Old Hide Menu Button", "created": "20150130003607080", "creator": "inmysocks", "left_menu_order": "7", "modified": "20150130023013778", "modifier": "inmysocks", "order": "0", "right_menu_order": "0", "tags": "[[Menu Icon]] $:/tags/RightMenu", "title": "$:/inmysocks/iconmenus/icon/Old Hide Menu Button", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}}</$button>\n</$reveal>\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"no\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible\">{{$:/core/images/chevron-left}}</$button>\n</$reveal>" }, "$:/plugins/inmysocks/iconmenus/Right Menu Appear on Hover Style": { "caption": "Right Menu Appear on Hover Style", "created": "20150125144411278", "creator": "inmysocks", "modified": "20150211235408762", "modifier": "inmysocks", "tags": "[[Right Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Right Menu Appear on Hover Style", "text": "html .tc-rightmenu {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: inherit;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: inherit;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n opacity: 1;\n background-color: inherit;\n height: 100%;\n border: none;\n border-color: #000000;\n}\n\nhtml .tc-rightmenu:hover {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: inherit;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: inherit;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n opacity: 1;\n background-color: inherit;\n height: 100%;\n border: none;\n border-color: #000000;\n}\n\nhtml .tc-rightmenu-wrapper {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: 0px;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: 30px;\n height: 100%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n background-color: transparent;\n opacity: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_hidden_opacity}};\n overflow: hidden;\n}\n\nhtml .tc-rightmenu-wrapper:hover {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: 0px;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: 30px;\n height 100%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n background-color: transparent;\n opacity: 1;\n overflow: hidden;\n}" }, "$:/plugins/inmysocks/iconmenus/Right Menu Basic Style": { "caption": "Right Menu Basic Style", "created": "20150125143649507", "creator": "inmysocks", "modified": "20150211235444836", "modifier": "inmysocks", "tags": "[[Right Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Right Menu Basic Style", "text": "html .tc-rightmenu {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_right_offset}};\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_width}};\n z-index: 98;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n opacity: 1;\n}" }, "$:/plugins/inmysocks/iconmenus/Right Menu Pop Out on Hover Style": { "caption": "Right Menu Pop Out on Hover Style", "created": "20150125213040915", "creator": "inmysocks", "modified": "20150211235556154", "modifier": "inmysocks", "tags": "[[Right Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Right Menu Pop Out on Hover Style", "text": "html .tc-rightmenu {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: inherit;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: inherit;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n opacity: 1;\n height: inherit;\n text-align: center;\n background-color: inherit;\n}\n\nhtml .tc-rightmenu:hover {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: inherit;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: inherit;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n opacity: 1;\n height: inherit;\n border-left: inherit;\n text-align: center;\n background-color: inherit;\n}\n\nhtml .tc-rightmenu-wrapper {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n left: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_hidden_size}};\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_width}};\n height: 110%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_background_color}};\n opacity: 1; \n overflow: hidden;\n border-left: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_show_border}};\n border-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_border_color}};\n}\n\nhtml .tc-rightmenu-wrapper:hover {\n display: block;\n padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px;\n position: fixed;\n right: 0px;\n top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_vertical_offset}};\n width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_width}};\n height 110%;\n z-index: 99;\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_text_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_font_size}};\n background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_background_color}};\n opacity: 1;\n overflow: hidden;\n border-left: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_show_border}};\n border-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_border_color}};\n}" }, "$:/plugins/inmysocks/iconmenus/Right Menu Settings": { "caption": "Right Menu Settings", "created": "20150123193835943", "creator": "inmysocks", "modified": "20150211235639496", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Right Menu Settings", "text": "Right Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_right_offset'/> (Distance from the right side of the screen)<br>\nVertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_vertical_offset'/> (Distance from the bottom of the top bar or top of the screen)<br>\nWidth: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_width'/> (Menu width)<br>\nFont Size: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_text_color'/> <br>\nBackground Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_background_color'/><br>\nShow Border: <$checkbox tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field=right_menu_show_border checked=solid unchecked=''/><br>\nBorder Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field=right_menu_border_color/><br>\nOpacity When Hidden: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_hidden_opacity'/> (used for the 'appear on hover' style)<br>\nPosition of Hidden Menu: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='right_menu_hidden_size'/> (used for the 'pop out on hover' style)<br>\n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]][plugintiddlers[]tag[Menu Icon]]+[nsort[right_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/RightMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!right_menu_order\" setTo=<<calc !!right_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!right_menu_order\" setTo=<<calc !!right_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='right_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/plugins/inmysocks/iconmenus/Top Bar Basic Style": { "caption": "Top Bar Basic Style", "created": "20150125150421416", "creator": "inmysocks", "modified": "20150211235758122", "modifier": "inmysocks", "tags": "[[Top Bar Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Bar Basic Style", "text": "html .tc-iconmenutopbar {\n display:block;\n width:100%;\n position:fixed;\n text-align:center;\n line-width:100%;\n left:0%;\n top:0px;\n background-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_background_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_text_size}};\n border-bottom-style:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_border}};\n border-bottom-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_border_color}};\n height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n overflow: hidden;\n z-index: 70;\n} " }, "$:/plugins/inmysocks/iconmenus/Top Bar Pop Out on Hover Style": { "caption": "Top Bar Pop Out on Hover Style", "created": "20150125150523066", "creator": "inmysocks", "modified": "20150211235826817", "modifier": "inmysocks", "tags": "[[Top Bar Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Bar Pop Out on Hover Style", "text": "html .tc-iconmenutopbar {\n display:block;\n width:100%;\n position:fixed;\n text-align:center;\n line-width:100%;\n left:0%;\n top:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_hidden_size}};\n background-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_background_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_text_size}};\n border-bottom-style:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_border}};\n border-bottom-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_border_color}};\n height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n} \n\nhtml .tc-iconmenutopbar:hover {\n display:block;\n width:100%;\n position:fixed;\n text-align:center;\n line-width:100%;\n left:0%;\n top:0px;\n background-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_background_color}};\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_text_size}};\n border-bottom-style:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_border}};\n border-bottom-color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_border_color}};\n height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n} " }, "$:/plugins/inmysocks/iconmenus/Top Bar Settings": { "caption": "Top Bar Settings", "created": "20150124124443910", "creator": "inmysocks", "modified": "20150211235855713", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Bar Settings", "text": "Top Bar Height: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_bar_height'/><br>\nAmount of Top Bar Hidden: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_bar_hidden_size'/> (Used for the pop out on hover style, this should be negative and Top Bar Height+Amount Hidden>0)<br>\nTop Bar Background Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_bar_background_color'/><br>\nShow Top Bar Border: <$checkbox tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_bar_border' checked=solid unchecked=none/><br>\nTop Bar Border Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_bar_border_color'/><br>\nTop Bar Text Size: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_bar_text_size'/>" }, "$:/plugins/inmysocks/iconmenus/Top Left Menu Basic Style": { "caption": "Top Left Menu Basic Style", "created": "20150125145544310", "creator": "inmysocks", "modified": "20150211235925529", "modifier": "inmysocks", "tags": "[[Top Left Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Left Menu Basic Style", "text": "html .tc-topleftmenu {\n display: block;\n padding: 0px 0px 0px 0px;\n position: absolute;\n left: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_left_menu_left_offset}};\n top: inherit;\n z-index: 199;\n border-bottom-style: none;\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_left_menu_font_size}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_left_menu_text_color}};\n height: inherit;\n overflow: inherit;\n text-align: left;\n}" }, "$:/plugins/inmysocks/iconmenus/Top Left Menu Settings": { "caption": "Top Left Menu Settings", "created": "20150123211512650", "creator": "inmysocks", "modified": "20150218074042858", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Left Menu Settings", "text": "Vertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_left_menu_vertical_offset'/><br>\nLeft Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_left_menu_left_offset'/><br>\nFont Size <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_left_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_left_menu_text_color'/> \n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]nsort[top_left_menu_order]][plugintiddlers[]tag[Menu Icon]nsort[top_left_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/TopLeftMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!top_left_menu_order\" setTo=<<calc !!top_left_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!top_left_menu_order\" setTo=<<calc !!top_left_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='top_left_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/plugins/inmysocks/iconmenus/Top Middle Menu Basic Style": { "caption": "Top Middle Menu Basic Style", "created": "20150125150136727", "creator": "inmysocks", "modified": "20150212002050972", "modifier": "inmysocks", "tags": "[[Top Middle Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Middle Menu Basic Style", "text": "html .tc-topcentermenu {\n width: 100%;\n text-align: center;\n display: block;\n padding: 0px 0px 0px 0px;\n position: absolute;\n top: inherit;\n z-index: 99;\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_middle_menu_font_size}};\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_middle_menu_text_color}};\n line-height: inherit;\n height: inherit;\n overflow: inherit;\n}" }, "$:/plugins/inmysocks/iconmenus/Top Middle Menu Settings": { "caption": "Top Middle Menu Settings", "created": "20150124160659217", "creator": "inmysocks", "modified": "20150212001641676", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Middle Menu Settings", "text": "Vertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_middle_menu_vertical_offset'/><br>\nLeft Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_middle_menu_left_offset'/><br>\nFont Size: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_middle_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_middle_menu_text_color'/><br>\n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]][plugintiddlers[]tag[Menu Icon]]+[nsort[top_middle_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/TopMiddleMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!top_middle_menu_order\" setTo=<<calc !!top_middle_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!top_middle_menu_order\" setTo=<<calc !!top_middle_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='top_middle_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/plugins/inmysocks/iconmenus/Top Right Menu Basic Style": { "caption": "Top Right Menu Basic Style", "created": "20150125145928143", "creator": "inmysocks", "modified": "20150212001919454", "modifier": "inmysocks", "tags": "[[Top Right Menu Style]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Right Menu Basic Style", "text": "html .tc-toprightmenu {\n display: block;\n padding: 0px 0px 0px 0px;\n position: absolute;\n right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_right_menu_right_offset}};\n top: inherit;\n z-index: 99;\n border-bottom-style: none;\n font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_right_menu_font_size}};\n line-height:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}};\n color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_right_menu_text_color}};\n height: inherit;\n overflow: inherit;\n text-align: right;\n}\n" }, "$:/plugins/inmysocks/iconmenus/Top Right Menu Settings": { "caption": "Top Right Menu Settings", "created": "20150123223246312", "creator": "inmysocks", "modified": "20150218074242218", "modifier": "inmysocks", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/Top Right Menu Settings", "text": "Vertical Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_right_menu_vertical_offset'/><br>\nRight Offset: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_right_menu_right_offset'/><br>\nFont Size <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_right_menu_font_size'/><br>\nText Color: <$edit-text tiddler='$:/plugins/inmysocks/iconmenus/icon_menu_settings' field='top_right_menu_text_color'/>\n\nThe checkbox sets if the item is in the menu, the numbers in the `Order` column set the order in which the entries appear.\n\n<table>\n<tr>\n <th>In Menu?</th>\n <th>Name</th>\n <th>Order</th>\n</tr>\n<$list filter='[tag[Menu Icon]nsort[top_right_menu_order]][plugintiddlers[]tag[Menu Icon]nsort[top_right_menu_order]]'>\n<tr>\n <td><$checkbox tiddler=<<currentTiddler>> tag='$:/tags/TopRightMenu'></$checkbox></td>\n <td><$link to=<<currentTiddler>>><$view field=caption><$view field='title'/></$view></$link></td>\n <td><$button set=\"!!top_right_menu_order\" setTo=<<calc !!top_right_menu_order 1>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}}</$button> \n<$button set=\"!!top_right_menu_order\" setTo=<<calc !!top_right_menu_order -1 0>> class=\"tc-btn-invisible\">{{$:/core/images/chevron-up}}</$button><$edit-text field='top_right_menu_order' placeholder='Order' size=4/></td>\n</tr>\n</$list>\n</table>" }, "$:/plugins/inmysocks/iconmenus/TopBar/menu": { "created": "20150123102312282", "creator": "inmysocks", "modified": "20150218075611266", "modifier": "inmysocks", "show_left": "show", "show_middle": "show", "show_right": "show", "tags": "[[Icon Menus]] $:/tags/TopRightBar", "title": "$:/plugins/inmysocks/iconmenus/TopBar/menu", "text": "<div class=\"tc-iconmenutopbar\">\n<$reveal type=match state='$:/plugins/inmysocks/iconmenu/TopBar/menu!!show_left' text=show>\n<div class='tc-topleftmenu'>\n<$list filter='[tag[$:/tags/TopLeftMenu]nsort[top_left_menu_order]][plugintiddlers[]tag[$:/tags/TopLeftMenu]nsort[top_left_menu_order]]'><$transclude/></$list>\n</div>\n</$reveal>\n<$reveal type=match state='$:/plugins/inmysocks/iconmenus/TopBar/menu!!show_middle' text=show>\n<div class='tc-topcentermenu'>\n<$list filter='[tag[$:/tags/TopMiddleMenu]nsort[top_middle_menu_order]][plugintiddlers[]tag[$:/tags/TopMiddleMenu]nsort[top_middle_menu_order]]'><$transclude/></$list>\n</div>\n</$reveal>\n<$reveal type=match state='$:/plugins/inmysocks/iconmenu/TopBar/menu!!show_right' text=show>\n<div class='tc-toprightmenu'>\n<$list filter='[tag[$:/tags/TopRightMenu]nsort[top_right_menu_order]][plugintiddlers[]tag[$:/tags/TopRightMenu]nsort[top_right_menu_order]]'><$transclude/></$list>\n</div>\n</$reveal>\n</div>\n" }, "$:/plugins/inmysocks/iconmenus/icon/Wiki Title and Subtitle": { "caption": "Wiki Title and Subtitle", "created": "20150124161741302", "creator": "inmysocks", "left_menu_order": "11", "modified": "20150211234949335", "modifier": "inmysocks", "order": "2", "right_menu_order": "15", "tags": "[[Menu Icon]] $:/tags/TopMiddleMenu [[Icon Menus]] $:/tags/TopRightMenu", "title": "$:/plugins/inmysocks/iconmenus/icon/Wiki Title and Subtitle", "top_left_menu_order": "2", "top_middle_menu_order": "2", "top_right_menu_order": "2", "text": "{{$:/SiteTitle}} -- {{$:/SiteSubtitle}}" }, "$:/plugins/inmysocks/iconmenus/icon/Advanced Search": { "caption": "Advanced Search", "created": "20150121174337179", "creator": "inmysocks", "left_menu_order": "17", "modified": "20150211234653390", "modifier": "inmysocks", "order": "10", "right_menu_order": "3", "tags": "[[Menu Icon]] [[Icon Menus]] $:/tags/TopRightMenu", "title": "$:/plugins/inmysocks/iconmenus/icon/Advanced Search", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "1", "text": "{{$:/core/ui/Buttons/advanced-search}}" }, "$:/plugins/inmysocks/iconmenus/icon/Close All": { "caption": "Close All", "created": "20150121173410074", "creator": "inmysocks", "left_menu_order": "4", "modified": "20150211234704048", "modifier": "inmysocks", "order": "11", "right_menu_order": "4", "tags": "$:/tags/LeftMenu [[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Close All", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/close-all}}" }, "$:/plugins/inmysocks/iconmenus/icon/Control Panel": { "caption": "Control Panel", "created": "20150121164820855", "creator": "inmysocks", "left_menu_order": "2", "modified": "20150211234724302", "modifier": "inmysocks", "order": "3", "right_menu_order": "2", "tags": "$:/tags/LeftMenu [[Menu Icon]] $:/tags/RightMenu [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Control Panel", "top_left_menu_order": "0", "top_middle_menu_order": "3", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/control-panel}}" }, "$:/plugins/inmysocks/iconmenus/icon/Create New Tiddler From Template": { "caption": "Create New Tiddler From Template", "created": "20150121161849750", "creator": "inmysocks", "image": "{{$:/core/images/new-button}}", "left_menu_order": "3", "modified": "20150211234734888", "modifier": "inmysocks", "order": "3", "right_menu_order": "5", "tags": "[[Menu Icon]] $:/tags/LeftMenu [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Create New Tiddler From Template", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "<$button popup='$:/state/createnewtiddler' class='tc-btn-invisible' tooltip='New Tiddler from Template'>{{$:/core/images/new-button}}</$button><$reveal type='popup' state='$:/state/createnewtiddler'><div class=\"tc-drop-down\">\nCreate New Tiddler Using Template:\n<$list filter='[prefix[New Tiddler Template - ]]' variable=TemplateName><$button><$view tiddler=<<TemplateName>> field=title/><$action-sendmessage $message='tm-new-tiddler' $param=<<TemplateName>>/></$button>\n</$list>\n</div>\n</$reveal>" }, "$:/plugins/inmysocks/iconmenus/icon/Full Screen": { "caption": "Full Screen", "created": "20150121174043988", "creator": "inmysocks", "left_menu_order": "5", "modified": "20150211234745336", "modifier": "inmysocks", "order": "12", "right_menu_order": "6", "tags": "$:/tags/LeftMenu [[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Full Screen", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/full-screen}}" }, "$:/plugins/inmysocks/iconmenus/icon/Home": { "caption": "Home", "created": "20150121170719185", "creator": "inmysocks", "left_menu_order": "0", "modified": "20150212000308501", "modifier": "inmysocks", "order": "NaN", "right_menu_order": "1", "tags": "[[Menu Icon]] $:/tags/RightMenu $:/tags/TopMiddleMenu $:/tags/LeftMenu [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Home", "top_left_menu_order": "0", "top_middle_menu_order": "1", "top_right_menu_order": "18", "text": "{{$:/core/ui/Buttons/home}}" }, "$:/plugins/inmysocks/iconmenus/icon/Import": { "caption": "Import", "created": "20150121173313491", "creator": "inmysocks", "left_menu_order": "16", "modified": "20150211234809719", "modifier": "inmysocks", "order": "4", "right_menu_order": "7", "tags": "[[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Import", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/import}}" }, "$:/plugins/inmysocks/iconmenus/icon/Language": { "caption": "Language", "created": "20150121174250819", "creator": "inmysocks", "left_menu_order": "6", "modified": "20150211234820489", "modifier": "inmysocks", "order": "13", "right_menu_order": "8", "tags": "$:/tags/LeftMenu [[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Language", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/language}}" }, "$:/plugins/inmysocks/iconmenus/icon/New Journal": { "caption": "New Journal", "created": "20150121173516193", "creator": "inmysocks", "left_menu_order": "15", "modified": "20150211234830211", "modifier": "inmysocks", "order": "14", "right_menu_order": "9", "tags": "[[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/New Journal", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/new-journal}}" }, "$:/plugins/inmysocks/iconmenus/icon/Permaview": { "caption": "Permaview", "created": "20150121173435603", "creator": "inmysocks", "left_menu_order": "14", "modified": "20150211234841496", "modifier": "inmysocks", "order": "5", "right_menu_order": "11", "tags": "[[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Permaview", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/permaview}}" }, "$:/plugins/inmysocks/iconmenus/icon/Refresh": { "caption": "Refresh", "created": "20150121173606555", "creator": "inmysocks", "left_menu_order": "1", "modified": "20150212001438268", "modifier": "inmysocks", "order": "6", "right_menu_order": "12", "tags": "[[Menu Icon]] [[Icon Menus]] $:/tags/TopLeftMenu", "title": "$:/plugins/inmysocks/iconmenus/icon/Refresh", "top_left_menu_order": "1", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/refresh}}" }, "$:/plugins/inmysocks/iconmenus/icon/Save Wiki": { "caption": "Save Wiki", "created": "20150121175630282", "creator": "inmysocks", "left_menu_order": "12", "modified": "20150211234904103", "modifier": "inmysocks", "order": "7", "right_menu_order": "13", "tags": "[[Menu Icon]] $:/tags/TopLeftMenu $:/tags/TopMiddleMenu [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Save Wiki", "top_left_menu_order": "3", "top_middle_menu_order": "4", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/save-wiki}}" }, "$:/plugins/inmysocks/iconmenus/icon/Search": { "caption": "Search", "created": "20150121171609124", "creator": "inmysocks", "left_menu_order": "13", "modified": "20150211234913046", "modifier": "inmysocks", "order": "11", "right_menu_order": "14", "tags": "[[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Search", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "<$button to='$:/AdvancedSearch' class='tc-btn-invisible'>{{$:/core/ui/Buttons/advanced-search}}</$button>\n" }, "$:/plugins/inmysocks/iconmenus/icon/Storyview": { "caption": "Storyview", "created": "20150121174204933", "creator": "inmysocks", "left_menu_order": "10", "modified": "20150211234921335", "modifier": "inmysocks", "order": "15", "right_menu_order": "18", "tags": "[[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Storyview", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/storyview}}" }, "$:/plugins/inmysocks/iconmenus/icon/Tag Manager": { "caption": "Tag Manager", "created": "20150121174313928", "creator": "inmysocks", "left_menu_order": "9", "modified": "20150211234931184", "modifier": "inmysocks", "order": "16", "right_menu_order": "17", "tags": "[[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Tag Manager", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/tag-manager}}" }, "$:/plugins/inmysocks/iconmenus/icon/Theme": { "caption": "Theme", "created": "20150121174228645", "creator": "inmysocks", "left_menu_order": "8", "modified": "20150211234940567", "modifier": "inmysocks", "order": "17", "right_menu_order": "16", "tags": "[[Menu Icon]] [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon/Theme", "top_left_menu_order": "0", "top_middle_menu_order": "0", "top_right_menu_order": "0", "text": "{{$:/core/ui/Buttons/theme}}" }, "$:/plugins/inmysocks/iconmenus/icon_menu_settings": { "bottom_bar_background_color": "lightgrey", "bottom_bar_border": "solid", "bottom_bar_border_color": "green", "bottom_bar_height": "40px", "bottom_bar_hidden_size": "-20px", "bottom_bar_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Bottom Bar Basic Style}}\"\"\"", "bottom_bar_text_size": "20px", "bottom_left_menu_font_size": "20px", "bottom_left_menu_left_offset": "10px", "bottom_left_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Bottom Left Menu Basic Style}}\"\"\"", "bottom_left_menu_vertical_offset": "0px", "bottom_middle_menu_font_size": "20px", "bottom_middle_menu_left_offset": "", "bottom_middle_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Bottom Middle Menu Basic Style}}\"\"\"", "bottom_middle_menu_text_color": "black", "bottom_middle_menu_vertical_offset": "0px", "bottom_right_menu_font_size": "20px", "bottom_right_menu_right_offset": "0px", "bottom_right_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Bottom Right Menu Basic Style}}\"\"\"", "bottom_right_menu_vertical_offset": "", "created": "20150124120530941", "creator": "inmysocks", "left_menu_background_color": "", "left_menu_border_color": "#000", "left_menu_font_size": "20px", "left_menu_hidden_opacity": "0.2", "left_menu_hidden_size": "99%", "left_menu_left_offset": "5px", "left_menu_show_border": "", "left_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Left Menu Appear on Hover Style}}\"\"\"", "left_menu_text_color": "#000000", "left_menu_vertical_offset": "-20px", "left_menu_width": "40px", "modified": "20150218080207581", "modifier": "inmysocks", "right_menu_background_color": "grey", "right_menu_border_color": "", "right_menu_font_size": "20px", "right_menu_hidden_opacity": "0.1", "right_menu_hidden_size": "99.5%", "right_menu_right_offset": "0px", "right_menu_show_border": "solid", "right_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Right Menu Pop Out on Hover Style}}\"\"\"", "right_menu_text_color": "#000000", "right_menu_vertical_offset": "-20px", "right_menu_width": "30px", "tags": "[[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/icon_menu_settings", "top_bar_background_color": "#191919", "top_bar_border": "solid", "top_bar_border_color": "#a00000", "top_bar_height": "40px", "top_bar_hidden_size": "-25px", "top_bar_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Top Bar Basic Style}}\"\"\"", "top_bar_text_size": "20px", "top_left_menu_font_size": "inherit", "top_left_menu_left_offset": "0px", "top_left_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Top Left Menu Basic Style}}\"\"\"", "top_left_menu_text_color": "#000000", "top_left_menu_vertical_offset": "0px", "top_middle_menu_font_size": "inherit", "top_middle_menu_left_offset": "0px", "top_middle_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Top Middle Menu Basic Style}}\"\"\"", "top_middle_menu_text_color": "#ffffff", "top_middle_menu_vertical_offset": "0px", "top_right_menu_font_size": "inherit", "top_right_menu_left_offset": "0px", "top_right_menu_right_offset": "10px", "top_right_menu_style": "\"\"\"{{$:/plugins/inmysocks/iconmenus/Top Right Menu Basic Style}}\"\"\"", "top_right_menu_text_color": "#0020f0", "top_right_menu_vertical_offset": "0px", "text": "" }, "$:/plugins/inmysocks/iconmenus/leftmenu-icons": { "created": "20140610090914688", "creator": "TonGerner", "modified": "20150212000316434", "modifier": "inmysocks", "tags": "[[Icon Menus]] $:/tags/PageTemplate", "title": "$:/plugins/inmysocks/iconmenus/leftmenu-icons", "type": "application/x-tiddler", "text": "<div class='tc-leftmenu-wrapper'>\n<div class=\"tc-leftmenu tc-page-controls\">\n\n@@.tc-site-title\n\n@@\n\n<$list filter='[tag[$:/tags/LeftMenu]][plugintiddlers[]tag[$:/tags/LeftMenu]]+[nsort[left_menu_order]]'>\n\n<$transclude/>\n\n</$list>\n\n</div>\n</div>" }, "$:/plugins/inmysocks/iconmenus/rightmenu-icons": { "class": "tc-rightmenu-wrapper", "created": "20150123170243215", "creator": "TonGerner", "modified": "20150212000317330", "modifier": "inmysocks", "tags": "[[Icon Menus]] $:/tags/PageTemplate", "title": "$:/plugins/inmysocks/iconmenus/rightmenu-icons", "type": "application/x-tiddler", "text": "<div class=\"tc-rightmenu-wrapper\">\n<div class=\"tc-page-controls tc-rightmenu\">\n\n@@.tc-site-title\n\n@@\n\n<$list filter='[tag[$:/tags/RightMenu]][plugintiddlers[]tag[$:/tags/RightMenu]]+[nsort[right_menu_order]]'>\n\n<$transclude/>\n\n</$list>\n\n</div>\n</div>" }, "$:/plugins/inmysocks/iconmenus/stylesheet/IconMenus": { "created": "20140607071109226", "creator": "TonGerner", "left_menu_style": "{{Left Menu Basic Style}}", "leftmenu-width": "0px", "modified": "20150218073041489", "modifier": "inmysocks", "right_menu_style": "{{Right Menu Basic Style}}", "story-left": "0px", "story-width": "", "tags": "$:/tags/Stylesheet [[Icon Menus]]", "title": "$:/plugins/inmysocks/iconmenus/stylesheet/IconMenus", "top-leftmenu": "0px", "type": "text/vnd.tiddlywiki", "text": "/* STORY-RIVER */\n.tc-story-river {\n left: {{!!story-left}};\n width: {{!!story-width}};\n}\n\n/* LEFT MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_style}}\n\n/* RIGHT MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!right_menu_style}}\n\n/* TOP LEFT MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_left_menu_style}}\n\n/* TOP RIGHT MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_right_menu_style}}\n\n/* TOP MIDDLE MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_middle_menu_style}}\n\n/* TOP BAR */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_style}}\n\n/* BOTTOM LEFT MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_left_menu_style}}\n\n/* BOTTOM RIGHT MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_right_menu_style}}\n\n/* BOTTOM MIDDLE MENU */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_middle_menu_style}}\n\n/* BOTTOM BAR */\n{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!bottom_bar_style}}" } } }
<div class="tc-iconmenubottombar tc-page-controls"> <$reveal type=match state='$:/plugins/inmysocks/iconmenus/BottomBar/menu!!show_left' text=show> <div class='tc-bottomleftmenu'> <$list filter='[tag[$:/tags/BottomLeftMenu]nsort[bottom_left_menu_order]]'><$transclude/></$list> </div> </$reveal> <$reveal type=match state='$:/plugins/inmysocks/iconmenus/BottomBar/menu!!show_middle' text=show> <div class='tc-bottomcentermenu'> <$list filter='[tag[$:/tags/BottomMiddleMenu]nsort[bottom_middle_menu_order]]'><$transclude/></$list> </div> </$reveal> <$reveal type=match state='$:/plugins/inmysocks/iconmenus/BottomBar/menu!!show_right' text=show> <div class='tc-bottomrightmenu'> <$list filter='[tag[$:/tags/BottomRightMenu]nsort[bottom_right_menu_order]]'><$transclude/></$list> </div> </$reveal> </div>
{{$:/core/ui/Buttons/advanced-search}}
{{$:/core/ui/Buttons/close-all}}
{{$:/core/ui/Buttons/control-panel}}
{{$:/core/ui/Buttons/new-tiddler}}
<$button popup='$:/state/createnewtiddler' class='tc-btn-invisible' tooltip='New Tiddler from Template'>{{$:/core/images/new-button}}</$button><$reveal type='popup' state='$:/state/createnewtiddler'><div class="tc-drop-down"> Create New Tiddler Using Template: <$list filter='[prefix[New Tiddler Template - ]]' variable=TemplateName><$button><$view tiddler=<<TemplateName>> field=title/><$action-sendmessage $message='tm-new-tiddler' $param=<<TemplateName>>/></$button> </$list> </div> </$reveal>
{{$:/core/ui/Buttons/full-screen}}
{{$:/core/ui/Buttons/home}}
{{$:/core/ui/Buttons/language}}
{{$:/core/ui/Buttons/permaview}}
{{$:/core/ui/Buttons/refresh}}
{{$:/core/ui/Buttons/save-wiki}}
{{$:/core/ui/Buttons/tag-manager}}
{{$:/core/ui/Buttons/theme}}
{{$:/SiteTitle}} -- {{$:/SiteSubtitle}}
html .tc-leftmenu { display: block; padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px; position: fixed; left: inherit; top: inherit; width: inherit; z-index: 999; color:inherit; font-size:inherit; opacity: 1; height: inherit; } html .tc-leftmenu:hover { display: block; padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px; position: fixed; left: inherit; top: inherit; width: inherit; z-index: 999; color:inherit; font-size:inherit; opacity: 1; height: inherit; text-align: center; } html .tc-leftmenu-wrapper { display: block; padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px; position: fixed; right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_hidden_size}}; top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}}; width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_width}}; height: 110%; z-index: 999; color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}}; font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}}; background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_background_color}}; opacity: 1; overflow: hidden; border-right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_show_border}}; border-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_border_color}}; } html .tc-leftmenu-wrapper:hover { display: block; padding: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}} 0px 0px 0px; position: fixed; left: 0px; top: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_vertical_offset}}; width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_width}}; height 110%; z-index: 999; color:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_text_color}}; font-size:{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_font_size}}; background-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_background_color}}; opacity: 1; overflow: hidden; border-right: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_show_border}}; border-color: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_border_color}}; }
<div class="tc-rightmenu-wrapper"> <div class="tc-page-controls tc-rightmenu"> @@.tc-site-title @@ <$list filter='[tag[$:/tags/RightMenu]][plugintiddlers[]tag[$:/tags/RightMenu]]+[nsort[right_menu_order]]'> <$transclude/> </$list> </div> </div>
{ "tiddlers": { "$:/plugins/inmysocks/LibraryTracker/Add Books": { "caption": "Add Books", "created": "20141227050110053", "modified": "20150202040250468", "title": "$:/plugins/inmysocks/LibraryTracker/Add Books", "text": "\\define thisSeriesSelect()\n<$select tiddler='$:/temp/newbook' field='series' default='None'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/SeriesTitles]indexes[]sort[title]regexp:[(?i)$(thisSeriesSearch)$]]'>\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$view field='title'/>\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisGenreSelect()\n<$select tiddler='$:/temp/newbook' field='genre' default='None'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/BookGenres]indexes[]sort[title]regexp:[(?i)$(thisGenreSearch)$]]'>\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$view field='title'/>\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisAuthorSelect()\n<$select tiddler='$:/temp/newbook' field='author' default='None'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/BookAuthors]indexes[]sort[title]regexp:[(?i)$(thisAuthorSearch)$]]'>\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$view field='title'/>\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisLocationSelect()\n<$select tiddler='$:/temp/newbook' field='location' default='None'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/BookLocations]indexes[]sort[title]regexp:[(?i)$(thisLocationSearch)$]]'>\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$view field='title'/>\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisTagSelect()\n<$select tiddler='$:/state/booktag' field='selected_tag'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/BookTags]indexes[]sort[title]regexp:[(?i)$(thisTagSearch)$]]'>\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$view field='title'/>\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisOwnerSelect()\n<$select tiddler='$:/temp/newbook' field='owner' default='None'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/BookOwners]indexes[]sort[title]regexp:[(?i)$(thisOwnerSearch)$]]'>\n\t\t<option value=<<currentTiddler>>>\n\t\t\t<$view field='title'/>\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisTypeSelect()\n<$select tiddler='$:/temp/newbook' field='item_type'>\n\t<option value=''>--</option>\n\t<$list filter='[[$:/data/BookTypes]indexes[]sort[title]regexp:[(?i)$(thisTypeSearch)$]]'> <!-- [[Book]][[Video Game]][[Board/Card Game]][[Movie]]'>-->\n\t\t<option>\n\t\t\t<<currentTiddler>>\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\nAdding Items:\n\n<!--Type-->\nType:\n<$reveal state='$:/state/Library Tracker/add type' type=nomatch text='new'>\n\t<$set name=thisTypeSearch value={{$:/state/newbook!!narrow_type_select}}>\n\t\t<<thisTypeSelect>>\n\t</$set>\n\t<$edit-text tiddler='$:/state/newbook' field='narrow_type_select' placeholder='Narrow Type List'/>\n\t(<$button set='$:/state/Library Tracker/add type' setTo='new'>New Item Type</$button>)\n</$reveal>\n<$reveal state='$:/state/Library Tracker/add type' type=match text='new'>\n\t<$edit-text tiddler='$:/state/newbook' field='book_type' placeholder='Item Type'/>\n\t<$button>\n\t\tAdd\n\t\t<$action-setfield $tiddler='$:/data/BookTypes' $index={{$:/state/newbook!!book_type}} $value=1/>\n\t\t<$action-setfield $tiddler='$:/state/newbook' $field='book_author' $value=''/>\n\t</$button>\n\t<$button set='$:/state/Library Tracker/add type' setTo='notnew'>\n\t\tDone\n\t</$button>\n</$reveal>\n<br>\n<!--End Type-->\n<!--Title-->\nTitle:\n<$edit-text tiddler='$:/state/newbook' field='book_title' class='tc-edit-texteditor' placeholder='Book Title'/>\n<!--End Title-->\n<!--Author-->\n<$reveal type=nomatch text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author'>\n\tAuthor: \n\t<$reveal state='$:/state/Library Tracker/add author' type=nomatch text='new'>\n\t\t<$set name=thisAuthorSearch value={{$:/state/newbook!!narrow_author_select}}>\n\t\t\t<<thisAuthorSelect>>\n\t\t</$set>\n\t\t<$edit-text tiddler='$:/state/newbook' field='narrow_author_select' placeholder='Narrow Author List'/>\n\t\t(<$button set='$:/state/Library Tracker/add author' setTo='new'>New Author</$button>)\n\t</$reveal>\n\t<$reveal state='$:/state/Library Tracker/add author' type=match text='new'>\n\t\t<$edit-text tiddler='$:/state/newbook' field='book_author' placeholder='Author'/>\n\t\t<$button>\n\t\t\tAdd\n\t\t\t<$action-setfield $tiddler='$:/data/BookAuthors' $index={{$:/state/newbook!!book_author}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/state/newbook' $field='book_author' $value=''/>\n\t\t</$button>\n\t\t<$button set='$:/state/Library Tracker/add author' setTo='notnew'>\n\t\t\tDone\n\t\t</$button>\n\t</$reveal>\n\t<br>\n</$reveal>\n<!--End Author-->\n<!--Series-->\n<$reveal type=nomatch text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series'>\n\tSeries:\n\t<$reveal state='$:/state/Library Tracker/add series' type=nomatch text='new'>\n\t\t<$set name=thisSeriesSearch value={{$:/state/newbook!!narrow_series_select}}>\n\t\t\t<<thisSeriesSelect>>\n\t\t</$set>\n\t\t<$edit-text tiddler='$:/state/newbook' field='narrow_series_select' placeholder='Narrow Series List'/> \n\t\t(<$button set='$:/state/Library Tracker/add series' setTo='new'>New Series</$button>)\n\t</$reveal>\n\t<$reveal state='$:/state/Library Tracker/add series' type=match text='new'>\n\t\t<$edit-text tiddler='$:/state/newbook' field='book_series' placeholder='Series Title'/>\n\t\t<$button>\n\t\t\tAdd\n\t\t\t<$action-setfield $tiddler='$:/data/SeriesTitles' $index={{$:/state/newbook!!book_series}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/state/newbook' $field='book_series' $value=''/>\n\t\t</$button>\n\t\t<$button set='$:/state/Library Tracker/add series' setTo='notnew'>\n\t\t\tDone\n\t\t</$button>\n\t</$reveal>\n\t<br>\n</$reveal>\n<!--End Series-->\n<!--Genre-->\n<$reveal type=nomatch text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre'>\n\tGenre:\n\t<$reveal state='$:/state/Library Tracker/add genre' type=nomatch text='new'>\n\t\t<$set name=thisGenreSearch value={{$:/state/newbook!!narrow_genre_select}}>\n\t\t\t<<thisGenreSelect>>\n\t\t</$set>\n\t\t<$edit-text tiddler='$:/state/newbook' field='narrow_genre_select' placeholder='Narrow Genre List'/>\n\t\t(<$button set='$:/state/Library Tracker/add genre' setTo='new'>New Genre</$button>)\n\t</$reveal>\n\t<$reveal state='$:/state/Library Tracker/add genre' type=match text='new'>\n\t\t<$edit-text tiddler='$:/state/newbook' field='book_genre' placeholder='Genre'/>\n\t\t<$button>\n\t\t\tAdd\n\t\t\t<$action-setfield $tiddler='$:/data/BookGenres' $index={{$:/state/newbook!!book_genre}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/state/newbook' $field='book_genre' $value=''/>\n\t\t</$button>\n\t\t<$button set='$:/state/Library Tracker/add genre' setTo='notnew'>\n\t\t\tDone\n\t\t</$button>\n\t</$reveal>\n\t<br>\n</$reveal>\n<!--End Genre-->\n<!--Location-->\n<$reveal type=nomatch text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location'>\n\tLocation:\n\t<$reveal state='$:/state/Library Tracker/add location' type=nomatch text='new'>\n\t\t<$set name=thisLocationSearch value={{$:/state/newbook!!narrow_location_select}}>\n\t\t\t<<thisLocationSelect>>\n\t\t</$set>\n\t\t<$edit-text tiddler='$:/state/newbook' field='narrow_location_select' placeholder='Narrow Location List'/>\n\t\t(<$button set='$:/state/Library Tracker/add location' setTo='new'>New Location</$button>)\n\t</$reveal>\n\t<$reveal state='$:/state/Library Tracker/add location' type=match text='new'>\n\t\t<$edit-text tiddler='$:/state/newbook' field='book_location' placeholder='Location'/>\n\t\t<$button>\n\t\t\tAdd\n\t\t\t<$action-setfield $tiddler='$:/data/BookLocations' $index={{$:/state/newbook!!book_location}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/state/newbook' $field='book_location' $value=''/>\n\t\t</$button>\n\t\t<$button set='$:/state/Library Tracker/add location' setTo='notnew'>\n\t\t\tDone\n\t\t</$button>\n\t</$reveal>\n\t<br>\n</$reveal>\n<!--End Location-->\n<!--Owner-->\n<$reveal type=nomatch text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner'>\n\tOwner:\n\t<$reveal state='$:/state/Library Tracker/add owner' type=nomatch text='new'>\n\t\t<$set name=thisOwnerSearch value={{$:/state/newbook!!narrow_owner_select}}>\n\t\t\t<<thisOwnerSelect>>\n\t\t</$set>\n\t\t<$edit-text tiddler='$:/state/newbook' field='narrow_owner_select' placeholder='Narrow Owner List'/>\n\t\t(<$button set='$:/state/Library Tracker/add owner' setTo='new'>New Owner</$button>)\n\t</$reveal>\n\t<$reveal state='$:/state/Library Tracker/add owner' type=match text='new'>\n\t\t<$edit-text tiddler='$:/state/newbook' field='owner' placeholder='Owner'/>\n\t\t<$button>\n\t\t\tAdd\n\t\t\t<$action-setfield $tiddler='$:/data/BookOwners' $index={{$:/state/newbook!!owner}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/state/newbook' $field='owner' $value=''/>\n\t\t</$button>\n\t\t<$button set='$:/state/Library Tracker/add owner' setTo='notnew'>\n\t\t\tDone\n\t\t</$button>\n\t</$reveal>\n</$reveal>\n<!--End Owner-->\n\n\n<!--Tags-->\n<$reveal type=nomatch text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_tags'>\n\tTags (it will always be tagged with `Book` by default):\n\t<br>\n\t<$reveal type=match state='$:/state/newbook!!add_or_create_tag' text='create'>\n\t\tNew Tag:\n\t\t<$edit-text tiddler='$:/state/booktag' field='tag_temp' placeholder='New Tag'/>\n\t\t<$button>\n\t\t\tCreate Tag\n\t\t\t<$action-setfield $tiddler='$:/data/BookTags' $index={{$:/state/booktag!!tag_temp}} $value=1/>\n\t\t\t<$action-setfield $tiddler='$:/state/booktag' $field='tag_temp' $value=''/>\n\t\t</$button>\n\t\t<$button set='$:/state/newbook!!add_or_create_tag' setTo='nocreate'>\n\t\t\tDone\n\t\t</$button>\n\t\t<br>\n\t</$reveal>\n\t<$reveal type='nomatch' state='$:/state/newbook!!add_or_create_tag' text='create'>\n\t\tTag to add: \n\t\t<$set name=thisTagSearch value={{$:/state/newbook!!narrow_tag_select}}>\n\t\t\t<<thisTagSelect>>\n\t\t</$set>\n\t\t<$fieldmangler tiddler='$:/temp/newbook'>\n\t\t\t<$button>\n\t\t\t\tAdd Tag\n\t\t\t\t<$action-sendmessage $message='tm-add-tag' $param={{$:/state/booktag!!selected_tag}}/>\n\t\t\t</$button>\n\t\t\t<$edit-text tiddler='$:/state/newbook' field='narrow_tag_select' placeholder='Narrow Tag List'/>\n\t\t\t(<$button set='$:/state/newbook!!add_or_create_tag' setTo='create'>New Tag</$button>)\n\t\t</$fieldmangler>\n\t\t<br>\n\t</$reveal>\n\tList of current tags:\n\t<br>\n\t<$fieldmangler tiddler='$:/temp/newbook'>\n\t\t<$list filter='[[$:/temp/newbook]tags[]]'>\n\t\t\t<$view field='title'/>\n\t\t\t<$button>\n\t\t\t\tRemove Tag\n\t\t\t\t<$action-sendmessage $message='tm-remove-tag' $param=<<currentTiddler>>/>\n\t\t\t</$button>\n\t\t\t<br>\n\t\t</$list>\n\t</$fieldmangler>\n</$reveal>\n\n<$fieldmangler tiddler={{$:/state/newbook!!book_title}}>\n\t<$button>\n\t\tAdd Book\n\t\t<$reveal type=match text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author'>\n\t\t\t<$action-setfield $tiddler='$:/temp/newbook' author=''/>\n\t\t</$reveal>\n\t\t<$reveal type=match text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series'>\n\t\t\t<$action-setfield $tiddler='$:/temp/newbook' series=''/>\n\t\t</$reveal>\n\t\t<$reveal type=match text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre'>\n\t\t\t<$action-setfield $tiddler='$:/temp/newbook' genre=''/>\n\t\t</$reveal>\n\t\t<$reveal type=match text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location'>\n\t\t\t<$action-setfield $tiddler='$:/temp/newbook' location=''/>\n\t\t</$reveal>\n\t\t<$reveal type=match text=false state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner'>\n\t\t\t<$action-setfield $tiddler='$:/temp/newbook' owner=''/>\n\t\t</$reveal>\n\t\t<$action-setfield $tiddler='$:/temp/newbook' title={{$:/state/newbook!!book_title}}/>\n\t\t<$action-sendmessage $message='tm-add-tag' $param='Book'/>\n\t\t<$action-setfield $tiddler='$:/state/newbook' book_title=''/>\n\t\t<$action-setfield $tiddler='$:/temp/newbook' tags=''/>\n\t</$button>\n</$fieldmangler>" }, "$:/plugins/inmysocks/LibraryTracker/Book List": { "caption": "Book List", "created": "20141227230158171", "modified": "20150202035414054", "title": "$:/plugins/inmysocks/LibraryTracker/Book List", "text": "\\define thisBookList()\n<$list filter='[tag[Book]$(SelectedFilterPart)$sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]' variable=CurrentBook>\n\t<tr>\n\t\t<td>\n\t\t\t<$link to=<<CurrentBook>>>\n\t\t\t\t<$view tiddler=<<CurrentBook>> field='title'/>\n\t\t\t</$link>\n\t\t</td>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=item_type/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=author/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=td>\n\t\t\t<<thisSetLocation>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=owner/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=series/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=genre/>\n\t\t</$reveal>\n\t</tr>\n</$list>\n\\end\n\n\\define thisBookList2()\n<$list filter='[tag[Book]sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]' variable=CurrentBook>\n\t<tr>\n\t\t<td>\n\t\t\t<$link to=<<CurrentBook>>>\n\t\t\t\t<$view tiddler=<<CurrentBook>> field='title'/>\n\t\t\t</$link>\n\t\t</td>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=item_type/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=author/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=td>\n\t\t\t<<thisSetLocation>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=owner/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=series/>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=td>\n\t\t\t<$view tiddler=<<CurrentBook>> field=genre/>\n\t\t</$reveal>\n\t</tr>\n</$list>\n\\end\n\n\\define thisSelectThing()\n<$reveal type='match' state='$:/state/newbook!!sort' text='author'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t<option value=''>\n\t\tAll\n\t</option>\n\t\t<$list filter='[[$:/data/BookAuthors]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='genre'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookGenres]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='series'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/SeriesTitles]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='location'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookLocations]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='owner'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookOwners]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='type'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookTypes]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisMakeSelectedValue()\n$(sortType)$[$(SelectedType)$]\n\\end\n\n\\define count1()\n<$count filter='[tag[Book]$(SelectedFilterPart)$sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]'/>\n\\end\n\n\\define count2()\n<$count filter='[tag[Book]sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]'/>\n\\end\n\n\\define thisSetLocation()\n<$reveal type='nomatch' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='edit'>\n\t\t<$view tiddler=\"\"\"$(CurrentBook)$\"\"\" field=location/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='noedit'>\n\t\t{{$:/core/images/done-button}}\n\t</$button>\n\t<$select tiddler=\"\"\"$(CurrentBook)$\"\"\" field='location'>\n\t\t<$list filter='[[$:/data/BookLocations]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<<currentTiddler>>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisSortBySelect()\n<$select tiddler='$:/state/newbook' field='sort' default='title'>\n\t<option value='title'>\n\t\tTitle\n\t</option>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_author[false]]'>\n\t\t<option value='author'>\n\t\t\tAuthor\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_genre[false]]'>\n\t\t<option value='genre'>\n\t\t\tGenre\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_series[false]]'>\n\t\t<option value='series'>\n\t\t\tSeries\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_location[false]]'>\n\t\t<option value=location>\n\t\t\tLocation\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_type[false]]'>\n\t\t<option value=item_type>\n\t\t\tItem Type\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_owner[false]]'>\n\t\t<option value=owner>\n\t\t\tOwner\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisSearchBySelect()\n<$select tiddler='$:/state/newbook' field='search_in' default='title'>\n\t<option value='tags'>\n\t\tTag\n\t</option>\n\t<option value='title'>\n\t\tTitle\n\t</option>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_author[false]]'>\n\t\t<option value='author'>\n\t\t\tAuthor\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_genre[false]]'>\n\t\t<option value='genre'>\n\t\t\tGenre\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_series[false]]'>\n\t\t<option value='series'>\n\t\t\tSeries\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_location[false]]'>\n\t\t<option value=location>\n\t\t\tLocation\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_type[false]]'>\n\t\t<option value=item_type>\n\t\t\tItem Type\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_owner[false]]'>\n\t\t<option value=owner>\n\t\t\tOwner\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\nIf you select an author/series/location/genre from the drop down menu, then change the `Sort by` option you will have to select from the second dropdown menu again to get it to display things. Despite it showing `all` when you change the sort by option it keeps the previous value, which is invalid now. If I can get a select widget to active action widgets, or to change multiple fields at the same time than I can fix this.\n\nIf you click on the location of a book it will allow you to change the books location.\n\n|Sort by |<<thisSortBySelect>>|<<thisSelectThing>>|\n|Search by |<<thisSearchBySelect>>|<$edit-text tiddler='$:/state/newbook' field='search_text' placeholder='Search'/>|\n\n<$set name=sortType value={{$:/state/newbook!!sort}}>\n<$set name=searchField value={{$:/state/newbook!!search_in}}>\n<$set name=thisSearch value={{$:/state/newbook!!search_text}}>\n<$set name=SelectedType value={{$:/state/newbook!!selected_type}}>\n<$set name=SelectedFilterPart value=<<thisMakeSelectedValue>>>\n\n<$reveal type='nomatch' state='$:/state/newbook!!selected_type' text=''>\n\tNumber of matching books: <<count1>>\n\t<table>\n\t\t<tr>\n\t\t\t<th>\n\t\t\t\tTitle\n\t\t\t</th>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=th>\n\t\t\t\tType\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=th>\n\t\t\t\tAuthor\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=th>\n\t\t\t\tLocation\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=th>\n\t\t\t\tOwner\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=th>\n\t\t\t\tSeries\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=th>\n\t\t\t\tGenre\n\t\t\t</$reveal>\n\t\t</tr>\n\t\t<<thisBookList>>\n\t</table>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!selected_type' text=''>\nNumber of matching books: <<count2>>\n\t<table>\n\t\t<tr>\n\t\t\t<th>\n\t\t\t\tTitle\n\t\t\t</th>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=th>\n\t\t\t\tType\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=th>\n\t\t\t\tAuthor\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=th>\n\t\t\t\tLocation\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=th>\n\t\t\t\tOwner\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=th>\n\t\t\t\tSeries\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=th>\n\t\t\t\tGenre\n\t\t\t</$reveal>\n\t\t</tr>\n\t\t<<thisBookList2>>\n\t</table>\n</$reveal>\n\n</$set>\n</$set>\n</$set>\n</$set>\n</$set>" }, "$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings": { "caption": "Settings", "created": "20150122105554017", "edit_author_list": "blerg", "modified": "20150130025204191", "show_author": "true", "show_genre": "true", "show_location": "true", "show_series": "true", "show_tags": "true", "title": "$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings", "text": "\\define thisRemoveAuthor()\nSelect Author: <$select tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='edit_author_list'><$list filter='[[$:/data/BookAuthors]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookAuthors##$(AuthorToRemove)$'>Remove Author</$button>\n\\end\n\n\\define thisRemoveSeries()\nSelect Series: <$select tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='edit_series_list'><$list filter='[[$:/data/SeriesTitles]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/SeriesTitles##$(SeriesToRemove)$'>Remove Series</$button>\n\\end\n\n\\define thisRemoveGenre()\nSelect Genre: <$select tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='edit_genre_list'><$list filter='[[$:/data/BookGenres]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookGenres##$(GenreToRemove)$'>Remove Genre</$button>\n\\end\n\n\\define thisRemoveLocation()\nSelect Location: <$select tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='edit_location_list'><$list filter='[[$:/data/BookLocations]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookLocations##$(LocationToRemove)$'>Remove Location</$button>\n\\end\n\n\\define thisRemoveTag()\nSelect Tag: <$select tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='edit_tag_list'><$list filter='[[$:/data/BookTags]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookTags##$(TagToRemove)$'>Remove Tag</$button>\n\\end\n\n<$checkbox tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='show_type' checked=true unchecked=false>Show Item Type</$checkbox><br>\n<$checkbox tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='show_author' checked=true unchecked=false>Show Author</$checkbox><br>\n<$checkbox tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='show_series' checked=true unchecked=false>Show Series</$checkbox><br>\n<$checkbox tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='show_genre' checked=true unchecked=false>Show Genre</$checkbox><br>\n<$checkbox tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='show_location' checked=true unchecked=false>Show Location</$checkbox><br>\n<$checkbox tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='show_owner' checked=true unchecked=false>Show Owner</$checkbox><br>\n<$checkbox tiddler='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings' field='show_tags' checked=true unchecked=false>Show Tags</$checkbox><br>\n\n!!Edit Author List\n<$set name=AuthorToRemove value={{$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!edit_author_list}}>\n<<thisRemoveAuthor>>\n</$set>\n\n!!Edit Series List\n<$set name=SeriesToRemove value={{$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!edit_series_list}}>\n<<thisRemoveSeries>>\n</$set>\n\n!!Edit Genre List\n<$set name=GenreToRemove value={{$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!edit_genre_list}}>\n<<thisRemoveGenre>>\n</$set>\n\n!!Edit Location List\n<$set name=LocationToRemove value={{$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!edit_location_list}}>\n<<thisRemoveLocation>>\n</$set>\n\n!!Edit Tag List\n<$set name=TagToRemove value={{$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!edit_tag_list}}>\n<<thisRemoveTag>>\n</$set>" }, "$:/plugins/inmysocks/LibraryTracker/Library Tracker": { "book_title": "Boneshaker", "caption": "Library Tracker", "created": "20141227230052741", "list-after": "Bookmarks", "modified": "20150203222646555", "tags": "Dashboard", "title": "$:/plugins/inmysocks/LibraryTracker/Library Tracker", "text": "<<tabs \"[[$:/plugins/inmysocks/LibraryTracker/Book List]] [[$:/plugins/inmysocks/LibraryTracker/Add Books]] [[$:/plugins/inmysocks/LibraryTracker/Manage Books]] [[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]]\" \"[[$:/plugins/inmysocks/LibraryTracker/Book List]]\">>" }, "$:/plugins/inmysocks/LibraryTracker/Manage Books": { "book_title": "Foundation", "caption": "Manage Books", "created": "20141227230045301", "modified": "20150202040126066", "title": "$:/plugins/inmysocks/LibraryTracker/Manage Books", "text": "\\define thisMakeSelectedValue()\n$(sortType)$[$(SelectedType)$]\n\\end\n\n\\define count1()\n<$count filter='[tag[Book]$(SelectedFilterPart)$sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]'/>\n\\end\n\n\\define count2()\n<$count filter='[tag[Book]sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]'/>\n\\end\n\n\\define thisSetType()\n<$reveal type='nomatch' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='edit'>\n\t\t<$view tiddler=\"\"\"$(CurrentBook)$\"\"\" field=item_type/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='noedit'>\n\t\t{{$:/core/images/done-button}}\n\t</$button>\n\t<$select tiddler=\"\"\"$(CurrentBook)$\"\"\" field='item_type'>\n\t\t<$list filter='[[$:/data/BookTypes]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<<currentTiddler>>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisSetAuthor()\n<$reveal type='nomatch' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='edit'>\n\t\t<$view tiddler=\"\"\"$(CurrentBook)$\"\"\" field=author/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='noedit'>\n\t\t{{$:/core/images/done-button}}\n\t</$button>\n\t<$select tiddler=\"\"\"$(CurrentBook)$\"\"\" field='author'>\n\t\t<$list filter='[[$:/data/BookAuthors]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<<currentTiddler>>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisSetLocation()\n<$reveal type='nomatch' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='edit'>\n\t\t<$view tiddler=\"\"\"$(CurrentBook)$\"\"\" field=location/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='noedit'>\n\t\t{{$:/core/images/done-button}}\n\t</$button>\n\t<$select tiddler=\"\"\"$(CurrentBook)$\"\"\" field='location'>\n\t\t<$list filter='[[$:/data/BookLocations]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<<currentTiddler>>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisSetOwner()\n<$reveal type='nomatch' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='edit'>\n\t\t<$view tiddler=\"\"\"$(CurrentBook)$\"\"\" field=owner/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='noedit'>\n\t\t{{$:/core/images/done-button}}\n\t</$button>\n\t<$select tiddler=\"\"\"$(CurrentBook)$\"\"\" field='owner'>\n\t\t<$list filter='[[$:/data/BookOwners]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<<currentTiddler>>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisSetSeries()\n<$reveal type='nomatch' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='edit'>\n\t\t<$view tiddler=\"\"\"$(CurrentBook)$\"\"\" field=series/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='noedit'>\n\t\t{{$:/core/images/done-button}}\n\t</$button>\n\t<$select tiddler=\"\"\"$(CurrentBook)$\"\"\" field='series'>\n\t\t<$list filter='[[$:/data/SeriesTitles]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<<currentTiddler>>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisSetGenre()\n<$reveal type='nomatch' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='edit'>\n\t\t<$view tiddler=\"\"\"$(CurrentBook)$\"\"\" field=genre/>\n\t</$button>\n</$reveal>\n<$reveal type='match' state=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" text='edit'>\n\t<$button class='tc-btn-invisible' set=\"\"\"$:/state/Library Tracker/$(CurrentBook)$\"\"\" setTo='noedit'>\n\t\t{{$:/core/images/done-button}}\n\t</$button>\n\t<$select tiddler=\"\"\"$(CurrentBook)$\"\"\" field='genre'>\n\t\t<$list filter='[[$:/data/BookGenres]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<<currentTiddler>>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisBookList()\n<$list filter='[tag[Book]$(SelectedFilterPart)$sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]' variable=CurrentBook>\n\t<tr>\n\t\t<td>\n\t\t\t<$link to=<<CurrentBook>>>\n\t\t\t\t<$view tiddler=<<CurrentBook>> field='title'/>\n\t\t\t</$link>\n\t\t</td>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=td>\n\t\t\t<<thisSetType>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=td>\n\t\t\t<<thisSetAuthor>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=td>\n\t\t\t<<thisSetLocation>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=td>\n\t\t\t<<thisSetOwner>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=td>\n\t\t\t<<thisSetSeries>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=td>\n\t\t\t<<thisSetGenre>>\n\t\t</$reveal>\n\t</tr>\n</$list>\n\\end\n\n\\define thisBookList2()\n<$list filter='[tag[Book]sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]' variable=CurrentBook>\n\t<tr>\n\t\t<td>\n\t\t\t<$link to=<<CurrentBook>>>\n\t\t\t\t<$view tiddler=<<CurrentBook>> field='title'/>\n\t\t\t</$link>\n\t\t</td>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=td>\n\t\t\t<<thisSetType>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=td>\n\t\t\t<<thisSetAuthor>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=td>\n\t\t\t<<thisSetLocation>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=td>\n\t\t\t<<thisSetOwner>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=td>\n\t\t\t<<thisSetSeries>>\n\t\t</$reveal>\n\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=td>\n\t\t\t<<thisSetGenre>>\n\t\t</$reveal>\n\t</tr>\n</$list>\n\\end\n\n\\define thisSelectThing()\n<$reveal type='match' state='$:/state/newbook!!sort' text='author'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t<option value=''>\n\t\tAll\n\t</option>\n\t\t<$list filter='[[$:/data/BookAuthors]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='genre'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookGenres]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='series'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/SeriesTitles]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='location'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookLocations]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='owner'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookOwners]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!sort' text='type'>\n\t<$select tiddler='$:/state/newbook' field='selected_type'>\n\t\t<option value=''>\n\t\t\tAll\n\t\t</option>\n\t\t<$list filter='[[$:/data/BookTypes]indexes[]]'>\n\t\t\t<option>\n\t\t\t\t<$view field='title'/>\n\t\t\t</option>\n\t\t</$list>\n\t</$select>\n</$reveal>\n\\end\n\n\\define thisSortBySelect()\n<$select tiddler='$:/state/newbook' field='sort' default='title'>\n\t<option value='title'>\n\t\tTitle\n\t</option>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_author[false]]'>\n\t\t<option value='author'>\n\t\t\tAuthor\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_genre[false]]'>\n\t\t<option value='genre'>\n\t\t\tGenre\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_series[false]]'>\n\t\t<option value='series'>\n\t\t\tSeries\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_location[false]]'>\n\t\t<option value=location>\n\t\t\tLocation\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_type[false]]'>\n\t\t<option value=item_type>\n\t\t\tItem Type\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_owner[false]]'>\n\t\t<option value=owner>\n\t\t\tOwner\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\n\\define thisSearchBySelect()\n<$select tiddler='$:/state/newbook' field='search_in' default='title'>\n\t<option value='tags'>\n\t\tTag\n\t</option>\n\t<option value='title'>\n\t\tTitle\n\t</option>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_author[false]]'>\n\t\t<option value='author'>\n\t\t\tAuthor\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_genre[false]]'>\n\t\t<option value='genre'>\n\t\t\tGenre\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_series[false]]'>\n\t\t<option value='series'>\n\t\t\tSeries\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_location[false]]'>\n\t\t<option value=location>\n\t\t\tLocation\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_type[false]]'>\n\t\t<option value=item_type>\n\t\t\tItem Type\n\t\t</option>\n\t</$list>\n\t<$list filter='[[$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings]!show_owner[false]]'>\n\t\t<option value=owner>\n\t\t\tOwner\n\t\t</option>\n\t</$list>\n</$select>\n\\end\n\nTo edit an item, click on the field you want to change and use the dropdown menu to change the value. Edits happen immediately. Click on the <$button class='tc-btn-invisible'>{{$:/core/images/done-button}}</$button> to finish editing.\n\n|Sort by |<<thisSortBySelect>>|<<thisSelectThing>>|\n|Search by |<<thisSearchBySelect>>|<$edit-text tiddler='$:/state/newbook' field='search_text' placeholder='Search'/>|\n\n<$set name=sortType value={{$:/state/newbook!!sort}}>\n<$set name=searchField value={{$:/state/newbook!!search_in}}>\n<$set name=thisSearch value={{$:/state/newbook!!search_text}}>\n<$set name=SelectedType value={{$:/state/newbook!!selected_type}}>\n<$set name=SelectedFilterPart value=<<thisMakeSelectedValue>>>\n\n<$reveal type='nomatch' state='$:/state/newbook!!selected_type' text=''>\n\tNumber of matching books: <<count1>>\n\t<table>\n\t\t<tr>\n\t\t\t<th>\n\t\t\t\tTitle\n\t\t\t</th>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=th>\n\t\t\t\tType\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=th>\n\t\t\t\tAuthor\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=th>\n\t\t\t\tLocation\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=th>\n\t\t\t\tOwner\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=th>\n\t\t\t\tSeries\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=th>\n\t\t\t\tGenre\n\t\t\t</$reveal>\n\t\t</tr>\n\t\t<<thisBookList>>\n\t</table>\n</$reveal>\n<$reveal type='match' state='$:/state/newbook!!selected_type' text=''>\nNumber of matching books: <<count2>>\n\t<table>\n\t\t<tr>\n\t\t\t<th>\n\t\t\t\tTitle\n\t\t\t</th>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_type' text=false tag=th>\n\t\t\t\tType\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_author' text=false tag=th>\n\t\t\t\tAuthor\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_location' text=false tag=th>\n\t\t\t\tLocation\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_owner' text=false tag=th>\n\t\t\t\tOwner\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_series' text=false tag=th>\n\t\t\t\tSeries\n\t\t\t</$reveal>\n\t\t\t<$reveal type='nomatch' state='$:/plugins/inmysocks/LibraryTracker/Library Tracker Settings!!show_genre' text=false tag=th>\n\t\t\t\tGenre\n\t\t\t</$reveal>\n\t\t</tr>\n\t\t<<thisBookList2>>\n\t</table>\n</$reveal>\n\n</$set>\n</$set>\n</$set>\n</$set>\n</$set>" } } }
/*\ title: $:/plugins/inmysocks/MathyThing/action-storecount.js type: application/javascript module-type: widget Count widget \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; var Widget = require("$:/core/modules/widgets/widget.js").widget; var MyCountWidget = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); }; /* Inherit from the base widget class */ MyCountWidget.prototype = new Widget(); /* Render this widget into the DOM */ MyCountWidget.prototype.render = function(parent,nextSibling) { this.computeAttributes(); this.execute(); }; /* Compute the internal state of the widget */ MyCountWidget.prototype.execute = function() { this.actionTiddler = this.getAttribute("$tiddler",this.getVariable("currentTiddler")); this.actionField = this.getAttribute("$field","store_field"); this.actionIndex = this.getAttribute("$index"); this.filter = this.getAttribute("$filter"); this.defaultVal = this.getAttribute("$default",0); // Execute the filter if(this.filter) { this.currentCount = this.wiki.filterTiddlers(this.filter,this).length; } else { this.currentCount = this.defaultVal; } this.actionValue = this.currentCount.toString(); }; /* Refresh the widget by ensuring our attributes are up to date */ MyCountWidget.prototype.refresh = function(changedTiddlers) { var changedAttributes = this.computeAttributes(); if(changedAttributes["$tiddler"] || changedAttributes["$field"] || changedAttributes["$index"] || changedAttributes["$lower"] || changedAttributes["$upper"] || changedAttributes["$step"]) { this.refreshSelf(); return true; } return this.refreshChildren(changedTiddlers); }; /* Invoke the action associated with this widget */ MyCountWidget.prototype.invokeAction = function(triggeringWidget,event) { var self = this; if(typeof this.actionValue === "string") { this.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue); } return true; // Action was invoked }; exports["action-storecount"] = MyCountWidget; })();
{ "tiddlers": { "$:/plugins/inmysocks/randVal/action-randval.js": { "text": "/*\\\ntitle: $:/plugins/inmysocks/randVal/action-randval.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler to a random number.\n\n<$action-randval $tiddler=someTiddler $field=store_field $lower=1 $upper=6 $step=1/>\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 RandValWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRandValWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRandValWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nRandValWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\",\"store_field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\n\tvar numrolls = this.getAttribute(\"$numrolls\",1);\t\n\tvar lower = this.getAttribute(\"$lower\",1);\n\tvar upper = this.getAttribute(\"$upper\",6);\n\tvar step = this.getAttribute(\"$step\",1);\n\t\n\tvar numpts = ((upper)-(lower))/(step)+1;\n\tvar size = (upper)-(lower);\n\tif ( numpts <= 1 ) {\n\t var output = Number(numrolls*lower);\n\t} else {\n\t\tvar output = 0;\n\t\tfor (var i = 0; i < Number(numrolls); i++) {\n\t\t output = Number(output) + (Math.floor(Math.random()*numpts)*(step)+Number(lower));\n\t\t}\n\t if ( Number(output) > Number(numrolls)*Number(upper) ) {\n\t var output = Number(numrolls*upper);\n\t }\n\t} \n\tthis.actionValue = String(output);\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nRandValWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$lower\"] || changedAttributes[\"$upper\"] || changedAttributes[\"$step\"] || changedAttributes[\"$numrolls\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nRandValWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this;\n\tif(typeof this.actionValue === \"string\") {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue);\t\t\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-randval\"] = RandValWidget;\n\n})();\n", "title": "$:/plugins/inmysocks/randVal/action-randval.js", "type": "application/javascript", "module-type": "widget" }, "$:/plugins/inmysocks/randVal/readme": { "title": "$:/plugins/inmysocks/randVal/readme", "text": "This plugin contains a widget that generates a random number and stores it in a specified field. It is a modification of the action-setfield widget and acts identically with the exception of the value the field is set to.\n\nThis plugin also contains a javascript macro that acts similarly to the widget.\n\nThe macro will take the following inputs\n*''lower'' - the lower bound of the random numbers generated, defaults to 1.\n*''upper'' - the upper bound on the random numbers generated, defaults to 6.\n*''step'' - the step size of the random numbers generated (that is all random numbers will be in the form rand = lowerBound+n*stepSize where n is an integer and lowerBound <= rand <= upperBound) stepSize defaults to 1 (so integer outputs). If stepSize > upperBound-lowerBound than the output will always be lowerBound\n*''numrolls'' - the number of times to roll a random number and sum the results, defaults to 1 if no value is given.\n\nThe Widget takes these additional inputs\n*''tiddler''- the tiddler that will contain the random value, defaults to `<<currentTiddler>>`\n*''field'' - the field of the specified tiddler that will hold the random value, defaults to `store_field`.\n\n!Widget example code:\n\n```\n<$button>\n<$action-randval $tiddler=tiddlerName $field=fieldName $lower=lowerBound $upper=upperBound $step=stepSize $numrolls=numberOfRolls/>\nGenerate Random Value\n</$button>\n```\n\nThe code will put a random number in the field `fieldName` of the tiddler `tiddlerName`. The number will be the sum of numberOfRolls numbers between `lowerBound` and `upperBound` inclusive.\n\n!Another example:\n\n```\n<$button>Roll Dice!\n<$action-randval $field=fieldName/>\n</$button>\n```\n\nWhen the button is pressed, the code will generate a random integer between 1 and 6 inclusive and store it in the field fieldName. So it is equivalent to rolling a normal 6 sided dice.\n\n!How randVal is generated (pseudocode):\n\nnum_steps = (upperBound-lowerBound)/stepSize+1\n\noutput = 0\n\nfor i=1 to num_rolls\n\n n = floor(num_steps*random())\n \n output = output + lowerBound+n*stepSize\n \nend\n\nreturn output\n " } } }
{ "tiddlers": { "$:/plugins/inmysocks/StartupActions/startup-actions.js": { "text": "/*\\\ntitle: $:/plugins/inmysocks/StartupActions/startup-actions.js\ntype: application/javascript\nmodule-type: startup\n\nStartup Actions Script thing\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t// Export name and synchronous status\n\texports.name = \"startup-actions\";\n\texports.platforms = [\"browser\"];\n\texports.after = [\"rootwidget\"];\n\texports.synchronous = true;\n\n\texports.startup = function() {\n\t\t// Do all actions on startup.\n\t\tvar tiddlersFilter = \"[tag[$:/tags/StartupAction]!has[draft.of]]\";\n\t\tvar expressionTiddlerList = $tw.wiki.filterTiddlers(tiddlersFilter);\n\t\tif(expressionTiddlerList.length !== 0) {\n\t\t\tfor (var j = 0; j < expressionTiddlerList.length; j++) {\n\t\t\t\tvar expressionTiddler = $tw.wiki.getTiddler(expressionTiddlerList[j]);\n\t\t\t\tif(expressionTiddler) {\n\t\t\t\t\tevaluateExpression(expressionTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// This should be simple, it just takes each expression tiddler and triggers all of the action widgets in its text field.\n\tfunction evaluateExpression(expressionTiddler) {\n\t\tif(expressionTiddler) {\n\t\t\t// Import all the variables because the widget isn't part of the main tiddlywiki stuff so the global macros and similar things aren't loaded by default.\n\t\t\tvar stringPassed = \"<$importvariables filter='[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]] [[\" + expressionTiddler.getFieldString(\"title\") + \"]]'>\"+expressionTiddler.getFieldString(\"text\")+\"</$importvariables>\";\n\t\t\tvar parsed = $tw.wiki.parseText(\"text/vnd.tiddlywiki\", stringPassed, {});\n\t\t\tvar widgets = $tw.wiki.makeWidget(parsed, {parentWidget:$tw.rootWidget});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\n\t\t\t// If a filter is given for the action tiddlers do the actions in each returned tiddler.\n\t\t\tif(expressionTiddler.getFieldString(\"action_filter\")) {\n\t\t\t\tvar actionTiddlerList = $tw.wiki.filterTiddlers(expressionTiddler.getFieldString(\"action_filter\"));\n\t\t\t\tfor (var k = 0; k < actionTiddlerList.length; k++) {\n\t\t\t\t\tperformAction(actionTiddlerList[k], widgets, container);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If no filter for the action tiddlers is given just evaluate the expressions.\n\t\t\t\tvar expressionTiddlerTitle = expressionTiddler.getFieldString(\"title\");\n\t\t\t\tperformAction(expressionTiddlerTitle, widgets, container);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Invoke the action(s).\n\tfunction performAction(tiddler, widgets, container) {\n\t\twidgets.setVariable(\"currentTiddler\", tiddler);\n\t\twidgets.render(container, null);\n\t\tif(widgets) {\n\t\t\twidgets.invokeActions({});\n\t\t}\n\t}\n\n})();\n", "title": "$:/plugins/inmysocks/StartupActions/startup-actions.js", "type": "application/javascript", "module-type": "startup" } } }
{ "tiddlers": { "$:/plugins/inmysocks/Twitter/Twitter Macros": { "tags": "$:/tags/Macro", "title": "$:/plugins/inmysocks/Twitter/Twitter Macros", "text": "\\define PartialTwitterLink()\n<a class=\"twitter-share-button\"\n href=\"https://twitter.com/share\"\n data-url=<<twitterify-permalink \"$(ThisTitle)$\">>>\nTweet\n</a>\n\\end\n\n\\define TwitterShareTiddlerButton()\n<$set name=ThisTitle value=<<currentTiddler>>>\n<<PartialTwitterLink>>\n</$set>\n\\end" }, "$:/plugins/inmysocks/Twitter/TwitterJavaScript": { "tags": "$:/tags/RawMarkup", "title": "$:/plugins/inmysocks/Twitter/TwitterJavaScript", "text": "<script>window.twttr=(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return;js=d.createElement(s);js.id=id;js.src=\"https://platform.twitter.com/widgets.js\";fjs.parentNode.insertBefore(js,fjs);t._e=[];t.ready=function(f){t._e.push(f);};return t;}(document,\"script\",\"twitter-wjs\"));</script>" }, "$:/plugins/inmysocks/Twitter/TwitterfiURL.js": { "text": "/*\\\ntitle: $:/plugins/inmysocks/Twitter/TwitterfiURL.js\ntype: application/javascript\nmodule-type: macro\n\nTakes a string and puts in the proper escape characters for urls so it can be posted to twitter using web intents.\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 = \"twitterify-url\";\n\nexports.params = [\n {name: \"url\"},\n {name: \"text\"},\n {name: \"full\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(url, text, full) {\n var conditionedURL = \"\";\n if(url) {\n var unconditionedURL = url;\n\n var splitSpaces = unconditionedURL.split(' ');\n var replacedSpaces = splitSpaces.join('%2520');\n var splitHash = replacedSpaces.split('#');\n var replacedHash = splitHash.join('%23');\n var splitQuestion = replacedHash.split('?');\n var replacedQuestion = splitQuestion.join('%253F');\n var splitAppostrophe = replacedQuestion.split(\"'\");\n var replacedAppostrophe = splitAppostrophe.join('%27');\n conditionedURL = replacedAppostrophe;\n }\n \n if (text) {\n var thisText = text;\n var textSplitSpaces = thisText.split(' ');\n var textReplacedSpaces = textSplitSpaces.join('%20');\n var textSplitHash = textReplacedSpaces.split('#');\n var textReplacedHash = textSplitHash.join('%23');\n var textSplitAppostrophe = textReplacedHash.split(\"'\");\n var textReplacedAppostrophe = textSplitAppostrophe.join('%27');\n var conditionedText = textReplacedAppostrophe;\n if(full) {\n var TweetText = conditionedText + \"%20Original%20post%3A%20\" + conditionedURL;\n } else {\n var TweetText = conditionedText + \"%20Full%20post%3A%20\" + conditionedURL;\n }\n var link = \"https://twitter.com/intent/tweet?text=\"+TweetText;\n } else {\n var link = \"https://twitter.com/intent/tweet?text=\"+conditionedURL;\n }\n var result = \"<a href=\\'\"+link+\"\\'>Tweet</a>\";\n return result;\n};\n\n})();\n", "title": "$:/plugins/inmysocks/Twitter/TwitterfiURL.js", "type": "application/javascript", "module-type": "macro" }, "$:/plugins/inmysocks/Twitter/TwitterifyPermalink.js": { "text": "/*\\\ntitle: $:/plugins/inmysocks/Twitter/TwitterifyPermalink.js\ntype: application/javascript\nmodule-type: macro\n\nReturns the permalink for the input tiddler\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 = \"twitterify-permalink\";\n\nexports.params = [\n {name: \"tiddler\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(tiddler) {\n var permalink = '';\n console.log(tiddler);\n if(tiddler) {\n /*\n $tw.locationHash = \"#\" + encodeURIComponent(tiddler);\n permalink = window.location.toString().split(\"#\")[0] + $tw.locationHash;\n */\n var unconditionedURL = tiddler;\n\n var splitSpaces = unconditionedURL.split(' ');\n var replacedSpaces = splitSpaces.join('%20');\n var splitHash = replacedSpaces.split('#');\n var replacedHash = splitHash.join('%23');\n var splitQuestion = replacedHash.split('?');\n var replacedQuestion = splitQuestion.join('%3F');\n var splitAppostrophe = replacedQuestion.split(\"'\");\n var replacedAppostrophe = splitAppostrophe.join('%27');\n var conditionedURL = replacedAppostrophe;\n\n permalink = window.location.toString().split(\"#\")[0] + \"#\" + conditionedURL;\n }\n return permalink;\n};\n\n})();\n", "title": "$:/plugins/inmysocks/Twitter/TwitterifyPermalink.js", "type": "application/javascript", "module-type": "macro" }, "$:/plugins/inmysocks/Twitter/twitter-daemon.js": { "text": "/*\\\ntitle: $:/plugins/inmysocks/Twitter/twitter-daemon.js\ntype: application/javascript\nmodule-type: startup\n\nTwitter JavaScript Update Daemon\n\nthe expression tag is set in the corfiguration tiddler, each expression tiddler will have a filter in the text field that will set the tiddlers affected by the actions in the other fields\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t// Export name and synchronous status\n\texports.name = \"twitter-daemon\";\n\texports.platforms = [\"browser\"];\n\texports.after = [\"render\"];\n\texports.synchronous = true;\n\n\texports.startup = function() {\n\t\t// Reset the values when any of the tiddlers change\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif(twttr.widgets) {\n\t\t\t\ttwttr.widgets.load();\n\t\t\t}\n\t\t});\n\t};\n})();\n", "title": "$:/plugins/inmysocks/Twitter/twitter-daemon.js", "type": "application/javascript", "module-type": "startup" } } }
/*\ title: $:/plugins/inmysocks/Twitter/TwitterfiURL.js type: application/javascript module-type: macro Takes a string and puts in the proper escape characters for urls so it can be posted to twitter using web intents. \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; /* Information about this macro */ exports.name = "twitterify-url"; exports.params = [ {name: "url"}, {name: "text"}, {name: "full"} ]; /* Run the macro */ exports.run = function(url, text, full) { var conditionedURL = ""; if(url) { var unconditionedURL = url; var splitSpaces = unconditionedURL.split(' '); var replacedSpaces = splitSpaces.join('%2520'); var splitHash = replacedSpaces.split('#'); var replacedHash = splitHash.join('%23'); var splitQuestion = replacedHash.split('?'); var replacedQuestion = splitQuestion.join('%253F'); var splitAppostrophe = replacedQuestion.split("'"); var replacedAppostrophe = splitAppostrophe.join('%27'); conditionedURL = replacedAppostrophe; } if (text) { var thisText = text; var textSplitSpaces = thisText.split(' '); var textReplacedSpaces = textSplitSpaces.join('%20'); var textSplitHash = textReplacedSpaces.split('#'); var textReplacedHash = textSplitHash.join('%23'); var textSplitAppostrophe = textReplacedHash.split("'"); var textReplacedAppostrophe = textSplitAppostrophe.join('%27'); var conditionedText = textReplacedAppostrophe; if(full) { var TweetText = conditionedText + "%20Original%20post%3A%20" + conditionedURL; } else { var TweetText = conditionedText + "%20Read%20Full%20Post%3A%20" + conditionedURL; } var link = "https://twitter.com/intent/tweet?text="+TweetText; } else { var link = "https://twitter.com/intent/tweet?text="+conditionedURL; } var result = "<a href=\'"+link+"\'>Tweet</a>"; return result; }; })();
<script>window.twttr=(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return;js=d.createElement(s);js.id=id;js.src="https://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);t._e=[];t.ready=function(f){t._e.push(f);};return t;}(document,"script","twitter-wjs"));</script>
/*\ title: $:/plugins/inmysocks/word-count.js type: application/javascript module-type: widget A widget to count the number of words or characters in a tiddlr/field/input string With thanks to Skeeve for the original macro version this is based on Usage: <$word-count tiddler=SomeTiddler field=some_field mode=word/> <$word-count text="some text string" mode=character/> <$word-count tiddler=SomeTiddler mode=character colors="blue:10,green:50,red:100"/> \*/ (function(){ /*jslint node: true, browser: true */ /*global $tw: false */ "use strict"; var Widget = require("$:/core/modules/widgets/widget.js").widget; var WordCount = function(parseTreeNode,options) { this.initialise(parseTreeNode,options); }; /* Inherit from the base widget class */ WordCount.prototype = new Widget(); /* Render this widget into the DOM */ WordCount.prototype.render = function(parent,nextSibling) { this.parentDomNode = parent; this.computeAttributes(); this.execute(); var textNode = this.document.createTextNode(this.currentCount); /*parent.insertBefore(textNode,nextSibling); this.domNodes.push(textNode);*/ var domNode = this.document.createElement("span"); parent.insertBefore(domNode,nextSibling); this.renderChildren(domNode,null); this.domNodes.push(domNode); }; /* Compute the internal state of the widget */ WordCount.prototype.execute = function() { var color_array = []; var count_array = []; var i; // Get parameters from our attributes this.mode = this.getAttribute("mode", "word"); this.tiddler = this.getAttribute("tiddler",this.getVariable("currentTiddler")); this.field = this.getAttribute("field"); this.countText = this.getAttribute("text"); this.colors = this.getAttribute("colors"); //Find the color cut-offs, if any. if(this.colors) { var color_array1 = this.colors.split(','); color_array1.sort(function sortfunction(a, b){ return a.split(':')[1] - b.split(':')[1]; }); for(i = 0; i < color_array1.length; i++) { color_array[i] = color_array1[i].split(':')[0]; count_array[i] = color_array1[i].split(':')[1]; } } // Count letters or words as appropriate. if(this.countText) { this.currentCount = this.countText.length; } else if(this.tiddler) { var tiddler = this.wiki.getTiddler(this.tiddler); if(tiddler) { var text = tiddler.getFieldString("text"); if(this.mode === "word") { this.currentCount = text.match(/\w+/g).length.toString(); } else if(this.mode === "character") { this.currentCount = text.length.toString(); } else { this.currentCount = undefined; } } } else { this.currentCount = undefined; } //If this.currentCount is long enough set the color. It is the color with the largest value that is less than this.currentCount. //If no color has a large enough value do nothing. if(this.currentCount) { if(color_array) { for(i = 0; i < color_array.length; i++) { if(Number(this.currentCount) > Number(count_array[color_array.length - 1 - i])) { this.currentCount = '@@color:' + color_array[color_array.length -1 - i] + ';' + this.currentCount + '@@'; break; } } } } var parser = this.wiki.parseText("text/vnd.tiddlywiki",this.currentCount,{parseAsInline: true}); var parseTreeNodes = parser ? parser.tree : []; this.makeChildWidgets(parseTreeNodes); }; /* Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering */ WordCount.prototype.refresh = function(changedTiddlers) { // Re-execute the filter to get the count this.computeAttributes(); var oldCount = this.currentCount; this.execute(); if(this.currentCount !== oldCount) { // Regenerate and rerender the widget and replace the existing DOM node this.refreshSelf(); return true; } else { return false; } }; exports["word-count"] = WordCount; })();
This stylesheet is adapted from work by Simon Whitaker: https://github.com/simonwhitaker/github-fork-ribbon-css/ ``` <!-- TOP RIGHT RIBBON: START COPYING HERE --> <div class="github-fork-ribbon-wrapper right"><div class="github-fork-ribbon"><a href="https://github.com/simonwhitaker/github-fork-ribbon-css">Fork me on ~GitHub</a></div> </div> <!-- TOP RIGHT RIBBON: END COPYING HERE --> <!-- TOP LEFT RIBBON: START COPYING HERE --> <div class="github-fork-ribbon-wrapper left"><div class="github-fork-ribbon"><a href="https://github.com/simonwhitaker/github-fork-ribbon-css">Fork me on ~GitHub</a></div> </div> <!-- TOP LEFT RIBBON: END COPYING HERE --> <!-- BOTTOM RIGHT RIBBON: START COPYING HERE --> <div class="github-fork-ribbon-wrapper right-bottom"><div class="github-fork-ribbon"><a href="https://github.com/simonwhitaker/github-fork-ribbon-css">Fork me on ~GitHub</a></div> </div> <!-- BOTTOM RIGHT RIBBON: END COPYING HERE --> <!-- BOTTOM LEFT RIBBON: START COPYING HERE --> <div class="github-fork-ribbon-wrapper left-bottom"><div class="github-fork-ribbon"><a href="https://github.com/simonwhitaker/github-fork-ribbon-css">Fork me on ~GitHub</a></div> </div> <!-- BOTTOM LEFT RIBBON: END COPYING HERE --> ```
/* Left will inherit from right (so we don't need to duplicate code */ .github-fork-ribbon { /* The right and left lasses determine the side we attach our banner to */ position: absolute; /* Add a bit of padding to give some substance outside the "stitching" */ padding: 2px 0; /* Set the base colour */ background-color: #a00; /* Set a gradient: transparent black at the top to almost-transparent black at the bottom */ background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0.00)), to(rgba(0, 0, 0, 0.15))); background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0.00), rgba(0, 0, 0, 0.15)); background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0.00), rgba(0, 0, 0, 0.15)); background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0.00), rgba(0, 0, 0, 0.15)); background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0.00), rgba(0, 0, 0, 0.15)); background-image: linear-gradient(top, rgba(0, 0, 0, 0.00), rgba(0, 0, 0, 0.15)); filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#000000', EndColorStr='#000000'); /* Add a drop shadow */ -webkit-box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.5); box-shadow: 0px 2px 3px 0px rgba(0, 0, 0, 0.5); z-index: 999; pointer-events: auto; } .github-fork-ribbon a, .github-fork-ribbon a.tc-tiddlylink, .github-fork-ribbon a:hover, .github-fork-ribbon a.tc-tiddlylink:hover { /* Set the font */ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; font-weight: 700; color: white; /* Set the text properties */ text-decoration: none; text-shadow: 0 -1px rgba(0,0,0,0.5); text-align: center; /* Set the geometry. If you fiddle with these you'll also need to tweak the top and right values in #github-fork-ribbon. */ width: 200px; line-height: 20px; /* Set the layout properties */ display: inline-block; padding: 2px 0; /* Add "stitching" effect */ border-width: 1px 0; border-style: dotted; border-color: rgba(255,255,255,0.7); } .github-fork-ribbon-wrapper { width: 150px; height: 150px; position: absolute; overflow: hidden; top: 0; z-index: 999; pointer-events: none; } .github-fork-ribbon-wrapper.fixed { position: fixed; } .github-fork-ribbon-wrapper.left { left: 0; } .github-fork-ribbon-wrapper.right { right: 0; } .github-fork-ribbon-wrapper.left-bottom { position: fixed; top: inherit; bottom: 0; left: 0; } .github-fork-ribbon-wrapper.right-bottom { position: fixed; top: inherit; bottom: 0; right: 0; } .github-fork-ribbon-wrapper.right .github-fork-ribbon { top: 42px; right: -43px; /* Rotate the banner 45 degrees */ -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); } .github-fork-ribbon-wrapper.left .github-fork-ribbon { top: 42px; left: -43px; /* Rotate the banner -45 degrees */ -webkit-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -o-transform: rotate(-45deg); transform: rotate(-45deg); } .github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon { top: 80px; left: -43px; /* Rotate the banner -45 degrees */ -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -o-transform: rotate(45deg); transform: rotate(45deg); } .github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon { top: 80px; right: -43px; /* Rotate the banner -45 degrees */ -webkit-transform: rotate(-45deg); -moz-transform: rotate(-45deg); -o-transform: rotate(-45deg); transform: rotate(-45deg); }
<$list filter='[[$:/data/Random Background URL List]indexes[]nth{$:/state/Random Background!!number}]' variable=ThisIndex> <$action-storecount $filter='[[$:/data/Random Background URL List]indexes[]]' $tiddler='$:/state/Random Background' $field='total_num'/> <$action-randval $tiddler='$:/state/Random Background' $field='number' $lower=1 $upper={{$:/state/Random Background!!total_num}} $step=1 $numrolls=1/> <$action-setfield $tiddler='$:/state/Random Background' $field=text $value=<<ThisIndex>>/> </$list>
<$action-setfield $tiddler='$:/state/Today' $field='year' $value=<<now YYYY>>/> <$action-setfield $tiddler='$:/state/Today' $field='month' $value=<<now MM>>/> <$action-setfield $tiddler='$:/state/Today' $field='day' $value=<<now DD>>/>
subtract 84 from the tiddler width
<h1>Table of Contents Settings</h1> Table of contents icons: <$select tiddler='$:/settings/toc'><option value=''>Normal</option><option value='folder'>Font Awesome</option></$select> Why doesn't the select image show up in the select widget? If it is set to 'Font Awesome' than these two pick which icons are used for the open and closed icons. Closed Image: <$select tiddler='$:/settings/TableOfContentsSettings' field='closed_image'> <option value="""<<fa fa-folder>>"""><<fa fa-folder>></option> <option value="""<<fa fa-folder-o>>"""><<fa fa-folder-o>></option> <option value="""<<fa fa-plus>>"""><<fa fa-plus>></option> <option value="""<<fa fa-plus-circle>>"""><<fa fa-plus-circle>></option> <option value="""<<fa fa-plus-square>>"""><<fa fa-plus-square>></option> <option value="""<<fa fa-circle>>"""><<fa fa-circle>></option> <option value="""<<fa fa-circle-o>>"""><<fa fa-circle-o>></option> </$select> {{$:/settings/TableOfContentsSettings!!closed_image}}<br> Open Image: <$select tiddler='$:/settings/TableOfContentsSettings' field='open_image'> <option value="""<<fa fa-folder-open>>"""><<fa fa-folder-open>></option> <option value="""<<fa fa-folder-open-o>>"""><<fa fa-folder-open-o>></option> <option value="""<<fa fa-minus>>"""><<fa fa-minus>></option> <option value="""<<fa fa-minus-circle>>"""><<fa fa-minus-circle>></option> <option value="""<<fa fa-minus-square>>"""><<fa fa-minus-square>></option> <option value="""<<fa fa-circle>>"""><<fa fa-circle>></option> <option value="""<<fa fa-circle-o>>"""><<fa fa-circle-o>></option> </$select> {{$:/settings/TableOfContentsSettings!!open_image}}
folder
A collection of my things
Jed's Stuff
Open Source
hide
hide
hide
hide
hide
hide
hide
hide
Small Things
hide
hide
hide
http://ooktech.com/jed/externalbrain/images/Albuquerque%20from%20the%20Sandias.JPG
hide
no
hide
Nothing
$:/plugins/inmysocks/iconmenus/Top Right Menu Settings
DashboardTemplate
Tech People (Twitter)
Bookmarks by Tags
$:/core/ui/AdvancedSearch/Standard
Tech People (Twitter)
$:/plugins/inmysocks/CategoryLists/Unfinished Items
$:/plugins/inmysocks/iconmenus/Icon Menu Settings
$:/settings/TableOfContentsSettings
$:/core/ui/MoreSideBar/System
Contents
show
hide
close
close
close
close
inmysocks
me
{ "tiddlers": { "$:/info/browser": { "title": "$:/info/browser", "text": "yes" }, "$:/info/node": { "title": "$:/info/node", "text": "no" } } }
Small Thing
and
My Blog
{ "tiddlers": { "$:/themes/tiddlywiki/seamless/base": { "title": "$:/themes/tiddlywiki/seamless/base", "tags": "[[$:/tags/Stylesheet]]", "list-after": "$:/themes/tiddlywiki/vanilla/base", "text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n/*\nRules copied from Snow White\n*/\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected svg {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal-displayed {\n\t<<filter \"blur(4px)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n/*\nSeamless modifications\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t/* Drop the tiddler frame padding */\n\tbody.tc-body .tc-tiddler-frame {\n\t\tpadding: 0;\n\t}\n\n\t/* Move the sidebar up so that the title lines up */\n\tbody.tc-body .tc-sidebar-scrollable {\n\t\tpadding: 43px 0 28px 42px;\n\t}\n\n\t/* Stop the tiddler info panel from bleeding into the tiddler frame padding */\n\tbody.tc-body .tc-tiddler-info {\n\t\tmargin: 0;\n\t}\n\n\t/* Stop message boxes from bleeding into the tiddler frame padding */\n\tbody.tc-body .tc-message-box {\n\t\tmargin: 21px 0 21px 0;\n\t}\n\n}\n\n/* Use the tiddler background colour for the page background */\nhtml body.tc-body {\n\tbackground-color: <<colour background>>;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour background>>;\n}\n\n/* Adjust the colour of the page controls */\nbody.tc-body .tc-page-controls svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n/* Adjust the colour of the sidebar selected tabs */\nbody.tc-body .tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour background>>;\n}\n" } } }
{ "tiddlers": { "$:/themes/tiddlywiki/snowwhite/base": { "title": "$:/themes/tiddlywiki/snowwhite/base", "tags": "[[$:/tags/Stylesheet]]", "text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal-displayed {\n\t<<filter \"blur(4px)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\t<<background-linear-gradient \"left, rgb(216,216,216) 0%, rgb(236,236,236) 250px\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(224,224,224) 100%\">>\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgb(236,236,236) 0%, rgb(248,248,248) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n" } } }
{ "tiddlers": { "$:/themes/tiddlywiki/vanilla/themetweaks": { "title": "$:/themes/tiddlywiki/vanilla/themetweaks", "tags": "$:/tags/ControlPanel/Appearance", "caption": "Theme Tweaks", "text": "\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\">\n<$link to=\"\">\n(none)\n</$link>\n<hr>\n<$list filter=\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[sort[title]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\">Scroll with tiddlers</option>\n<option value=\"fixed\">Fixed to window</option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\">Auto</option>\n<option value=\"cover\">Cover</option>\n<option value=\"contain\">Contain</option>\n</$select>\n\\end\n\nYou can tweak certain aspects of the ''Vanilla'' theme.\n\n! Options\n\n|[[Sidebar layout|$:/themes/tiddlywiki/vanilla/options/sidebarlayout]] |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\">Fixed story, fluid sidebar</option><option value=\"fluid-fixed\">Fluid story, fixed sidebar</option></$select> |\n|[[Sticky titles|$:/themes/tiddlywiki/vanilla/options/stickytitles]]<br>//Causes tiddler titles to \"stick\" to the top of the browser window. Caution: Does not work at all with Chrome, and causes some layout issues in Firefox// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">No</option><option value=\"yes\">Yes</option></$select> |\n\n! Settings\n\n|[[Font family|$:/themes/tiddlywiki/vanilla/settings/fontfamily]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|[[Code font family|$:/themes/tiddlywiki/vanilla/settings/codefontfamily]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|[[Page background image|$:/themes/tiddlywiki/vanilla/settings/backgroundimage]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|[[Page background image attachment |$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment]] |<<backgroundimageattachment-dropdown>> | |\n|[[Page background image size |$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize]] |<<backgroundimagesize-dropdown>> | |\n\n! Sizes\n\n|[[Font size|$:/themes/tiddlywiki/vanilla/metrics/fontsize]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|[[Line height|$:/themes/tiddlywiki/vanilla/metrics/lineheight]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|[[Font size for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|[[Line height for tiddler body|$:/themes/tiddlywiki/vanilla/metrics/bodylineheight]] |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|[[Story left position|$:/themes/tiddlywiki/vanilla/metrics/storyleft]]<br>//how far the left margin of the story river<br>(tiddler area) is from the left of the page// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|[[Story top position|$:/themes/tiddlywiki/vanilla/metrics/storytop]]<br>//how far the top margin of the story river<br>is from the top of the page// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|[[Story right|$:/themes/tiddlywiki/vanilla/metrics/storyright]]<br>//how far the left margin of the sidebar <br>is from the left of the page// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|[[Story width|$:/themes/tiddlywiki/vanilla/metrics/storywidth]]<br>//the overall width of the story river// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|[[Tiddler width|$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth]]<br>//within the story river//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|[[Sidebar breakpoint|$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint]]<br>//the minimum page width at which the story<br>river and sidebar will appear side by side// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|[[Sidebar width|$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth]]<br>//the width of the sidebar in fluid-fixed layout// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n" }, "$:/themes/tiddlywiki/vanilla/base": { "title": "$:/themes/tiddlywiki/vanilla/base", "tags": "[[$:/tags/Stylesheet]]", "text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tpadding: 14px;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: pre;\n\twhite-space: pre-wrap;\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n white-space: pre-wrap;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: normal;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 300;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour tag-foreground>>;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-search-results {\n\tpadding-top: 14px;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg,\n.tc-search svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: auto;\n\t}\n\n\">>\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 28px;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.2em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor, .tc-tiddler-frame textarea.tc-edit-texteditor {\n\twidth: 100%;\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 48%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 3px 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n.tc-tiddler-preview-edit {\n\twidth: 48%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name {\n\tdisplay: inline-block;\n\twidth: 15%;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n\twidth: 40%;\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down-language-chooser img {\n\twidth: 2em;\n\tvertical-align: baseline;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\t\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tmax-width: 500px;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 28px;\n\tpadding: 14px 14px 14px 14px;\n\tborder: 2px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 14px;\n\tright: 14px;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: block;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground-colour: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-plugin-info-chunk {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-plugin-info-chunk h1 {\n\tfont-size: 1em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk h2 {\n\tfont-size: 0.8em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk div {\n\tfont-size: 0.7em;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info img, .tc-plugin-info svg {\n\twidth: 2em;\n\theight: 2em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-plugin-info.tc-small-icon img, .tc-plugin-info.tc-small-icon svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 1em 1em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder: 1px solid <<colour table-border>>;\n}\n\n.tc-chooser-item {\n\tborder: 8px;\n\tpadding: 2px 4px;\n}\n\n.tc-chooser-item a.tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-foreground>>;\n\tbackground-color: <<colour tiddler-link-background>>;\n}\n\n.tc-chooser-item a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n text-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n min-width: 100%;\n min-height: 100%;\n max-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n" }, "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": { "title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize", "text": "15px" }, "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": { "title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight", "text": "22px" }, "$:/themes/tiddlywiki/vanilla/metrics/fontsize": { "title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize", "text": "14px" }, "$:/themes/tiddlywiki/vanilla/metrics/lineheight": { "title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight", "text": "20px" }, "$:/themes/tiddlywiki/vanilla/metrics/storyleft": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft", "text": "0px" }, "$:/themes/tiddlywiki/vanilla/metrics/storytop": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storytop", "text": "0px" }, "$:/themes/tiddlywiki/vanilla/metrics/storyright": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storyright", "text": "770px" }, "$:/themes/tiddlywiki/vanilla/metrics/storywidth": { "title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth", "text": "770px" }, "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": { "title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth", "text": "686px" }, "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": { "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint", "text": "960px" }, "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": { "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth", "text": "350px" }, "$:/themes/tiddlywiki/vanilla/options/stickytitles": { "title": "$:/themes/tiddlywiki/vanilla/options/stickytitles", "text": "no" }, "$:/themes/tiddlywiki/vanilla/options/sidebarlayout": { "title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout", "text": "fixed-fluid" }, "$:/themes/tiddlywiki/vanilla/reset": { "title": "$:/themes/tiddlywiki/vanilla/reset", "type": "text/plain", "text": "/*! normalize.css v3.0.0 | MIT License | git.io/normalize */\n\n/**\n * 1. Set default font family to sans-serif.\n * 2. Prevent iOS text size adjust after orientation change, without disabling\n * user zoom.\n */\n\nhtml {\n font-family: sans-serif; /* 1 */\n -ms-text-size-adjust: 100%; /* 2 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/**\n * Remove default margin.\n */\n\nbody {\n margin: 0;\n}\n\n/* HTML5 display definitions\n ========================================================================== */\n\n/**\n * Correct `block` display not defined in IE 8/9.\n */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n/**\n * 1. Correct `inline-block` display not defined in IE 8/9.\n * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n */\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; /* 1 */\n vertical-align: baseline; /* 2 */\n}\n\n/**\n * Prevent modern browsers from displaying `audio` without controls.\n * Remove excess height in iOS 5 devices.\n */\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n/**\n * Address `[hidden]` styling not present in IE 8/9.\n * Hide the `template` element in IE, Safari, and Firefox < 22.\n */\n\n[hidden],\ntemplate {\n display: none;\n}\n\n/* Links\n ========================================================================== */\n\n/**\n * Remove the gray background color from active links in IE 10.\n */\n\na {\n background: transparent;\n}\n\n/**\n * Improve readability when focused and also mouse hovered in all browsers.\n */\n\na:active,\na:hover {\n outline: 0;\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Address styling not present in IE 8/9, Safari 5, and Chrome.\n */\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n/**\n * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n */\n\nb,\nstrong {\n font-weight: bold;\n}\n\n/**\n * Address styling not present in Safari 5 and Chrome.\n */\n\ndfn {\n font-style: italic;\n}\n\n/**\n * Address variable `h1` font-size and margin within `section` and `article`\n * contexts in Firefox 4+, Safari 5, and Chrome.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/**\n * Address styling not present in IE 8/9.\n */\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n/**\n * Address inconsistent and variable font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` affecting `line-height` in all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove border when inside `a` element in IE 8/9.\n */\n\nimg {\n border: 0;\n}\n\n/**\n * Correct overflow displayed oddly in IE 9.\n */\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * Address margin not present in IE 8/9 and Safari 5.\n */\n\nfigure {\n margin: 1em 40px;\n}\n\n/**\n * Address differences between Firefox and other browsers.\n */\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n/**\n * Contain overflow in all browsers.\n */\n\npre {\n overflow: auto;\n}\n\n/**\n * Address odd `em`-unit font size rendering in all browsers.\n */\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * Known limitation: by default, Chrome and Safari on OS X allow very limited\n * styling of `select`, unless a `border` property is set.\n */\n\n/**\n * 1. Correct color not being inherited.\n * Known issue: affects color of disabled elements.\n * 2. Correct font properties not being inherited.\n * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; /* 1 */\n font: inherit; /* 2 */\n margin: 0; /* 3 */\n}\n\n/**\n * Address `overflow` set to `hidden` in IE 8/9/10.\n */\n\nbutton {\n overflow: visible;\n}\n\n/**\n * Address inconsistent `text-transform` inheritance for `button` and `select`.\n * All other form control elements do not inherit `text-transform` values.\n * Correct `button` style inheritance in Firefox, IE 8+, and Opera\n * Correct `select` style inheritance in Firefox.\n */\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/**\n * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n * and `video` controls.\n * 2. Correct inability to style clickable `input` types in iOS.\n * 3. Improve usability and consistency of cursor style between image-type\n * `input` and others.\n */\n\nbutton,\nhtml input[type=\"button\"], /* 1 */\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; /* 2 */\n cursor: pointer; /* 3 */\n}\n\n/**\n * Re-set default cursor for disabled elements.\n */\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n/**\n * Remove inner padding and border in Firefox 4+.\n */\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n/**\n * Address Firefox 4+ setting `line-height` on `input` using `!important` in\n * the UA stylesheet.\n */\n\ninput {\n line-height: normal;\n}\n\n/**\n * It's recommended that you don't attempt to style these elements.\n * Firefox's implementation doesn't respect box-sizing, padding, or width.\n *\n * 1. Address box sizing set to `content-box` in IE 8/9/10.\n * 2. Remove excess padding in IE 8/9/10.\n */\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Fix the cursor style for Chrome's increment/decrement buttons. For certain\n * `font-size` values of the `input`, it causes the cursor style of the\n * decrement button to change from `default` to `text`.\n */\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n * (include `-moz` to future-proof).\n */\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; /* 2 */\n box-sizing: content-box;\n}\n\n/**\n * Remove inner padding and search cancel button in Safari and Chrome on OS X.\n * Safari (but not Chrome) clips the cancel button when the search input has\n * padding (and `textfield` appearance).\n */\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * Define consistent border, margin, and padding.\n */\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n/**\n * 1. Correct `color` not being inherited in IE 8/9.\n * 2. Remove padding so people aren't caught out if they zero out fieldsets.\n */\n\nlegend {\n border: 0; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Remove default vertical scrollbar in IE 8/9.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * Don't inherit the `font-weight` (applied by a rule above).\n * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n */\n\noptgroup {\n font-weight: bold;\n}\n\n/* Tables\n ========================================================================== */\n\n/**\n * Remove most spacing between table cells.\n */\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n" }, "$:/themes/tiddlywiki/vanilla/settings/fontfamily": { "title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily", "text": "\"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", \"DejaVu Sans\", sans-serif" }, "$:/themes/tiddlywiki/vanilla/settings/codefontfamily": { "title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily", "text": "Monaco, Consolas, \"Lucida Console\", \"DejaVu Sans Mono\", monospace" }, "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": { "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment", "text": "fixed" }, "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": { "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize", "text": "auto" }, "$:/themes/tiddlywiki/vanilla/sticky": { "title": "$:/themes/tiddlywiki/vanilla/sticky", "text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n``\n</$reveal>\n" } } }
1000px
{{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!top_bar_height}}
{{$:/themes/tiddlywiki/vanilla/metrics/storyright}}
fixed
auto
.
inmysocks
http://ooktech.com/jed/externalbrain/store.php
classic
Could also be called Domino. [img [A Gift - Image]]
I don't think that being cute and cuddly is enough to get funding for my social enterprise. Sadness.
A rogue-like, similar to The Binding of Issac, but cute instead of disturbing. I have barely made it past the first area two or three times. Unlike nethack you do have persistent progress in the form of more starting money and more options for what to buy at the start. There are unlockable characters, but I have no idea what they are or how to unlock them. I think that they are still putting out game updates pretty regularly and there may be a lot more content added. And owls are terrible. http://www.wizardslizard.com/
By leaving a comment you are giving me permission to store and post theme here on the site or not as I see fit. They will be publicity visible if posted. You don't need to leave a name or anything other than the comments content, but knowing who you are would be nice. If you want to send me a message that isn't displayed on the post than you can say that in the body and I will probably not post it. But if you want to send me a private message there are many other ways to do that. I have to put the comments onto the site for moderation and stuff, so any comments you leave won't show up until I do that. I should probably put something else here. You can see comments that didn't make it through moderation [[here|Rejected Comments]].
!!Who is this inmysocks guy? {{Who is this inmysocks guy?}} !!About this site {{About this site}}
This site is my experiment trying to make a blog (and hopefully in the future a distributed social media platform). I am making all of this up as I go along so any ideas, comments or suggestions are welcome. I have cheated a bit and used a [[google form for comments|Comments]] for the main site, but each blog post (click on the title of the post in the 'My Blog' section to open up a specific post) has individual comments if you want to leave one. Comments are moderated and I am often terrible about remembering to check them so your comments won't show up immediately. Comments are done using [[hashover|http://tildehash.com/?page=hashover]], which is an open source PHP-based comment system. I have modified it to play well with tiddlywiki and to add comment moderation. Hashover is released under the AGPL, so here is the [[source code|http://ooktech.com/hashover.zip]] used for comments on this site. ''Navigation'' - This page is generated using ~JavaScript, so for the moment it is only one page. I am hoping to make static pages for each blog post to allow search engines to index the site and make permalinks easier. For the moment if you click on the # button in the upper right of a post than the address bar will be updated with the url for that post. clicking on the {{Menu Icon - Calendar Archive}} button in the upper left will bring you to the archives, clicking on the {{$:/core/ui/Buttons/home}} icon any of the places it shows up will bring you to the default dashboard view. Hovering on the left side of the screen will open up a menu with links to the different parts of the site. The {{Menu Icon - Leave Comment}} icon anywhere it shows up will bring you to a form you can use to leave comments. It uses a google form and isn't what I want, but it is all I have that works at the moment. Other icons do other stuff, they have tooltips and won't break the site. Click on stuff and explore. If you click on the title of a post in the main dashboard view it will open up that post, you can use this to get a permalink to a post. This site is a [[TiddlyWiki|http://tiddlywiki.com]], a personal single file wiki created by Jeremy Ruston. It is extremely flexible and can be used for anything from a personal journal or blog (like this site) to an [[interactive fiction engine|http://zorklike.tiddlyspot.com/]]. It can be used in most browsers, online or offline. It is an open source project ([[tiddlywiki on github|https://github.com/Jermolene/TiddlyWiki5]]) so contributions are welcome. This site is a work in progress and will probably always be under development as I decide to try new things.
\define thisTagSelect() <$select tiddler='$:/state/Bookmarks' field='selected_tag'> <$list filter='[[$:/data/Bookmarks/BookmarkTags]indexes[]regexp:[(?i)$(tagSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end URL: <$edit-text tiddler='$:/temp/Bookmarks/NewBookmark' field=url class='tc-edit-texteditor'/> Name: <$edit-text tiddler='$:/temp/Bookmarks/NewBookmark' field=name class='tc-edit-texteditor'/> Note: <$edit-text tiddler='$:/temp/Bookmarks/NewBookmark' field=note class='tc-edit-texteditor'/> Tags (it will always be tagged with `Bookmark` by default):<br> <$reveal type=match state='$:/state/Bookmarks!!add_or_create_tag' text='create'> New Tag: <$edit-text tiddler='$:/temp/Bookmarks' field='tag_temp' placeholder='New Tag'/> <$reveal type=nomatch state='$:/temp/Bookmarks!!tag_temp' text=''> <$button>Create Tag <$action-setfield $tiddler='$:/data/Bookmarks/BookmarkTags' $index={{$:/temp/Bookmarks!!tag_temp}} $value=1/> <$action-setfield $tiddler='$:/temp/Bookmarks' $field='tag_temp' $value=''/> </$button> </$reveal> <$reveal type=match state='$:/temp/Bookmarks!!tag_temp' text=''> <$button>Create Tag</$button> </$reveal> <$button set='$:/state/Bookmarks!!add_or_create_tag' setTo='nocreate'>Done</$button><br> </$reveal> <$reveal type='nomatch' state='$:/state/Bookmarks!!add_or_create_tag' text='create'> Tag to add: <$set name=tagSearch value={{$:/temp/Bookmarks!!narrow_tag_select}}> <<thisTagSelect>> </$set> <$edit-text tiddler='$:/temp/Bookmarks' field='narrow_tag_select' placeholder='Narrow Tag List'/> <$fieldmangler tiddler='$:/temp/Bookmarks/NewBookmark'> <$button> <$action-setfield $tiddler='$:/temp/Bookmarks/NewBookmark' $field='dummy_field' value='1'/> <$action-sendmessage $message='tm-add-tag' $param={{$:/state/Bookmarks!!selected_tag}}/>Add Tag </$button>(<$button set='$:/state/Bookmarks!!add_or_create_tag' setTo='create'>New Tag</$button>) </$fieldmangler> <br> </$reveal> List of current tags:<br> <$fieldmangler tiddler='$:/temp/Bookmarks/NewBookmark'> <$list filter='[[$:/temp/Bookmarks/NewBookmark]tags[]]-[[Bookmark]]'><$view field='title'/> <$button>Remove Tag<$action-sendmessage $message='tm-remove-tag' $param=<<currentTiddler>>/></$button><br> </$list> </$fieldmangler> <$button>Add Bookmark <$action-setfield $tiddler='$:/temp/Bookmarks/NewBookmark' $field='title' $value={{$:/temp/Bookmarks/NewBookmark!!name}}/> <$action-setfield $tiddler='$:/temp/Bookmarks/NewBookmark' url='' name='' note='' tags='Bookmark'/> </$button>
\define thisSeriesSelect() <$select tiddler='$:/temp/newbook' field='series' default='None'> <$list filter='[[$:/data/SeriesTitles]indexes[]sort[title]regexp:[(?i)$(thisSeriesSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisGenreSelect() <$select tiddler='$:/temp/newbook' field='genre' default='None'> <$list filter='[[$:/data/BookGenres]indexes[]sort[title]regexp:[(?i)$(thisGenreSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisAuthorSelect() <$select tiddler='$:/temp/newbook' field='author' default='None'> <$list filter='[[$:/data/BookAuthors]indexes[]sort[title]regexp:[(?i)$(thisAuthorSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisLocationSelect() <$select tiddler='$:/temp/newbook' field='location' default='None'> <$list filter='[[$:/data/BookLocations]indexes[]sort[title]regexp:[(?i)$(thisLocationSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisTagSelect() <$select tiddler='$:/state/booktag' field='selected_tag'> <$list filter='[[$:/data/BookTags]indexes[]sort[title]regexp:[(?i)$(thisTagSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end Adding books: <!--Title--> Title: <$edit-text tiddler='$:/state/newbook' field='book_title' class='tc-edit-texteditor' placeholder='Book Title'/> <!--End Title--> <!--Author--> <$reveal type=match text=true state='Library Tracker Settings!!show_author'> Author: <$reveal state='$:/state/Library Tracker/add author' type=nomatch text='new'> <$set name=thisAuthorSearch value={{$:/state/newbook!!narrow_author_select}}> <<thisAuthorSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_author_select' placeholder='Narrow Author List'/> (<$button set='$:/state/Library Tracker/add author' setTo='new'>New Author</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add author' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_author' placeholder='Author'/><$button><$action-setfield $tiddler='$:/data/BookAuthors' $index={{$:/state/newbook!!book_author}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_author' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add author' setTo='notnew'>Done</$button> </$reveal><br> </$reveal> <!--End Author--> <!--Series--> <$reveal type=match text=true state='Library Tracker Settings!!show_series'> Series: <$reveal state='$:/state/Library Tracker/add series' type=nomatch text='new'> <$set name=thisSeriesSearch value={{$:/state/newbook!!narrow_series_select}}> <<thisSeriesSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_series_select' placeholder='Narrow Series List'/> (<$button set='$:/state/Library Tracker/add series' setTo='new'>New Series</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add series' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_series' placeholder='Series Title'/><$button><$action-setfield $tiddler='$:/data/SeriesTitles' $index={{$:/state/newbook!!book_series}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_series' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add series' setTo='notnew'>Done</$button> </$reveal><br> </$reveal> <!--End Series--> <!--Genre--> <$reveal type=match text=true state='Library Tracker Settings!!show_genre'> Genre: <$reveal state='$:/state/Library Tracker/add genre' type=nomatch text='new'> <$set name=thisGenreSearch value={{$:/state/newbook!!narrow_genre_select}}> <<thisGenreSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_genre_select' placeholder='Narrow Genre List'/> (<$button set='$:/state/Library Tracker/add genre' setTo='new'>New Genre</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add genre' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_genre' placeholder='Genre'/><$button><$action-setfield $tiddler='$:/data/BookGenres' $index={{$:/state/newbook!!book_genre}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_genre' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add genre' setTo='notnew'>Done</$button> </$reveal><br> </$reveal> <!--End Genre--> <!--Location--> <$reveal type=match text=true state='Library Tracker Settings!!show_location'> Locaction: <$reveal state='$:/state/Library Tracker/add location' type=nomatch text='new'> <$set name=thisLocationSearch value={{$:/state/newbook!!narrow_location_select}}> <<thisLocationSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_location_select' placeholder='Narrow Location List'/> (<$button set='$:/state/Library Tracker/add location' setTo='new'>New Location</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add location' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_location' placeholder='Location'/><$button><$action-setfield $tiddler='$:/data/BookLocations' $index={{$:/state/newbook!!book_location}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_location' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add location' setTo='notnew'>Done</$button> </$reveal> </$reveal> <!--End Location--> <!--Tags--> <$reveal type=match text=true state='Library Tracker Settings!!show_tags'> Tags (it will always be tagged with `Book` by default):<br> <$reveal type=match state='$:/state/newbook!!add_or_create_tag' text='create'> New Tag: <$edit-text tiddler='$:/state/booktag' field='tag_temp' placeholder='New Tag'/> <$button>Create Tag <$action-setfield $tiddler='$:/data/BookTags' $index={{$:/state/booktag!!tag_temp}} $value=1/> <$action-setfield $tiddler='$:/state/booktag' $field='tag_temp' $value=''/> </$button> <$button set='$:/state/newbook!!add_or_create_tag' setTo='nocreate'>Done</$button><br> </$reveal> <$reveal type='nomatch' state='$:/state/newbook!!add_or_create_tag' text='create'> Tag to add: <$set name=thisTagSearch value={{$:/state/newbook!!narrow_tag_select}}> <<thisTagSelect>> </$set> <$fieldmangler tiddler='$:/temp/newbook'> <$button> <$action-sendmessage $message='tm-add-tag' $param={{$:/state/booktag!!selected_tag}}/>Add Tag </$button> <$edit-text tiddler='$:/state/newbook' field='narrow_tag_select' placeholder='Narrow Tag List'/> (<$button set='$:/state/newbook!!add_or_create_tag' setTo='create'>New Tag</$button>) </$fieldmangler> <br> </$reveal> List of current tags:<br> <$fieldmangler tiddler='$:/temp/newbook'> <$list filter='[[$:/temp/newbook]tags[]]'><$view field='title'/> <$button>Remove Tag<$action-sendmessage $message='tm-remove-tag' $param=<<currentTiddler>>/></$button><br> </$list> </$fieldmangler> </$reveal> <$fieldmangler tiddler={{$:/state/newbook!!book_title}}> <$button> <$action-setfield $tiddler='$:/temp/newbook' title={{$:/state/newbook!!book_title}}/> <$action-sendmessage $message='tm-add-tag' $param='Book'/> <$action-setfield $tiddler='$:/state/newbook' book_title=''/> <$action-setfield $tiddler='$:/temp/newbook' tags=''/> Add Book</$button> </$fieldmangler>
\define thisMakeImageTiddlerName() $(ImageName)$ - Image \end \define thisMakeCanonicalURI() ./images/$(ImageName)$.$(FileExtension)$ \end \define thisMakeDisplayTiddlerText() $(ImageCaption)$ [img [$(ImageTiddlerName)$]] \end \define thisMakeTag() [[Display Image]] \end Image name: <$edit-text tiddler='$:/temp/AddImage' field='image_name' class='tc-edit-texteditor'/> Image category: <$select tiddler='$:/temp/AddImage' field='image_type'><$list filter='Photograph Drawing'><option><$view field='title'/></option></$list></$select> File extension: <$edit-text tiddler='$:/temp/AddImage' field='file_extension'/> (with no period) Image caption: <$edit-text tiddler='$:/temp/AddImage' field='image_caption' class='tc-edit-texteditor'/> <$set name=ImageName value={{$:/temp/AddImage!!image_name}}> <$set name=FileExtension value={{$:/temp/AddImage!!file_extension}}> <$set name=ImageTiddlerName value=<<thisMakeImageTiddlerName>>> <$set name=ImageCaption value={{$:/temp/AddImage!!image_caption}}> <$button>Add Image <$action-setfield $tiddler='$:/temp/AddImage/blank' _canonical_uri=<<thisMakeCanonicalURI>>/> <$action-setfield $tiddler='$:/temp/AddImage/blank' type='image/jpeg'/> <$action-setfield $tiddler='$:/temp/AddImage/blank' tags={{$:/temp/AddImage!!image_type}}/> <$action-setfield $tiddler='$:/temp/AddImage/blank' link_to=<<ImageName>>/> <$action-setfield $tiddler='$:/temp/AddImage/blank' title=<<thisMakeImageTiddlerName>>/> <$action-setfield $tiddler='$:/temp/AddImage/blank' _canonical_uri='' link_to='' tags=''/> <$action-setfield $tiddler='$:/temp/AddImage/blank2' text=<<thisMakeDisplayTiddlerText>>/> <$action-setfield $tiddler='$:/temp/AddImage/blank2' tags=<<thisMakeTag>>/> <$action-setfield $tiddler='$:/temp/AddImage/blank2' title={{$:/temp/AddImage!!image_name}}/> <$action-setfield $tiddler='$:/temp/AddImage/blank2' tags='' text=''/> <$action-setfield $tiddler='$:/temp/AddImage' image_name='' image_caption=''/> </$button> </$set> </$set> </$set> </$set>
''I should add some stuff about how to connect to dreamhost and stuff. I would put in others but that is what I use so it is what I can give reasonable instructions for.'' This requires you to have access to a server with PHP (see the hashover site for the specific requirements). You should extract the zip in Non-tiddlywiki component: *[[source code|http://ooktech.com/hashover-modified.zip]] - This is the version I use here, you can use modify the vanilla hashover code for this (from the [[hashover site|http://tildehash.com/?page=hashover]]) but it will require some small changes to make work here. I may make a list showing what needs to be done at some point. Tiddlers needed: *[[CommentModerationTemplate]] - the template used for accepting or rejecting a comment. *[[Check for new comments]] - the tiddler with the comment fetching and moderation interface *[[hashoverComments.js]] - The javascript macro that creates the comment input form *[[makeCommentTiddlers.js]] - The javascript macro that pulls information from the comments stored on the server and makes tiddlers using them *[[countComments.js]] - Used to determine if there are new comments to pull or not *[[BlogPostCommentTemplate]] - the template I use to display comments after they are accepted. The page will normally reload after you submit a comment. Very simple version since I am not in the mood to write everything up at the moment, go to any of the blog posts where you can put in comments and under the comments there is a link called 'source code' click on this link to download the files for using hashover. Then go to the [[official site|http://tildehash.com/?page=hashover]] and follow the instructions using the file you downloaded from here. It has some changes that let it work with tiddlywiki correctly. Then import the tiddler [[hashoverComments.js]] into your wiki. Anywhere you want to have comments you put a macro call like this: ``` <$macrocall $name=hashoverComments postname=<<currentTiddler>> kickback="ooktech.com/jed/externalbrain/"/> ``` where you change `ooktech.com/jed/externalbrain/` to the url for your wiki, this should be the same for all comments on your wiki and be the correct url (I think you can have `http://` or `https://` in it, but it isn't required.). The `postname` parameter is used to distinguish between different comment threads on the site and is the tiddler that the page reloads after submitting a comment.
How could you not want to live here? [img [Albuquerque from the Sandias - Image]]
.tc-tiddler-frame .tc-tiddler-body { font-family: {{$:/state/Site Accessability Options!!fontfamily}}; font-weight: {{$:/state/Site Accessability Options!!fontweight}}; font-size: {{$:/state/Site Accessability Options!!fontsize}}; line-height: {{$:/state/Site Accessability Options!!lineheight}}; word-spacing: {{$:/state/Site Accessability Options!!wordspacing}}; letter-spacing: {{$:/state/Site Accessability Options!!letterspacing}}; text-decoration: {{$:/state/Site Accessability Options!!textdecoration}}; }
<$set name=WidthOption value={{$:/settings/apperance/TiddlerWidthSettings!!width_option}}> <$set name=StoryRiverWidth filter='[[$:/settings/apperance/TiddlerWidthSettings/story_river]get<WidthOption>]'> <$set name=SidebarScrollableLeft filter='[[$:/settings/apperance/TiddlerWidthSettings/sidebar_scrollable]get<WidthOption>]'> <$set name=TiddlerFrameWidth filter='[[$:/settings/apperance/TiddlerWidthSettings/tiddler_frame]get<WidthOption>]'> .tc-story-river { width: <<StoryRiverWidth>>; left: 0px; top: 0px; padding: 42px; } .tc-sidebar-scrollable { position: fixed; top: 0px; left: <<SidebarScrollableLeft>>; bottom: 0px; right: 0px; overflow: auto; margin: 0px 0px 0px -42px; padding: 71px 0px 28px 42px; } .tc-tiddler-frame { padding: 28px 42px 42px; width: <<TiddlerFrameWidth>>; border-radius: 2px; } </$set> </$set> </$set>
Zoe Keating and Amanda Palmer, pure awesome. Bigger on the inside - http://amandapalmer.bandcamp.com/track/bigger-on-the-inside-3
Javert was spreading conspiracy theories about how I had abandoned them and they would be alone forever when I left yesterday. When I got home all 4 were competing to see who would be the one to trip me and the only way I could move without being in the center of a mass of dogs was to put them in their crates. Then they all tried to fit into Megs crate. They all seemed very excited to lie down for the night. Only another two weeks of watching a bunch of needy over excited dogs.
It has been a while since this happened. I just didn't get tired. I drew a bit and caught up on the daily show and the nightly show. I like Larry Wilmore. So yeah, in a completely expected turn of events there are riots in Baltimore. Yeah. The commentary I have seen is always either 'these are serious problems that need to be addressed' or 'they are all animals and need to die'. One thing I have noticed is that the people saying that the rioters are the scum of the earth keep brining up Martin Luther King Jr and how they should have been going to the media. As far as the media goes, the things that sparked the riots have been happening for years and are largely ignored by the large news sources. So people saying that are just saying that everyone who has a problem with the situation should sit down and shut up. And for Martin Luther King Jr, here is what he said about riots: <<< Now I wanted to say something about the fact that we have lived over these last two or three summers with agony and we have seen our cities going up in flames. And I would be the first to say that I am still committed to militant, powerful, massive, non-violence as the most potent weapon in grappling with the problem from a direct action point of view. I’m absolutely convinced that a riot merely intensifies the fears of the white community while relieving the guilt. And I feel that we must always work with an effective, powerful weapon and method that brings about tangible results. But it is not enough for me to stand before you tonight and condemn riots. It would be morally irresponsible for me to do that without, at the same time, condemning the contingent, intolerable conditions that exist in our society. These conditions are the things that cause individuals to feel that they have no other alternative than to engage in violent rebellions to get attention. And I must say tonight that a riot is the language of the unheard. And what is it America has failed to hear? It has failed to hear that the plight of the negro poor has worsened over the last twelve or fifteen years. It has failed to hear that the promises of freedom and justice have not been met. And it has failed to hear that large segments of white society are more concerned about tranquility and the status quo than about justice and humanity. <<< Which could be put into a speech about the current situation without any modification. The line "I’m absolutely convinced that a riot merely intensifies the fears of the white community while relieving the guilt." seems to be particularly relevant to many of the responses I have seen. The problem is that people seem to forget about the second half of that paragraph.
This is a test.
Since all the other comments seem to be test comments I thought I would say more. Your work on Twitter within TW5 is very useful to me. I am not a programmer so seeing something like this actually working, is great. I can made other comments if you want. Dialogue me on Twitter.
Also, this: http://www.jimchines.com/2015/03/depression/
Other notable entries: 'Medieval Cornea Scraper' and 'Agencia Nacional Stasi'.
I was feeling ok, then I remembered the next president of the US put white nationalists on his staff.
lsl;lsdsa;ladsl;lasd;lsad;lasd;lasd
Test of hashtag =#
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
When I said it seemed like Facebook wanted to become the East India company it wasn't a suggestion.
I can post to Facebook through Twitter, and I can post to Twitter from my own site. Close enough.
I really like spiderweb games. Although I am not a fan of how simplified they have made everything. Simpler than the original Exile games is good, but this may be a bit too much. http://www.spiderwebsoftware.com/avadon/index.html
While running Basset Hounds are also objectively funny, they are not as funny as Corgis.
I made my twitter account in May of 2012. I have a total of 3 tweets, all from the past 24 hours.
I think that my next tattoo will be something like this: <<imageSlider [[./images/RockSisyphusTattooIdea.jpg]] "Biggest Rock is Best Rock">> It has many important things: *Allusion to [[Greek mythology|https://en.wikipedia.org/wiki/Sisyphus]] *[[A silly joke|https://www.youtube.com/watch?v=i_APoSfCYwU]] *If you are going to try to do something impossible you may as well do something big. *I like the [[minimalist style|Lines]] I may change it so that he is pushing [[a golden apple that says KALLISTI|http://www.principiadiscordia.com/book/10.php]] up the hill with 'biggest rock is best rock' written under the line representing the hill. However it ends up there will probably be a few more versions before I decide on the final design. And there is of course the question of where I will get the tattoo, my side may not be bad, but tattoos on your ribs hurt.
*3-4 cups flour *a few table spoons baking powder *teaspoon baking soda *between half and whole stick butter (less if using cheese, more if making something like shortbread, for shortbread add about half cup sugar) *ham and cheese *cut butter thin, mix it well with flour, then add baking soda and powder and a teaspoon of salt, then ham and cheese *mix well *then add milk till its the right texture *cook at 450 about 12 minutes, make sure to greese pan
A sunset from when we were building my fathers garage. I played with the brightness and stuff a bit. [img [Black and white sunset - Image]]
<$list filter='[is[current]]'> <hr> </$list>
I have done nothing for my dissertation today.
A puzzle game with a somehow cute robot. Somehow cute because it is a cube with tiny arms and legs. http://www.swingswingsubmarine.com/games/blocks-that-matter/
\define thisYearMonth() $(ThisYear)$ - $(ThisMonth)$ \end \define thisDisplaySelectedPost() {{$(SelectedPost)$||$(Template)$}} \end \define thisSelectNumberOfPosts() Display <$select tiddler='$:/state/Blog Archive' field='list_length'><$list filter='1 2 3 4 5 6 7 8 9 10 20 30 40 50 100 200 300'><option><<currentTiddler>></option></$list></$select> posts \end Click on the calendar button ({{Menu Icon - Calendar Archives}}) in the upper left to open up the calendar based archive. Select Date: Year: <$select tiddler='$:/state/Blog Archive' field='selected_year'> <option>All</option> <$list filter='[tag[My Blog]each[year]get[year]nsort[title]]'> <option><$view field='title'/></option> </$list> </$select> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_year' text='All'> Month: <$select tiddler='$:/state/Blog Archive' field='selected_month'> <option>All</option> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}each[month]get[month]]'> <option><$view field='title'/></option> </$list> </$select> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_year' text='All'> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_month' text='All'> Day: <$select tiddler='$:/state/Blog Archive' field='selected_day'> <option>All</option> <$list filter='[tag[My Blog]month{$:/state/Blog Archive!!selected_month}each[day]get[day]nsort[title]]'> <option><$view field='title'/></option> </$list> </$select> </$reveal> </$reveal> </$reveal> <$reveal type='match' state='$:/state/Blog Archive!!selected_year' text='All'> Select Post: <$select tiddler='$:/state/Blog Archive' field='selected_post'> <option>All</option> <$list filter='[tag[My Blog]nsort[year]each[year]get[year]]' variable=ThisYear> <$list filter='[tag[My Blog]year<ThisYear>each[month]get[month]]' variable=ThisMonth> <optgroup label=<<thisYearMonth>>> <$list filter='[tag[My Blog]year<ThisYear>month<ThisMonth>nsort[day]each[day]get[day]]' variable=ThisDay> <$list filter='[tag[My Blog]year<ThisYear>month<ThisMonth>day<ThisDay>sort[title]]-[[$:/templates/blog/BasicBlogPostTemplate]]' variable=ThisPost> <option><$view tiddler=<<ThisPost>> field='title'/></option> </$list> </$list> </optgroup> </$list> </$list> </$select> <$reveal type='match' state='$:/state/Blog Archive!!selected_post' text='All'> <<thisSelectNumberOfPosts>> <$list filter='[tag[My Blog]nsort[time]limit{$:/state/Blog Archive!!list_length}]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$set name=SelectedPost value=<<currentTiddler>>> <$set name=Template filter='[title<currentTiddler>get[template]]'> <<thisDisplaySelectedPost>> </$set> </$set> </$list> </$reveal> </$reveal> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_year' text='All'> <$reveal type='match' state='$:/state/Blog Archive!!selected_month' text='All'> Select Post: <$select tiddler='$:/state/Blog Archive' field='selected_post'> <option>All</option> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}each[month]get[month]]' variable=ThisMonth> <optgroup label=<<ThisMonth>>> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}month<ThisMonth>nsort[day]]'> <option><$view field='title'/></option> </$list> </optgroup> </$list> </$select> <$reveal type='match' state='$:/state/Blog Archive!!selected_post' text='All'> <<thisSelectNumberOfPosts>> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}nsort[time]limit{$:/state/Blog Archive!!list_length}]'> <$set name=SelectedPost value=<<currentTiddler>>> <$set name=Template filter='[title<currentTiddler>get[template]]'> <<thisDisplaySelectedPost>> </$set> </$set> </$list> </$reveal> </$reveal> </$reveal> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_year' text='All'> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_month' text='All'> <$reveal type='match' state='$:/state/Blog Archive!!selected_day' text='All'> Select Post: <$select tiddler='$:/state/Blog Archive' field='selected_post'> <option>All</option> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}month{$:/state/Blog Archive!!selected_month}each[day]get[day]nsort[title]]' variable=ThisDay> <optgroup label=<<ThisDay>>> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}month{$:/state/Blog Archive!!selected_month}day<ThisDay>sort[created]]'> <option><$view field='title'/></option> </$list> </optgroup> </$list> </$select> <$reveal type='match' state='$:/state/Blog Archive!!selected_post' text='All'> <<thisSelectNumberOfPosts>> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}month{$:/state/Blog Archive!!selected_month}nsort[time]limit{$:/state/Blog Archive!!list_length}]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$set name=SelectedPost value=<<currentTiddler>>> <$set name=Template filter='[title<currentTiddler>get[template]]'> <<thisDisplaySelectedPost>> </$set> </$set> </$list> </$reveal> </$reveal> </$reveal> </$reveal> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_year' text='All'> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_month' text='All'> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_day' text='All'> Select Post: <$select tiddler='$:/state/Blog Archive' field='selected_post'> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}month{$:/state/Blog Archive!!selected_month}day{$:/state/Blog Archive!!selected_day}sort[created]]'> <option>All</option> <option><$view field='title'/></option> </$list> </$select> <$reveal type='match' state='$:/state/Blog Archive!!selected_post' text='All'> <<thisSelectNumberOfPosts>> <$list filter='[tag[My Blog]year{$:/state/Blog Archive!!selected_year}month{$:/state/Blog Archive!!selected_month}day{$:/state/Blog Archive!!selected_day}!nsort[time]limit{$:/state/Blog Archive!!list_length}]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$set name=SelectedPost value=<<currentTiddler>>> <$set name=Template filter='[title<currentTiddler>get[template]]'> <<thisDisplaySelectedPost>> </$set> </$set> </$list> </$reveal> </$reveal> </$reveal> </$reveal> <$reveal type='nomatch' state='$:/state/Blog Archive!!selected_post' text='All'> <$set name=SelectedPost value={{$:/state/Blog Archive!!selected_post}}> <$set name=Template filter='[title{$:/state/Blog Archive!!selected_post}get[template]]'> <<thisDisplaySelectedPost>> </$set> </$set> </$reveal>
<$list filter='[is[current]tag[My Blog]]'> <div id='hashover'> <$macrocall $name=hashoverComments postname=<<currentTiddler>> kickback="ooktech.com/jed/externalbrain/"/> </div> [[About Commenting]] Sort Comments: <$radio field='sort_comments' value='oldest'>Oldest First</$radio> <$radio field='sort_comments' value='newest'>Newest First</$radio> <$reveal type='nomatch' state='!!sort_comments' text='newest'> <$list filter='[tag[Comment]tag[Accepted]tag<currentTiddler>sort[sort_date]]' template=BlogPostCommentTemplate> </$list> </$reveal> <$reveal type='match' state='!!sort_comments' text='newest'> <$list filter='[tag[Comment]tag[Accepted]tag<currentTiddler>!sort[sort_date]]' template=BlogPostCommentTemplate> </$list> </$reveal> <hr> {{$:/core/ui/Buttons/home}} [[About me|Who is this inmysocks guy?]] [[About this site]] [[Blog Archive|Calendar Archives]] [[Leave a message|Comments]] [[hashover source code|http://ooktech.com/hashover-modified.zip]] </$list>
<$list filter='[is[current]tag[My Blog]]'> <div style='text-align:center'><h3><$view field=summary/></h3></div> <<TwitterShareTiddlerButton>><br> ''Posted:'' __<$view field='posted'/>__<br> </$list>
Display the <$select tiddler='$:/settings/Blog Settings' field='num_recent_posts'><$list filter="1 2 3 4 5 6 7 8 9 10"><option><<currentTiddler>></option></$list></$select> most recent posts
<div style='text-align:center'><h2><b><$button class='tc-btn-invisible' to=<<currentTiddler>>><$view field='title'/></$button></b></h2><h3><$view field=summary/></h3></div> ''Posted:'' __<$view field='posted'/>__<br> <$transclude> </$transclude> <$link to=<<currentTiddler>>>Go to post tiddler to leave a comment</$link> <hr>
<$reveal type='match' state='$:/temp/New Blog Post/type' text='Small Thing'> Character count: <$word-count tiddler='$:/temp/NewBlogPost' mode=character colors='green:0,indianred:80,red:102'/> </$reveal> Post Body: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' placeholder='Post Body'/>
<h2><b><$view field='author'/></b></h2> __<$view field='readable_date'/>__ <br> <div class='tc-tiddler-frame' style='width:100%;background-color:beige'> <$transclude mode='block'/> </div>
<div style='text-align:center'><h2><b><$view field='title'/></b></h2></div> ''Posted:'' __<$view field='posted'/>__<br> <div style='text-align:center'> <a href={{!!link}} target="_blank"> <$image width={{!!width}} tooltip={{!!tooltip}} source={{!!image}}/> </a><br> {{!!image_caption}} </div> <hr>
Image: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' placeholder='Link to Displayed Image' field='image'/><br> Caption: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' placeholder='Image Caption' field='image_caption'/><br> Tooltip: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' placeholder='Image Tooltip' field='tooltip'/><br> Link: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' placeholder='Link' field='link'/><br> Width: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' placeholder='Displayed Image Width' field='width'/><br>
\define thisBookList() <$list filter='[tag[Book]$(SelectedFilterPart)$sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]' variable=CurrentBook> <tr> <td> <$link to=<<CurrentBook>>> <$view tiddler=<<CurrentBook>> field='title'/> </$link> </td> <td> <$view tiddler=<<CurrentBook>> field=author/> </td> <td> <<thisSetLocation>> </td> <td> <$view tiddler=<<CurrentBook>> field=series/> </td> <td> <$view tiddler=<<CurrentBook>> field=genre/> </td> </tr> </$list> \end \define thisBookList2() <$list filter='[tag[Book]sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]' variable=CurrentBook> <tr> <td> <$link to=<<CurrentBook>>> <$view tiddler=<<CurrentBook>> field='title'/> </$link> </td> <td> <$view tiddler=<<CurrentBook>> field=author/> </td> <td> <<thisSetLocation>> </td> <td> <$view tiddler=<<CurrentBook>> field=series/> </td> <td> <$view tiddler=<<CurrentBook>> field=genre/> </td> </tr> </$list> \end \define thisSelectThing() <$reveal type='match' state='$:/state/newbook!!sort' text='author'> <$select tiddler='$:/state/newbook' field='selected_type'> <option value=''> All </option> <$list filter='[[$:/data/BookAuthors]indexes[]]'> <option> <$view field='title'/> </option> </$list> </$select> </$reveal> <$reveal type='match' state='$:/state/newbook!!sort' text='genre'> <$select tiddler='$:/state/newbook' field='selected_type'> <option value=''>All</option> <$list filter='[[$:/data/BookGenres]indexes[]]'> <option><$view field='title'/></option> </$list> </$select> </$reveal> <$reveal type='match' state='$:/state/newbook!!sort' text='series'> <$select tiddler='$:/state/newbook' field='selected_type'> <option value=''>All</option> <$list filter='[[$:/data/SeriesTitles]indexes[]]'> <option><$view field='title'/></option> </$list> </$select> </$reveal> <$reveal type='match' state='$:/state/newbook!!sort' text='location'> <$select tiddler='$:/state/newbook' field='selected_type'> <option value=''>All</option> <$list filter='[[$:/data/BookLocations]indexes[]]'> <option><$view field='title'/></option> </$list> </$select> </$reveal> \end \define thisMakeSelectedValue() $(sortType)$[$(SelectedType)$] \end \define count1() <$count filter='[tag[Book]$(SelectedFilterPart)$sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]'/> \end \define count2() <$count filter='[tag[Book]sort[$(sortType)$]regexp:$(searchField)$[(?i)$(thisSearch)$]]'/> \end \define thisSetLocation() <$reveal type='nomatch' state="""$:/state/Library Tracker/$(CurrentBook)$""" text='edit'> <$button class='tc-btn-invisible' set="""$:/state/Library Tracker/$(CurrentBook)$""" setTo='edit'> <$view tiddler="""$(CurrentBook)$""" field=location/> </$button> </$reveal> <$reveal type='match' state="""$:/state/Library Tracker/$(CurrentBook)$""" text='edit'> <$button class='tc-btn-invisible' set="""$:/state/Library Tracker/$(CurrentBook)$""" setTo='noedit'> {{$:/core/images/done-button}} </$button> <$select tiddler="""$(CurrentBook)$""" field='location'> <$list filter='[[$:/data/BookLocations]indexes[]]'> <option> <<currentTiddler>> </option> </$list> </$select> </$reveal> \end If you select an author/series/location/genre from the drop down menu, then change the `Sort by` option you will have to select from the second dropdown menu again to get it to display things. Despite it showing `all` when you change the sort by option it keeps the previous value, which is invalid now. If I can get a select widget to active action widgets, or to change multiple fields at the same time than I can fix this. If you click on the location of a book it will allow you to change the books location. |Sort by |<$select tiddler='$:/state/newbook' field='sort' default='title'><option value='author'>Author</option><option value='genre'>Genre</option><option value='series'>Series</option><option value='title'>Title</option><option value=location>Location</option></$select>|<<thisSelectThing>>| |Search by |<$select tiddler='$:/state/newbook' field='search_in' default='title'><option value='author'>Author</option><option value='genre'>Genre</option><option value='series'>Series</option><option value='tags'>Tag</option><option value='title'>Title</option><option value=location>Location</option></$select>|<$edit-text tiddler='$:/state/newbook' field='search_text' placeholder='Search'/>| <$set name=sortType value={{$:/state/newbook!!sort}}> <$set name=searchField value={{$:/state/newbook!!search_in}}> <$set name=thisSearch value={{$:/state/newbook!!search_text}}> <$set name=SelectedType value={{$:/state/newbook!!selected_type}}> <$set name=SelectedFilterPart value=<<thisMakeSelectedValue>>> <$reveal type='nomatch' state='$:/state/newbook!!selected_type' text=''> Number of matching books: <<count1>> <table> <tr><th>Title</th><th>Author</th><th>Location</th><th>Series</th><th>Genre</th></tr> <<thisBookList>> </table> </$reveal> <$reveal type='match' state='$:/state/newbook!!selected_type' text=''> Number of matching books: <<count2>> <table> <tr><th>Title</th><th>Author</th><th>Location</th><th>Series</th><th>Genre</th></tr> <<thisBookList2>> </table> </$reveal> </$set> </$set> </$set> </$set> </$set>
<a href={{!!url}} target="_blank"><$view field=title/></a> - {{!!note}} (<$link to={{!!title}}>Open Tiddler</$link>)<br>
<$reveal type='match' state='$:/state/reveal/Bookmarks/AddBookmark' text='show'> <$button set='$:/state/reveal/Bookmarks/AddBookmark' setTo='hide'>Done</$button><br> <$transclude tiddler='Add Bookmark'/> </$reveal> <$reveal type='nomatch' state='$:/state/reveal/Bookmarks/AddBookmark' text='show'> <$button set='$:/state/reveal/Bookmarks/AddBookmark' setTo='show'>New Bookmark</$button> </$reveal> <<tabs "[[Bookmarks List]][[Bookmarks by Tags]][[Bookmarks Settings]]">>
\define thisBookmarksListByTag() <!--Tag(s) selected--> <$reveal type='nomatch' state='$:/state/Bookmarks/BookmarksByTags' text=''> <$set name=searchSelection value={{$:/state/Bookmarks/BookmarksByTags}}> <$set name=searchSelection2 value={{$:/state/Bookmarks/BookmarksByTags2}}> <$set name=searchSelection3 value={{$:/state/Bookmarks/BookmarksByTags3}}> <$list filter='[[$:/data/Bookmarks/BookmarkTags]indexes[]<searchSelection>]'> <$transclude tiddler="$:/core/ui/TagTemplate" mode="inline"/> <ul> <!--One tag selected--> <$reveal type='match' state='$:/state/Bookmarks/BookmarksByTags2' text=''> <$list filter='[tag<currentTiddler>tag[Bookmark]sort[title]regexp[(?i)$(SearchString)$]]' template=BookmarkDisplayTemplate> </$list> </$reveal> <!--End one tag selected--> <!--Two tags selected--> <$reveal type='nomatch' state='$:/state/Bookmarks/BookmarksByTags2' text=''> <$reveal type='match' state='$:/state/Bookmarks/BookmarksByTags3' text=''> <$list filter='[tag<currentTiddler>tag<searchSelection2>tag[Bookmark]sort[title]regexp[(?i)$(SearchString)$]]' template=BookmarkDisplayTemplate> </$list> </$reveal> </$reveal> <!--End two tags selected--> <!--Three tags selected--> <$reveal type='nomatch' state='$:/state/Bookmarks/BookmarksByTags3' text=''> <$list filter='[tag<currentTiddler>tag<searchSelection2>tag<searchSelection3>tag[Bookmark]sort[title]regexp[(?i)$(SearchString)$]]' template=BookmarkDisplayTemplate> </$list> </$reveal> <!--End three tags selected--> </ul> </$list> </$set> </$set> </$set> </$reveal> <!--End tag(s) selected--> <!--No tag selected--> <$reveal type='match' state='$:/state/Bookmarks/BookmarksByTags' text=''> <$set name=searchSelection value={{$:/state/Bookmarks/BookmarksByTags}}> <$list filter='[[$:/data/Bookmarks/BookmarkTags]indexes[]sort[title]]'> <$transclude tiddler="$:/core/ui/TagTemplate" mode="inline"/> <ul> <$list filter='[tag<currentTiddler>tag[Bookmark]sort[title]]' template=BookmarkDisplayTemplate> </$list> </ul> </$list> </$set> </$reveal> <!--End no tag selected--> \end Select tag to see all bookmarks with that tag:<br><$select tiddler='$:/state/Bookmarks/BookmarksByTags'> <option value=''>(Show All Tags)</option> <$list filter='[[$:/data/Bookmarks/BookmarkTags]indexes[]sort[title]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> <$reveal state='$:/state/Bookmarks/BookmarksByTags' type='nomatch' text=''> <$select tiddler='$:/state/Bookmarks/BookmarksByTags2'> <option value=''>(All Results)</option> <$list filter='[tag[Bookmark]tag{$:/state/Bookmarks/BookmarksByTags}tags[]sort[title]]-[[Bookmark]]-[{$:/state/Bookmarks/BookmarksByTags}]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> <$reveal state='$:/state/Bookmarks/BookmarksByTags2' type='nomatch' text=''> <$select tiddler='$:/state/Bookmarks/BookmarksByTags3'> <option value=''>(All Results)</option> <$list filter='[tag[Bookmark]tag{$:/state/Bookmarks/BookmarksByTags}tag{$:/state/Bookmarks/BookmarksByTags2}tags[]sort[title]]-[[Bookmark]]-[{$:/state/Bookmarks/BookmarksByTags}]-[{$:/state/Bookmarks/BookmarksByTags2}]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> </$reveal> </$reveal> Search: <$edit-text tiddler='$:/state/Bookmarks/Search' field='search'/> <$set name='SearchString' value={{$:/state/Bookmarks/Search!!search}}> <<thisBookmarksListByTag>> </$set>
\define thisBookmarkList() <$list filter='[tag[Bookmark]regexp[(?i)$(searchString)$]sort[title]]-[[$:/temp/Bookmarks/NewBookmark]]' template=BookmarkDisplayTemplate> </$list> \end Bookmarks: (Narrow List by Name: <$edit-text tiddler='$:/temp/Bookmarks/BookmarkList' field=search_text/>)<br> <$set name=searchString value={{$:/temp/Bookmarks/BookmarkList!!search_text}}> <<thisBookmarkList>> </$set>
\define thisRemoveTag() Select Tag: <$select tiddler='Bookmarks Settings' field='edit_tag_list'> <$list filter='[[$:/data/Bookmarks/BookmarkTags]indexes[]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> <$button set='$:/data/Bookmarks/BookmarkTags##$(TagToRemove)$'>Remove Tag</$button> \end This is going to contain tools to remove tags from the potential bookmark tag list. This should be exactly what is used in the library tracker, but it isn't working here. I am confused. <$set name=TagToRemove value={{Bookmarks Settings!!edit_tag_list}}> <<thisRemoveTag>> </$set>
<$list filter="[all[current]tag[Bookmark]]"> |!Name |!Note |!Link | |<$view field=title/> |<$view field=note/> |{{!!url}} | </$list>
I am bouncing between being happy it happened and bitter that this tiny step took so much effort.
Now I can post things to twitter correctly. I am le happy. Pizza Time!!
\define thisBlogArchiveMacro(day) <$set name=Day value=$day$> <$set name=Month value={{$:/state/Blog Archives!!month}}> <$set name=Year value={{$:/state/Blog Archives!!year}}> <$set name=DayTiddlerName value=<<thisCalendarMakeDateString>>> <$set name=TiddlerExistanceCheck filter='[title<DayTiddlerName>!has[text]]'> <$reveal type='nomatch' state=<<TiddlerExistanceCheck>> text=''> <$button to=<<thisCalendarMakeDateString>> class='tc-btn-invisible' style='width:100%;height:100%;overflow:hidden;'> <div style='height:100%;width:1000%;position:relative;text-align:left;vertical-align:top;z-index=0;overflow:hidden;'> ''$day$''<br> <$list filter='[year<Year>month<Month>day<Day>]'> <$view field='title'/><br> </$list> </div> </$button> </$reveal> <$reveal type='match' state=<<TiddlerExistanceCheck>> text=''> <$button to=<<thisCalendarMakeDateString>> class='tc-btn-invisible' style='width:100%;height:100%;overflow:hidden;'> <$action-setfield $tiddler=<<DayTiddlerName>> text=<<thisBuildDayTiddlerText>>/> <div style='height:100%;width:1000%;position:relative;text-align:left;vertical-align:top;z-index=0;overflow:hidden;'> ''$day$''<br> <$list filter='[year<Year>month<Month>day<Day>]'> <$view field='title'/><br> </$list> </div> </$button> </$reveal> </$set> </$set> </$set> </$set> </$set> \end \define thisCalendarMakeDateString() $(Day)$-$(Month)$-$(Year)$ \end \define thisBuildDayTiddlerText() !Blog Posts: <$list filter='[tag[My Blog]!tag[Small Thing]day[$(Day)$]month[$(Month)$]year[$(Year)$]]'> <$link to=<<currentTiddler>>><$view field='title'/></$link> - <$view field='summary'/><br> </$list> !Small Things: <$list filter='[tag[My Blog]tag[Small Thing]day[$(Day)$]month[$(Month)$]year[$(Year)$]]'> <$link to=<<currentTiddler>>><$view field='title'/></$link> - <$view field='summary'/><br> </$list> \end If there are posts for a day than they are listed in that day. Content is cut off if it doesn't fit into the cell. Clicking on a day will open a tiddler for that day listing any posts made. If this tiddler doesn't exist, cilcking on the day will create it. I am hoping to make a tiddler gallery that lets you go to a days tiddler and then move between days like you can with the pictures. Select year: <$select tiddler='$:/state/Blog Archives' default='--' field='year'><option>--</option><$list filter='[tag[My Blog]has[year]each[year]get[year]]'><option><<currentTiddler>></option></$list></$select> Select month: <$select tiddler='$:/state/Blog Archives' field='month' default='--'><option>--</option><$list filter='[tag[My Blog]has[month]each[month]get[month]]'><option><<currentTiddler>></option></$list></$select> <$calendar-month year={{$:/state/Blog Archives!!year}} month={{$:/state/Blog Archives!!month}} day_macro='thisBlogArchiveMacro'/>
A history of the changes I have made here in case anyone is interested. !Recently Changed Tiddlers --- Show the <$select field='num_recent'> <$list filter="0 10 20 30 40"> <option><<currentTiddler>></option> </$list> </$select> most recently modified tiddlers: <$list filter='[!is[system]has[modified]!sort[modified]limit{!!num_recent}]-[[Change Log]]'> <$link to=<<currentTiddler>>><$view field='title'/></$link> - Modified on: <$view field='modified'/><br> </$list> !Description of changes --- <$list filter='[tag[Changes]!sort[created]limit{$:/settings/Change Log Settings!!num_recent_posts}]'> <h1><$view field='title'/></h1> --- <$transclude/> --- </$list> Change History: <ul> <$list filter='[tag[Changes]]'> <li><$link to=<<currentTiddler>>><$view field='title'/></$link></li> </$list> </ul>
I need to add the nopost property to the xml and from there put it as part of the comments object. Then when making the xml I need to put the post title into the generated xml. Then make the javascript macro take the post title as one of the inputs and only list comments that have the onpost property that matches the post title. It all seems so simple when I put it that way... todo: *In javascript-mode.php I need to add a thing that gives the title of the current post to whatever it is that stores this information and is used to generate the xml file. The name will be passed as a parameter to the javascript macro so use a variable for that. (add the `(function(){` stuff, add `postname` to the exports vars part, and `var postname = postname || ''` right inside `function.run` *the like function and maybe others in javascript-mode.php need to be updated to use onpost (or postname, whichever is appropriate) --- done: *Changed javascript-mode.php: wrapped entire thing in the required bits for making it a tiddlywiki javascript macro with the needed inputs. I need to expand this entry. *Changed others? almost certainly. *Changed template.xml: added `<post></post>` *Changed write_comments.php: added `$wirte_cmt->post = (isset($onpost)) ? xml_sanitize(trim($onpost, ' ')) : ''; //THIS LINE` *Changed javascript-mode.php (changed to CommentsJavascriptMacro.js for tiddlywiki): added `<input type="hidden" name=onpost value='"""'+postname+'"""'>\n\` to the reply place (line 132) *Changed javascript-mode.php (js macro version): added `<input type="hidden" name="onpost" value='"""'+ postname + '"""'>\n\` to line 187 (edit comment)
Display the <$select tiddler='$:/settings/Change Log Settings' field='num_recent_posts'><$list filter="1 2 3 4 5 6 7 8 9 10"><option><<currentTiddler>></option></$list></$select> most recent changes
I added background images, and I added a button that will randomly select a background image when pressed.
The blog now has two categories, one for long posts one for short things. You can also now sort through the archive part by year and month. I added a mechanism that prevents you from overwriting an existing tiddler with a new blog post. I fixed the search in the library tracker so that you can type more than one letter now.
The Dashboard now uses tabbed-toc-external-nav and I changed the templates so that clicking on a post title opens the tiddler and lets you get a permalink to that post. I added the calendar plugin I made to the site and used this to add the calendar based blog archives (icon in the upper left). In order to allow this I changed how blog posts are labeled with the date, now it is just a number for the date so 1 2 instead of 1st 2nd etc. I added some h-card stuff and some rel=me links so I can now use this site for [[IndieAuth|https://indieauth.com/]] web sign-in things.
Added the option for image posts
!Dashboard Tabs !!Main dashboard: Just the Dashboard plugin from my [[reference site|http://inmysocks.tiddlyspot.com]]. !!!My Blog Just what it says. !!!Bookmarks: The bookmarks (not yet packaged as a plugin) from my [[reference site|http://inmysocks.tiddlyspot.com]]. !!!Library Tracker: The same as on my [[reference site|http://inmysocks.tiddlyspot.com]]. !!!People: A list of twCards, it just has one for [[me|Jed Carty (inmysocks)]] and one for [[Rich Shumaker]] at the moment. Under mine I have a card for each of the different sites I have, both tiddlywiki and non-tiddlywiki sites. !!Add Image A form that takes the image name and a caption and makes a tiddler with the `_canonical_uri` field for the image and a tiddler to display the image with the caption, tagged so it is part of the gallery. !!New Blog Post Takes a post title, the post body text, a summary of the post and a display template and creates a blog post that is show in the `My Blog` tab of the dashboard. It has some tabs at the bottom of the tiddler: *nothing - a blank tab to hide the bottom content *one is example html, *another is a form that you can fill in and it will generate the code that you copy and paste into your post. *another is a preview of your post, the title isn't displayed correctly but the rest should be good Currently this contains: *Image links - an image that acts as a link. You set destination, image, size and tooltip. !Gallery The gallery currently uses a crude method of navigating between tiddlers, once the update for 5.1.8 happens it will have a much more sophisticated navigation setup. !Wiki Settings The wiki settings currently has *Blog Settings - set the number of recent blog posts to display *Search and Replace Fields - just what it says, useful for when I messed up making a tiddler *Search and Replace Tags - ditto. Useful. *Change Log Settings - set the number of recent changes to display !Change Log Lists the changes made
I changed the new blog post interface so that different blog post templates ask for different information. This means that a blog post template needs to have a creation template associated with it. The naming scheme is templateName_creation_template, so BlogDisplayTemplate1 has [[BlogDisplayTemplate1_creation_template]]. I will make more as I feel like it. I added a tags interface for creating blog posts. I added a way to view the archive of posts by date, you can view all, all in a year/month/day or a specific post by listing the date and selecting the post. If you view all in a year/month/day than you have an option that lets you set how many posts you want to list. I need to add a way to page through posts. I will use the stuff I made for the gallery once version 5.1.8 is out. This may not work in the dashboard. I should work on that.
I added a view template so that when you look at a blog post tiddler by itself it displays the posting date. I may add more to this at some point. I would like to override the normal view template so that the normal text doesn't show up. I should ask on the group. I fixed some things about how old posts were listed in the blog archive. I made the twitter plugin and added the twitter integration stuff to this wiki.
The tweet links on the individual posts should work correctly now. There is now an image in the background Added the menu icon to change the background to a random image Reorganized the control panel tabs so that the settings I made are under the Custom Settings tab. The sidebar is now in the right icon menu, it pops out on hover. The left menu is now set to pop out on hover and has links to different parts of the site. We shall see how this goes. I need a better color scheme.
Added css to allow dynamically sized embedded videos, added this change to the html cheat thing in the new blog post tiddler. Also added seamless theme, it doesn't look good so I am not using it. Added the change font icon to the top left menu.
I added a new blog post button to the top bar so that when I make a new post the dashboard isn't saved with the New Blog Post tab open. I may not have made one of these for when I made the menu on the left something I actually use. I may completely remove the dashboard thing and just use the left menu to navigate.
I can now post to twitter from the new blog post page. If it is short enough I can post the entire content, if it isn't than I can post the title and summary with a link to the original post. The URL is also conditioned to work. The URL part was really annoying. You can't try posting when the title field is empty. The post button now triggers saving the wiki.
<$button popup="$:/state/changetiddlerwidthpopup">Change Tiddler Width</$button> <$reveal type="popup" state="$:/state/changetiddlerwidthpopup"> <div class="tc-drop-down"> {{TiddlerWidthSettings}} </div> </$reveal>
\define thisMakeOption() {{$(ThisTiddler)$}} \end This is probably going to have some forms I can use to automatically generate some html bits. Because I am lazy, I tend to forget these things, and I can. Select what you want, fill out the form and then copy and paste the HTML generated into your post. <$select tiddler='$:/state/CheatWithHTML'> <option value=''>Nothing</option> <$list filter='[tag[Cheat With HTML]]'> <$set name=ThisTiddler value=<<currentTiddler>>> <option value=<<thisMakeOption>>><$view field='title'/></option> </$set> </$list> </$select> {{$:/state/CheatWithHTML}}
\define innerFetchComments() <$reveal type='nomatch' state='!!number_of_comments' text=<<countComments """$(ThisTiddler)$""" "jed/externalbrain/">>> <$action-setfield number_of_comments=<<countComments """$(ThisTiddler)$""" "jed/externalbrain/">>/> <$action-setfield $tiddler='$:/state/Check for new comments' new_comments=yes/> <<makeCommentTiddlers """$(ThisTiddler)$""" "ooktech.com/jed/externalbrain/">> </$reveal> \end \define fetchComments() <$reveal type='match' state='$:/state/Check for new comments!!check_comments' text='yes'> <$action-setfield new_comments=no/> <$list filter='[tag[My Blog]]'> <$set name=ThisTiddler value={{!!title}}> <<innerFetchComments>> </$set> </$list> </$reveal> <$action-setfield $tiddler='$:/state/Check for new comments' check_comments='no'/> \end \define thisEmptyMessage() <$checkbox tiddler='$:/state/Check for new comments' field='check_comments' checked='yes' unchecked='no'> Check this (this will take a while) </$checkbox> <br> <$button> <$reveal type='match' state='$:/state/Check for new comments!!check_comments' text='no'> Check the box first </$reveal> <$reveal type='nomatch' state='$:/state/Check for new comments!!check_comments' text='no'> Click me when it says to </$reveal> <<fetchComments>> </$button> <$reveal type='match' state='$:/state/Check for new comments!!check_comments' text='yes'> (Now click on the button) </$reveal> \end <$list filter='[tag[Comment]!tag[Checked]tags[]]-[[Comment]]-[[Accepted]]-[[Checked]]-[[Rejected]]' emptyMessage=<<thisEmptyMessage>>> <h1><<currentTiddler>></h1><br> <ul> <$list filter="""[tag[Comment]tag<currentTiddler>!tag[Checked]]""" template='CommentModerationTemplate'> </$list> </ul> </$list>
I finally finished moving all of my stuff to my fathers house for storage while I am in Paris. Luckly my body decided to wait until I was finished loading the car to get sick. At this time yesterday I felt like I was going to die, and that didn't seem like such a bad thing. Now I feel much better, I just feel like I am going to sleep for the next month or so. My bluetooth keyboard refused to connect to my tablet all day today, I finally got it working a minute ago. There is some terrible lag, I am not sure why. I think that susanna is the only one that hasn't gotten sick. I hope it doesn't hit her on her flight tomorrow. That would be very uncomfortable. This has been brought to you by Jed being sick and babbling. Now I am probably going to fall asleep again.
<a class="twitter-timeline" href="https://twitter.com/MaybeJed/lists/friends" data-widget-id="574989484938293248">Tweets from https://twitter.com/MaybeJed/lists/friends</a>
I think that by editing the html template used I can make the permalinks work correctly. Mostly, they won't go to specific comments, they will bring you to the correct tiddler. This isn't very useful but it should work. I am also hoping that I can make the javascript macro take inputs that will identify the current tiddler and this will be used to separate the different comment threads. The biggest problem is that the comments var in the javascript needs to be updated every time a new comment is made. Currently the only way to do this is manually. Hopefully I can make something different. Like when the page is reloaded that part is saved to a tiddler which is read and inserted into the javascript. I may be able to actually make this work. With some simple edits I could make this so that people could leave comments but they wouldn't be visible. That would be better than the google forms approach I am using now.
<$fieldmangler tiddler=<<currentTiddler>>> <li><$view field='author'/> - <$view field='text'/> - <$button>Accept<$action-sendmessage $message='tm-add-tag' $param='Checked'/><$action-sendmessage $message='tm-add-tag' $param='Accepted'/></$button> <$button>Reject<$action-sendmessage $message='tm-add-tag' $param='Checked'/><$action-sendmessage $message='tm-add-tag' $param='Rejected'/></$button></li> </$fieldmangler>
These are just general comments/messages to me. They won't be displayed on a post but you should assume that they will be accessible by the people reading the wiki if they put effort into looking, but I am not going to list them here or anything. If you want to send me a private message there are [[plenty of ways to do that|Who is this inmysocks guy?]]. ''Edit:'' Seriously, comments you post won't show up here. First I have to accept any comments for them to appear at all and second it explicitly says that comments posted on this one won't show up. Stop commenting to just say 'I am posting here just to see if it shows up'. <div id='hashover'> <$macrocall $name=hashoverComments postname=<<currentTiddler>> kickback="ooktech.com/jed/externalbrain/"/> </div> <!-- <iframe src="https://docs.google.com/forms/d/1cKQSTSrMxA9hLPv99hgJ54UPfdgMt4Bpf-wGh7udSZA/viewform?embedded=true" width="760" height="500" frameborder="0" marginheight="0" marginwidth="0">Loading...</iframe> -->
Comments should be working again. This time without licensing issues. Instructions coming soon.
But do I get emails when someone leaves a comment?
and try another comment now
So try this without the email part
and now?
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
<$scrollable> <div style='height:100%;padding-left:10px;'> @@text-align:left; <$reveal type='nomatch' state='$:/settings/toc' text='folder'> <div class='tc-table-of-contents'> <<toc-selective-expandable 'Contents' 'sort[list]'>> </div> </$reveal> <$reveal type='match' state='$:/settings/toc' text='folder'> <div class='tc-table-of-contents'> <<my-toc-selective-expandable 'Contents' 'sort[list]'>> </div> </$reveal> @@ </div> </$scrollable>
A remake/update/thing of the incredible machine. While it may be partly (or mostly) nostalgia, all I can say is OMGYAYOMGOMGOMGLETMEPLAYIT! I really liked the incredible machine when I was little, can you tell? http://contraptionmaker.com/
/*\ title: countComments.js type: application/javascript module-type: macro \*/ (function(){ exports.name = "countComments"; exports.params = [ { name: "postname" }, { name: "kickback" } ]; exports.run = function(postname, kickback) { postname = postname.replace(/\'/g, "APOSTROPHIEPLACEHOLDER"); dir = kickback + "-" + postname; dir = dir.replace(/\//g, "-"); dir = "hashover/pages/" + dir; dir = dir.replace(/ /g, "%20"); var canonUrl = "http://ooktech.com/countcomments.php?dir=" + dir; var xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", canonUrl, false ); xmlHttp.send( null ); return xmlHttp.responseText; }; })();
Cowboy Hat!!! [img alt={{!!alt-text}} [Cowboy hat - Image]]
<<tabs '[tag[Custom Settings]]'>>
For a company known mainly as a search engine Googles search UI is really terrible, particularly on G+
<<toc-tabbed-external-nav tag:"Dashboard" selectedTiddler:"$:/temp/toc/selectedTiddler" unselectedText:"Select a topic in the table of contents. Click the arrow to expand a topic." default:"Introduction">>
So, some people don't think that easily preventable diseases are killing babies fast enough so, in addition to trying to prevent vaccinations, some people are advocating paleo diets for infants. The only problem is that some of what they propose will give the babies an [[overdose of vitamin A|http://en.wikipedia.org/wiki/Hypervitaminosis_A]], which seems like a rather uncomfortable way to die. The only good part of this diet, which someone will no doubt try and they will end up killing a baby, is this headline: [[Autism-Busting Paleo Book for Babies Pulled Because It Will Kill Them|http://jezebel.com/autism-busting-paleo-book-for-babies-pulled-because-it-1692592094]].
I sent off the dissertation proposal draft to my advisor. I would be happier, but this should have been done months ago.
I have had comments from two people, and one of them is Felicity. I suppose I don't really expect people to read this much, but I have only had two comments on [[my other site|http://inmysocks.tiddlyspot.com]] also. Do people just not want to give feedback or ask questions? I am actually interested in what people think about what I make.
There are many pictures of Siberian Huskies [[here|http://vk.com/id153817456]]. Some of the best: <<imageSlider [[http://cs622026.vk.me/v622026456/1fae7/3RZb8XOPRsw.jpg]] "Hipster Husky">> <<imageSlider [[http://cs623331.vk.me/v623331456/1eedd/s31TMGTsFyE.jpg]] "Ear Muffs">> <<imageSlider [[http://cs416819.vk.me/v416819456/7473/PaDDW9k2iTk.jpg]] "I want to go to this place">> <<imageSlider [[http://cs623227.vk.me/v623227456/1da5a/4RKlHQjkr1c.jpg]] "Husky Boots">> <<imageSlider [[http://cs623131.vk.me/v623131456/6a2b/x7vHDo7mNZ4.jpg]] "Frozen Lake">>
When people get back I will lose my doggy entourage.
My allergies are worse today, and my body hates me for not riding my bike. This is an unhappy jed.
An unforgiving game sort of like how nethack in unforgiving. I love the art style and the general atmosphere of this game. I may have spent way too much time playing it while it was in beta (and after it came out of beta). I haven't played much of the reign of giants dlc yet. This game can be hard. http://www.dontstarvegame.com/
If you like and/or use the things I make for ~TiddlyWiki (here and on [[my other sites|Jed Carty (inmysocks)]]) and want to donate Here are options for using BitCoin and PayPal. <table> <tr> <td> <div> Bitcoin (<<fa fa-bitcoin>>): <div> <a href="bitcoin:19MWZctms7qunsz79GNnYg6qUnyiUtYZaa?label=inmysocks%20TiddlyWiki%20Donation"> <img src="http://ooktech.com/jed/externalbrain/images/qrcode.bmp" height=100px> </a> <p>19MWZctms7qunsz79GNnYg6qUnyiUtYZaa</p> </div> </div> </td> <td> <div> ~PayPal: <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top"> <input type="hidden" name="cmd" value="_s-xclick"> <input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7----- "> <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!"> <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1"> </form> </div> </td> </tr> </table>
I am very annoyed that the selective sync option on dropbox uses the local copy of existing files to give you the options for what to sync instead of using the index of all files on the server. I keep having to tell it to stop syncing each new folder as it downloads. In other news, I would feel much more comfortable if I wasn't expected to have slides to go along with my dissertation proposal.
EYEBROWS!!! A turn-based rogue-like, done well and with humor. Expect a long game, you will die. A lot. http://dungeonsofdredmor.com/
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
The true main chracater of Penny Dreadful is the hair. Images don't do it justice. [img [Egyptologist Hair - Image]]
\define thisMakeEmbeddedVideoFixedDimensions() ``` <iframe width='$(VideoWidth)$' height='$(VideoHeight)$' src='http://www.youtube.com/embed/$(VideoID)$?rel=0' frameborder='0' allowfullscreen></iframe> ``` Preview: <iframe width='$(VideoWidth)$' height='$(VideoHeight)$' src='http://www.youtube.com/embed/$(VideoID)$?rel=0' frameborder='0' allowfullscreen></iframe> \end \define thisMakeEmbeddeVideoFixedAspectRatio($aspect$) ``` <div class=$(Aspect)$> <iframe class='video-iframe-css' src='http://www.youtube.com/embed/$(VideoID)$?rel=0' frameborder='0' allowfullscreen></iframe> </div> ``` Preview: <div class=$(Aspect)$> <iframe class='video-iframe-css' src='http://www.youtube.com/embed/$(VideoID)$?rel=0' frameborder='0' allowfullscreen></iframe> </div> \end Video id (the 11 character string, the url should have a part like ?v=aBpaMz4AcDv, aBpaMz4AcDv is the id): <$edit-text tiddler='$:/temp/Embed Video Cheat' field='video_id' class='tc-edit-texteditor'/> <$select tiddler='$:/state/Embed Video Cheat' field='dim_or_aspect'><option>Fixed Dimensions</option><option>Fixed Aspect Ratio</option></$select> <$reveal type=match state='$:/state/Embed Video Cheat!!dim_or_aspect' text='Fixed Dimensions'> Width: <$edit-text tiddler='$:/temp/Embed Video Cheat' field='video_width'/> Height: <$edit-text tiddler='$:/temp/Embed Video Cheat' field='video_height'/> Measurement Unit: Width Unit: <$select tiddler='$:/state/Embed Video Cheat' field='width_unit'> <option>px</option> <option>%</option> </$select> <$set name=VideoWidth value={{$:/temp/Embed Video Cheat!!video_width}}> <$set name=VideoHeight value={{$:/temp/Embed Video Cheat!!video_height}}> <$set name=VideoID value={{$:/temp/Embed Video Cheat!!video_id}}> <$set name=VideoUnit value={{$:/state/Embed Video Cheat!!width_unit}}> Fixed Dimensions: <<thisMakeEmbeddedVideoFixedDimensions>> </$set> </$set> </$set> </$set> </$reveal> <$reveal type=match state='$:/state/Embed Video Cheat!!dim_or_aspect' text='Fixed Aspect Ratio'> Aspect Ratio: <$select tiddler='$:/state/Embed Video Cheat' field='aspect_ratio'><option value='video-wrapper-16-9'>16/9</option><option value='video-wrapper-4-3'>4/3</option></$select> <$set name=VideoID value={{$:/temp/Embed Video Cheat!!video_id}}> Fixed Aspect Ratio: <$set name=Aspect value={{$:/state/Embed Video Cheat!!aspect_ratio}}> <<thisMakeEmbeddeVideoFixedAspectRatio>> </$set> </$set> </$reveal>
.video-wrapper-16-9 { position: relative; padding-bottom: 56%; height: 0; } .video-wrapper-4-3 { position: relative; padding-bottom: 75%; height: 0; } .video-iframe-css { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
Stop! This, here, is the empire of the dead. [img [Entering the Catacombs - Image]]
I have already been called evil and it isn't even noon yet. It is a good day.
A pi may not be powerful enough to run it well, or it may have to be on a separate pi than the one running node and syncthing. We shall see. I may end up with multiple pi servers. https://about.gitlab.com/
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
This goes with [[Face in the mirror 2]] [img [Face in the mirror 1 - Image]]
A charcoal doodle from one of my sketchbooks, goes with [[Face in the mirror 1]] [img [Face in the mirror 2 - Image]]
While setting up everything so I could push content to twitter took some time to figure out, the examples they have with the documentation actually work and are useful. On the other hand, Facebook has documentation that apparently assumes that you know something, but I never figured out what. There may be a linear narrative through the examples, but there is no indication of how to follow it. But on the other hand, Facebook promises so many wonderful things with its api, like being able to set up simple liking and sharing and all that stuff. But on the other hand (I just watched a stage production of Fiddler on the Roof, I will not apologise!) none of them work. Not even the simple 'copy and paste this to embed this post' things work. There is no other hand. So don't expect anything that lets you interact with Facebook from me. I don't want to touch the stuff.
It is like Mine Craft lite underwater. I enjoy it. The main story is short, I beat it the first time in 2 hours. Sandbox mode is fun though. Lots of exploration and kraken. I got it as part of one of the humble bundles for $1, it was certainly worth that. I have only played it a few times so we will see if it keeps my interest. Also, potatoes. http://farskygame.com/
I don't like the feature sets of my tools being dictated by anyone else. This is why I make things.
There are so many ways to die, but most things turn out to not be horribly unfriendly. There are achievements on steam for finding different ways to die. A relatively short game with great atmosphere. http://store.steampowered.com/app/259600/ (you can also get it for android and ios, and probably other places. I couldn't find a site for the game itself.)
Look at me!! I am the first to post here!!! Never mind that it is my site and I am the only one who can post here... This is my new place on the web, and if the development goes according to plan it may be able to work as a social networking tool. Hopefully one that can interact with the other tools like Google+, Facebook, ect. For the moment there isn't much here, just a bunch of bookmarks, a partial listing of my books so I can keep track of them and some of my drawings. This is all done using [[TiddlyWiki|http://tiddlywiki.com]], which you should go check out and possibly use. It is very useful. At the moment it isn't very pretty here, but I will be working on that.
\define thisFontFamilyRadio(fontfamily text) <tr><td><$radio tiddler='$:/state/Site Accessability Options' field=fontfamily value="""$fontfamily$""">$fontfamily$</$radio></td><td>@@font-family:$fontfamily$; $text$@@</td></tr> \end \define thisFontWeightRadio(weight) <$radio tiddler='$:/state/Site Accessability Options' field=fontweight value=$weight$>$weight$</$radio> \end \define thisFontSize(size) <$radio tiddler='$:/state/Site Accessability Options' field=fontsize value=$size$px>$size$</$radio> \end \define thisLineHeight(height) <$radio tiddler='$:/state/Site Accessability Options' field=lineheight value=$height$px>$height$</$radio> \end \define thisWordSpacing(spacing) <$radio tiddler='$:/state/Site Accessability Options' field=wordspacing value=$spacing$>$spacing$</$radio> \end \define thisLetterSpacing(spacing) <$radio tiddler='$:/state/Site Accessability Options' field=letterspacing value=$spacing$>$spacing$</$radio> \end \define thisTextDecorations(decoration) <$radio tiddler='$:/state/Site Accessability Options' field=textdecoration value=$decoration$>$decoration$</$radio> \end <$checkbox tiddler="Alternate Text Styles CSS" tag='$:/tags/Stylesheet'>Enable Custom Styles</$checkbox> <table> <tr><th>Set Tiddler Font Family</th><th></th></tr> <<thisFontFamilyRadio '"Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif' Default>> <<thisFontFamilyRadio 'Times New Roman' "Newspapers! Good for dense text.">> <<thisFontFamilyRadio 'Comic Sans MS' "Scientific Press Releases">> <<thisFontFamilyRadio Courier "Monospaced font">> <<thisFontFamilyRadio "Zapf Chancery" "How Very Fancy">> </table> <table> <tr><th>Font Options</th><th></th></tr> <tr><td>Font Weight</td><td><<thisFontWeightRadio normal>> <<thisFontWeightRadio bold>></td></tr> <tr><td>Font Size</td><td><<thisFontSize 10>> <<thisFontSize 12>> <<thisFontSize 15>> <<thisFontSize 17>> <<thisFontSize 19>> <<thisFontSize 21>> <<thisFontSize 25>></td></tr> <tr><td>Line Height</td><td><<thisLineHeight 17>> <<thisLineHeight 19>> <<thisLineHeight 22>> <<thisLineHeight 24>> <<thisLineHeight 26>> <<thisLineHeight 28>> <<thisLineHeight 32>></td></tr> <tr><td>Word Spacing</td><td><<thisWordSpacing normal>> <<thisWordSpacing 1ex>> <<thisWordSpacing 1.5ex>> <<thisWordSpacing 2ex>> <<thisWordSpacing 3ex>> <<thisWordSpacing 5ex>></td></tr> <tr><td>Letter Spacing</td><td><<thisLetterSpacing normal>> <<thisLetterSpacing 0.1ex>> <<thisLetterSpacing 0.3ex>> <<thisLetterSpacing 0.75ex>> <<thisLetterSpacing 1ex>></td></tr> <tr><td>Text Decoration</td><td><<thisTextDecorations none>> <<thisTextDecorations underline>> <<thisTextDecorations overline>></td></tr> </table>
\define fa(iconName) <i class="fa $iconName$"></i> \end \define falg(iconName) <i class="fa $iconName$ fa-lg"></i> \end \define fa2x(iconName) <i class="fa $iconName$ fa-2x"></i> \end \define fa3x(iconName) <i class="fa $iconName$ fa-3x"></i> \end \define fa4x(iconName) <i class="fa $iconName$ fa-4x"></i> \end \define fa5x(iconName) <i class="fa $iconName$ fa-5x"></i> \end \define fafw(iconName) <i class="fa $iconName$ fa-fw"></i> \end
In French 80 is four-twenty, 95 is four-twenty-fifteen. This will take a bit of getting used to.
\define thisThing() <$link to="""$(TiddlerLink)$"""><$image source=<<currentTiddler>> width=30% tooltip={{!!link_to}}/></$link> \end <$set name=TiddlerLink value={{!!link_to}}> <<thisThing>> </$set>
Games! These are games I am currently playing when I get around to it. I am listing them here because I enjoy playing them and want to support the developers. Most are from humble bundles, so I paid far less for them than their normal price would indicate. And I am very inconsistent about which ones I play, so the list doesn't reflect the amount of time I spend on them. <$list filter='[is[current]tagging[]sort[title]]'> </$list>
This is a placeholder for the moment. I am going to be moving to Paris soon and it will be the first time I haven't had access to a reasonably sized gardening space so I am going to try urban horticulture stuff. Probably just inside my apartment, but I may find some larger group to work with. I will put up things I do here.
\define textSlider(label text) <$reveal type="nomatch" state="$:/state/$label$" text="show"> <$button set="$:/state/$label$" setTo="show">$label$</$button> </$reveal> <$reveal type="match" state="$:/state/$label$" text="show"> <$button set="$:/state/$label$" setTo="hide">$label$</$button> $text$ </$reveal> \end \define textSliderNoButton(label text) <$reveal type="nomatch" state="$:/state/$label$" text="show"> <$button set="$:/state/$label$" setTo="show" class="tc-btn-invisible">{{$:/core/images/right-arrow}}$label$</$button> </$reveal> <$reveal type="match" state="$:/state/$label$" text="show"> <$button set="$:/state/$label$" setTo="hide" class="tc-btn-invisible">{{$:/core/images/down-arrow}}$label$</$button> $text$ </$reveal> \end \define tiddlerSlider(tiddlerName) <$tiddler tiddler="$tiddlerName$"> <$reveal type="nomatch" state="$:/state/$tiddlerName$" text="show"> <$button set="$:/state/$tiddlerName$" setTo="show">Show <<currentTiddler>></$button> </$reveal> <$reveal type="match" state="$:/state/$tiddlerName$" text="show"> <$button set="$:/state/$tiddlerName$" setTo="hide">Hide <<currentTiddler>></$button> <$transclude/> </$reveal> </$tiddler> \end \define tiddlerSliderNoButton(tiddlerName) <$tiddler tiddler="$tiddlerName$"> <$reveal type="nomatch" state="$:/state/$tiddlerName$" text="show"> <$button set="$:/state/$tiddlerName$" setTo="show" class="tc-btn-invisible">{{$:/core/images/right-arrow}}<<currentTiddler>></$button> </$reveal> <$reveal type="match" state="$:/state/$tiddlerName$" text="show"> <$button set="$:/state/$tiddlerName$" setTo="hide" class="tc-btn-invisible">{{$:/core/images/down-arrow}}<<currentTiddler>></$button> <$transclude/> </$reveal> </$tiddler> \end \define imageSlider(tiddlerName caption) <$reveal type="nomatch" state="$:/state/$tiddlerName$" text="show"> <$button set="$:/state/$tiddlerName$" setTo="show" class="tc-btn-invisible tc-tiddler-link"><<fa fa-plus>> $caption$</$button> </$reveal> <$reveal type="match" state="$:/state/$tiddlerName$" text="show"> <$button set="$:/state/$tiddlerName$" setTo="hide" class="tc-btn-invisible"><<fa fa-minus>> $caption$</$button> [img width=100% [$tiddlerName$]] </$reveal> \end
Required items: * A [[raspberry pi|https://www.raspberrypi.org/products/]], it should cost about US$35, plus whatever shipping costs. I think it was about US$40 for me with taxes and shipping. * A USB keyboard and mouse. These are only needed for the initial setup, if you can borrow them from another computer for half an hour or so you should be fine. * A connection to the internet * A class 10 or better microsd card, I think you need at least a 4gig card, people recomend at least an 8gig card. Due to weird prices an 8gig card costs about the same as a 4gig card. The 8gig class 10 card I got cost me about US$5 * A display that can take HDMI input and an HDMI cable, or a display with component input and a 3.5mm to component video cable. This is only needed for setup, if you have access to one for half an hour than you should be just fine. I used the monitor for my desktop computer, but most modern tvs would work. * An eithernet cable and a place you can leave the raspberry pi plugged into a router or somewhere else it can access the internet. You should be able to do this using a wireless dongle too. * A powersupply that can give 5V at between around 400mA to 1A through a micro usb cable. I am using a cell phone charger. I tried with a 150mA charger and it wasn't enough to even turn on the pi, so you need more than that. Somewhere in the small text on the charger should something that looks sort of like 5V = 0.7A (it isn't actually an equals sign, it is a solid line with a dotted line above it, I just don't have that symbol here). If the second number has `A` after it than you want the number to be between 0.4 and 1 (you can go above 1, but I burned out a pi because of a faulty power supply so I am paranoid), if the second number is followed by `mA` the number should be between 400 and 1000. Some of the newer tablet chargers use 2A, which shouldn't break anything, but it may trip the fuse on the pi, so I wouldn't use one. * (''Optional'') a case for your pi. Since my router is in a protected place I just have my pi sitting in the anti-static bag it came in inside a small cardboard box. As long as it is protected from moisture it should be ok. Dust shouldn't hurt anything, but to be careful you want to keep it somewhere mostly free of dust. If yours is going to be somewhere you are worried about it getting disturbed you may want a case. If you are going to have reason to carry around your pi you may also want a case. Steps: # Collect the reqired items listed above. # Download a [[raspbian noobs image|https://www.raspberrypi.org/downloads/]] and uncompress the archive onto your microsd card. The card should be newly formatted before doing this. For most cards if you just bought them they will be fine. # Connect the mouse, keyboard, eithernet cable and hdmi cable to the appropriate ports on the pi and plug in the eithernet and hdmi cable to your router and display respectively. # Plug the power supply into the raspberry pi. While it shouldn't be a problem, having your display on before you power up the raspberry pi is a good idea. Since everything is solid state there is no on or off button on the pi, once it is plugged in you should see a red led and a green led. The red led should be on all the time when the pi has power, the green led lights up when it is reading from the SD card. So if you see the two LEDs that is good. # You should see a colorful splash screen on the display, and once the pi starts up (it should only take a few seconds) you should see a menu asking what you want to install. Just pick raspbian and go with the defualt options and tell it to install. # After the installation is complete you should see another menu, you can change some settings and add users, but for the purposes of this you don't need to worry about that. You should go to advanced settings and make sure that ssh is enabled (it should be by default, so don't worry too much) then select finish in the menu. You may need to use the tab key to get to the finish option. # After the linux boot sequence has finished it will ask you to log in, unless you changed it in the configuration menu the username is `pi` and the password is `raspberry`. So log in. As you type in the password nothing on the screen will change, this is a security feature of linux so don't worry about it. You have the basic set up now. If you are going to run your pi headless (that is without a keyboard, mouse or monitor) and have it plugged into your router with an ethernet cable than you are finished. I will put up steps for how to set up wireless access from the command line at some point. Setting up wireless internet access using the graphical interface (remember that you have to have a usb wifi thing for this to work, the pi doesn't have any builtin wifi support): First start the gui by typing ``` startx ``` this should make a bunch of text scroll on the screen and eventually you should see a graphical desktop. Click on the menu, then go to internet, then select wireless connections. There should be a button that says `scan`, click on that. After a moment a list of available wireless networks should appear, select your network and enter the password (if there is a password. If not than you should put a password on your wireless network.) Once that is done your pi should connect to the network, you can open up the browser (menu->internet->browser) and check. If that worked than you are good and you can shut down the pi (menu->shutdown) and remove the keyboard, mouse and display. If you are running your pi headless than you won't need them connected anymore. For everything else I am going to assume that your pi is connected to the internet and that you are [[accessing it via ssh|Logging into your Raspberry Pi via SSH]] from another computer.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
Javert hates baths but she is always so much happier after taking one. And I am always soaked.
Going home to Paris! Hopefully I will be around more after the flight.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
This hasn't been passed, it has to go through the senate where they don't have the offending sections so there is still hope, but the fact that this got as far as it has shows how much the US government is willing to throw out the democratic process. !Subverting democracy: gutting net neutrality edition! The United States House Committee on Appropriations voted to include some provisions in the budget that would effectively negate all of the net neutrality progress we have made so far by forbidding the FCC from using any of its funding for the purposes of enforcing any current or future rules regarding net neutrality or the open internet. There are also some parts (namely section 625) forbidding the securities and exchange commission from requiring the disclosure of political contributions, but that is subverting the democratic process in a different way and it has gotten much more news coverage, a bit more on this below. [[Here is the draft of the rules they are proposing|http://appropriations.house.gov/uploadedfiles/bills-114hr-sc-ap-fy2016-fservices-subcommitteedraft.pdf]], the most relevant parts for net neutrality sections 629 and 630. Sections 623 and 628 apply to a lesser extent. To explain how this is subverting democracy in a very US centric way, here is the fist amendment to the constitution of the united states: ``` Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances. ``` A working democratic society requires an informed electorate, an informed electorate requires a free press. While print media may not be strictly dying, it is certainly losing relevance. I haven't gotten anything other than local news from a print source in years, and even most local news I get comes from online. Almost none of my friends actually follows much news, and from what I know with few exceptions all the news that they get is from online sources. In the US the first amendment prevents the government from restricting the free press, but, like the freedom of speech, it does nothing to prevent other entities from limiting it. Entities such as cable companies. If the proposed rules get enacted than by law no significant regulations applying to cable companies will be enforceable, they will have a literal unregulated monopoly protected by federal law. In most areas of the US there is already only a single provider so they are effectively monopolies already, but they are currently able to be regulated. People tend to focus on throttling the speed of communications when talking about net neutrality, but a much more important aspect of it is that a provider can decide to just not allow the connection. As it is you need to get special permission from your ISP (for most of them anyway) if you want to run your own email server. The reason centurylink (my current ISP) gives for this is 'emails can contain viruses'. That is it. They won't allow me to do it 'for my protection'. In the same way they could decide that they need to track your activities online, and 'for your protection', block access to vpn services because if you use a vpn you could go to websites without them tracking you... and get viruses. Or you can't visit unapproved sites, because viruses. Or you can't visit sites that don't pay a licensing fee, because profit. Or you can't visit sites that the isp doesn't have a stake in, which has already happened with [[internet.org|https://en.wikipedia.org/wiki/Internet.org]], because profit (or AOL keywords for those of you who remember them). While all of that is evil, it isn't directly subverting the democratic process. But they could selectively allow news sites to only allow approved news, which would in effect destroy the free press because almost everyone gets their news from online sources. The primary source of news for just about everyone under the age of 30 (and probably most above 30 too) would be filtered by a single controlling entity. And because it isn't the government, this would be perfectly legal. We already know that facebook is doing experiments on emotional manipulation of its users. How would they make money off of this? By selling premium ad placements in ways that would put a user in a favourable frame of mind while viewing the ad. Or by displaying political stories in places designed to evoke a specific emotion, positive or negative, in an attempt to influence public policy even more. And this isn't speculation, facebook is actually studying this and it has been shown to have a [[real impact on people|http://papers.ssrn.com/sol3/papers.cfm?abstract_id=2309703]]. In that context internet.org, which is run and controlled by facebook and is in areas where there isn't another easily accessible form of internet access, becomes a bit more sinister. Even if the goal of the studies is just to find ways to foster positive feelings in users while using facebook, this sort of manipulation would help prevent users from wanting to switch to other services when they become available. And that is if the data is only used to make users enjoy using facebook. What about a free press? Emotional manipulation of users in an attempt to influence public policy so facebook can maintain its monopoly on internet access sounds like an attractive prospect. That is just facebook, and in places that don't already have commonly available internet access so there aren't strong regulations in place. Unfortunately without net neutrality that becomes the norm in the US as soon as the cable companies decide to implement it. Instead of a state run monopoly on news it would be a corporation run monopoly on news, so it would be legal. Did I mention that the FCC wouldn't be allowed to regulate any of this? Which makes the monopoly protected by federal law, because the only regulatory body that should have jurisdiction would be powerless. This isn't some worst case scenario or paranoid fantasy, without regulation this is what happens. It is really hard to say I am being alarmist when it is already happening with things like internet.org and google fiber. Establishing these rules and negating net neutrality puts a few companies into the same position over the entire united states. These companies already give huge campaign contributions to politicians they like, why wouldn't they use other methods at their disposal as well? !What do the proposed rules actually say? I imagine that no one will actually read this section. We will go section by section: !!Section 628 ``` SEC. 628. None of the funds made available by this Act may be used to implement, administer, or enforce any rule (as defined in section 551 of title 5, United States Code), or any amendment or repeal of an existing rule, that is adopted by vote of the Federal Communications Commission after the date of the enactment of this Act, unless the Commission publishes the text of such rule, amendment, or repeal on the Internet Web site of the Commission not later than 21 days before the date on which the vote occurs. ``` This is by far the mildest of the requirements, but it serves no real purpose other than to put bureaucratic hurdles in place for creating any useful rules. The FCC is slow enough as it is. There isn't much more to be said about this one. !!Section 629 ``` SEC. 629. None of the funds made available by this Act may be used to regulate, directly or indirectly, the prices, other fees, or data caps and allowances (as such terms are described in paragraph 164 of the Report and Order on Remand, Declaratory Ruling, and Order in the matter of protecting and promoting the open Internet, adopted by the Federal Communications Commission on February 26, 2015 (FCC 15–24)) charged or imposed by providers of broadband Internet access service (as defined in the final rules in Appendix A of such Report and Order on Remand, Declaratory Ruling, and Order) for such service, regardless of whether such regulation takes the form of requirements for future conduct or enforcement regarding past conduct. ``` This section says that the FCC is prohibited from regulating how much internet providers charge for their services. These are the companies that already have monopolies because they have voluntary divided the country into sections so they don't compete with each other. This is the reason that we have such shitty internet service in the US. To give an idea of how shitty we have it, in Paris the slowest service available is twice the speed of the fastest non-business connection available in Albuquerque. Also in Paris the cost is less than half of what it is here in Albuquerque. So twice the speed for half the cost. If this goes through than they will have explicit permission to charge as much as they want without having to worry about violating some consumer protection rule or another. !!Section 630 ``` SEC. 630. None of the funds made available by this Act may be used to implement, administer, or enforce the Report and Order on Remand, Declaratory Ruling, and Order in the matter of protecting and promoting the open Internet, adopted by the Federal Communications Commission on February 26, 2015 (FCC 15–24), until the first date on which there has been a final disposition (including the exhaustion of or expiration of the time for any appeals) of all of the following civil actions: (1) Alamo Broadband Inc. v. Federal Communications Commission, et al., No. 15-60201, pending in the United States Court of Appeals for the Fifth Circuit as of the date of the enactment of this Act. (2) United States Telecom Assoc. v. Federal Communications Commission, et al., No. 15-1063, pending in the United States Court of Appeals for the District of Columbia Circuit as of the date of the enactment of this Act. (3) CenturyLink v. Federal Communications Commission, No. 15-1099, pending in the United States Court of Appeals for the District of Columbia Circuit as of the date of the enactment of this Act. ``` This says that the FCC can't actually enforce net neutrality. The court cases listed are being taken against the government by the largest providers in the country. They have for all practical purposes an infinite amount of money to throw at the case so they can drag it on indefinitely, and then all of the appeals will have to also be heard before anything can be done. This section will give the cable companies the freedom to prevent the rules from being enforced until they are somehow forced to end the court cases. In that one paragraph the house is repealing net neutrality in every meaningful sense. When combined sections 629 and 630 give existing cable companies an unregulated monopoly that is protected by federal law with all the benefits that implies. !Other things that are probably terrible (almost all the commentary I give here is sarcastic, in case that somehow wasn't obvious.): Section 621: ``` SEC. 621. None of the funds made available by this Act may be used to pay the salaries and expenses for the following positions: (1) Director, White House Office of Health Reform, or any substantially similar position. (2) Assistant to the President for Energy and Climate Change, or any substantially similar position. (3) Senior Advisor to the Secretary of the Treasury assigned to the Presidential Task Force on the Auto Industry and Senior Counselor for Manufacturing Policy, or any substantially similar position. (4) White House Director of Urban Affairs, or any substantially similar position. ``` Because of course we don't care about any social causes, or anything that would protect the environment. That would hurt profits of people (because corporations are people) that give large bribes (also known as campaign contributions). To further protect these people we have section 625: ``` SEC. 625. None of the funds made available by this Act shall be used by the Securities and Exchange Commission to finalize, issue, or implement any rule, regulation, or order regarding the disclosure of political contributions, contributions to tax exempt organizations, or dues paid to trade associations. ``` Because we don't have any problems with government corruption that need to be looked at. Nope. That would hurt the political power wielded by the people (corporations) that give large bribes. And of course, we can't have any part of the government that could damage the profits of a company by doing their job to actually enforce regulations (The Securities Exchange Act of 1934 is [[here|http://www.sec.gov/about/laws/sea34.pdf]]). Also, transparency is bad. ``` SEC. 626. (a) Section 13(n)(5) of the Securities Exchange Act of 1934 25 (15 U.S.C. 78m(n)(5)) is amended— (1) in subparagraph (G)— (A) in the matter preceding clause (i), by striking ‘‘all’’ and inserting ‘‘security-based swap’’; and (B) in subclause (v)— (i) in subclause (II), by striking ‘‘; and’’ and inserting a semicolon; (ii) in subclause (III), by striking the period at the end and inserting ‘‘; and’’; and (iii) by adding at the end the following: ‘‘(IV) other foreign authorities.’’; and (2) by striking subparagraph (H) and inserting the following: ‘‘(H) CONFIDENTIALITY AGREEMENT.— Before the security-based swap data repository may share information with any entity described in subparagraph (G), the security-based swap data repository shall receive a written agreement from each entity stating that the entity shall abide by the confidentiality requirements described in section 24 relating to the information on security-based swap transactions that is provided.’’. (b) The amendments made by subsection (a) shall take effect as if enacted on July 21, 2010. ``` Now, none of section 626 looks all that interesting, or relevant until you look at what subparagraph 13(n)(5)(H) currently is: ``` (H) CONFIDENTIALITY AND INDEMNIFICATION AGREEMENT.- Before the security-based swap data repository may share information with any entity described in subparagraph (G)— (i) the security-based swap data repository shall receive a written agreement from each entity stating that the entity shall abide by the confidentiality requirements described in section 24 relating to the information on security-based swap transactions that is provided; and (ii) each entity shall agree to indemnify the security-based swap data repository and the Commission for any expenses arising from litigation relating to the information provided under section 24 ``` So, what section 626 is doing is removing that pesky little (ii), which would allow people (because corporations are people) to sue the securities and exchange commission for damages if they get sued by a third party. This means that if someone gets sued as a result of information in the data repository people can try to hold the SEC financially responsible instead of actually taking the penalty themselves. ([[Some stuff about security-based swaps|http://www.sec.gov/swaps-chart/swaps-chart.shtml]] and [[why it matters|https://en.wikipedia.org/wiki/Subprime_mortgage_crisis#Credit_default_swaps]].) !Section 627 - Bonus Section!! ``` SEC 627. None of the funds made available in this Act may be used by a governmental entity to require the disclosure by a provider of electronic communication service to the public or remote computing service of the contents of a wire or electronic communication that is in electronic storage with the provider (as such terms are defined in sections 2510 and 2711 of title 18, United States Code) in a manner that violates the Fourth Amendment to the Constitution of the United States. ``` At first glance this is awesome, it says that service providers can't be compelled to give information. Then there is that last bit: //in a manner that violates the Fourth Amendment to the Constitution of the United States.// So, the united states government can't use this money to violate the constitution of the united states. Yay pointless provisions!! Note that this doesn't say that requiring the disclosure of information in this context ''IS'' a violation of the 4th amendment, just that they can't violate the 4th amendment. Here is the text of the 4th amendment to the constitution of the united states, note that it doesn't mention electronic communication: ``` The right of the people to be secure in their persons, houses, papers, and effects, against unreasonable searches and seizures, shall not be violated, and no Warrants shall issue, but upon probable cause, supported by Oath or affirmation, and particularly describing the place to be searched, and the persons or things to be seized. ``` By specifically saying that violating the 4th amendment is the test for what is allowed, this may actually relax the restrictions on data gathering. Yay using rules that were written almost 200 years before the situation in question!
#hashover, #sort_div { clear: both; } #hashover form, #hashover .cmtdiv form { display: block; } #hashover .cmtdiv form { margin-top: 6px; clear: both; } #hashover form div.cmtbox { margin-left: 65px; padding: 6px 8px 8px 8px; } #hashover form input, #hashover form textarea, #hashover form table input { padding: 2px; background-color: #FAFAFA; font-size: 13px; font-family: "Arial","Helvetica","FreeSans",sans-serif; color: #222222; border: 1px solid #808080; outline-offset: none; outline: -webkit-focus-ring-color none; } #hashover form input, #hashover form textarea, #hashover form table input, #hashover .cmtdiv label { transition: all 120ms linear 0ms; -moz-transition: all 120ms ease 0ms; -webkit-transition: all 120ms ease 0ms; -o-transition: all 120ms ease 0ms; } #hashover form input, #hashover form textarea, #hashover form table input, #hashover .cmtdiv pre, #hashover .cmtdiv code, #hashover .cmtdiv label { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o-box-sizing: border-box; } #hashover form input, #hashover form table input, #hashover form div.cmtbox, #hashover .cmtbubble, #hashover .cmtdiv input.delete, #hashover img, #hashover .cmtdiv pre, #hashover .cmtdiv code, #hashover .cmtnumber a, #hashover .cmtdiv .optionbuttons a, #hashover .cmtdiv label, #hashover .cmtfont#message { border-radius: 5px 5px 5px 5px; -moz-border-radius: 5px 5px 5px 5px; -webkit-border-radius: 5px 5px 5px 5px; -o-border-radius: 5px 5px 5px 5px; } #hashover #requiredFields { display: none; } #hashover form div textarea { width: 100%; margin-bottom: 0px ! important; padding: 5px 5px 8px 5px; vertical-align: top; border-radius: 5px 5px 0px 0px; -moz-border-radius: 5px 5px 0px 0px; -webkit-border-radius: 5px 5px 0px 0px; -o-border-radius: 5px 5px 0px 0px; resize: vertical; } #hashover form input.post_cmt { border-top: none; margin-top: 0px ! important; border-radius: 0px 0px 5px 5px; -moz-border-radius: 0px 0px 5px 5px; -webkit-border-radius: 0px 0px 5px 5px; -o-border-radius: 0px 0px 5px 5px; padding: 6px 4px 6px 4px; } #hashover input.post_cmt:hover { background-color: #F0F0F0 ! important; cursor: pointer; } #hashover input.post_cmt:focus { background-color: #E8E8E8 ! important; border-color: #000000 ! important; } #hashover textarea:hover, #hashover input:hover { background-color: #FCFCFC ! important; border-color: #000000 ! important; } #hashover textarea:hover { border-color: #909090; } #hashover textarea:focus, #hashover input:focus { background-color: #FCFCFC; border-color: #0055FF ! important; } #hashover textarea:focus, #hashover input[type="text"]:focus, #hashover input[type="password"]:focus { box-shadow: 0px 0px 2px rgba(85, 255, 255, 0.8) ! important; -moz-box-shadow: 0px 0px 2px rgba(85, 255, 255, 0.8) ! important; -webkit-box-shadow: 0px 0px 2px rgba(85, 255, 255, 0.8) ! important; -o-box-shadow: 0px 0px 2px rgba(85, 255, 255, 0.8) ! important; } #hashover form table input { width: 100%; height: 32px; font-size: 14px; padding-left: 28px; padding-right: 6px; background-position: left center; background-repeat: no-repeat; background-attachment: scroll; color: #808080; } #hashover form table input:focus { color: #222222; } #hashover table tbody tr td { padding: 2px 3px 6px 3px; line-height: 16px; } #hashover .cmtdiv table tbody tr td[rowspan="2"] { padding: 0px 8px 0px 0px ! important; } #hashover .cmtdiv table tbody tr td[rowspan="2"] img { border: none; } #hashover table tbody tr td:first-child { padding: 2px 3px 6px 0px; } #hashover .cmtdiv table tbody tr:nth-child(1) td:nth-child(2) { padding-left: 0px; } #hashover table tbody tr td:nth-last-child(1) { padding: 2px 0px 6px 3px; } #hashover table tbody tr td:first-child:nth-last-child(1) { padding: 2px 0px 6px 0px; } #hashover input.opt-name { background-image: url('/hashover/images/name.png'); } #hashover input.opt-password { background-image: url('/hashover/images/password.png'); } #hashover input.opt-login { width: 36px; background-image: url('/hashover/images/login.png'); background-position: center center; cursor: pointer; } #hashover input.opt-email { background-image: url('/hashover/images/email.png'); } #hashover input.opt-website { background-image: url('/hashover/images/website.png'); } #hashover .cmtdiv table tbody tr td, #hashover .cmtdiv table tbody tr td:nth-last-child(1), #hashover .cmtdiv table tbody tr td:first-child:nth-last-child(1) { padding-bottom: 2px; } #hashover select { height: 24px; padding: 1px; } #hashover .cmtdiv .cmtopts span.cmtbuttons { color: transparent; font-size: 0px; } #hashover .cmtdiv .cmtopts span.cmtbuttons a { display: inline-block; border-top: 1px solid #C1C1C1; border-left: 1px solid #C1C1C1; height: 25px; width: 31px; background-color: #ECEEFF; margin: 0px; background-position: center center; background-repeat: no-repeat; background-attachment: scroll; color: transparent; font-size: 0px; overflow: hidden ! important; transition: background 140ms linear 0ms; -moz-transition: background 140ms linear 0ms; -webkit-transition: background 140ms linear 0ms; -o-transition: background 140ms linear 0ms; } #hashover .cmtdiv .cmtopts span.cmtbuttons a:first-child { border-top-left-radius: 6px; } #hashover .cmtdiv .cmtopts span.cmtbuttons a:hover { background-color: #E4E6F6; } #hashover .cmtdiv .cmtopts span.cmtbuttons a.like:active { background-image: url('/hashover/images/liked.png'); background-color: #FFDDDB; } #hashover .cmtdiv .cmtopts span.cmtbuttons a.liked:active { background-image: url('/hashover/images/like.png'); background-color: #DBDBDB; } #hashover a.like { background-image: url('/hashover/images/like.png'); } #hashover a.liked { background-image: url('/hashover/images/liked.png'); } #hashover a.edit { background-image: url('/hashover/images/edit.png'); } #hashover a.has-email { background-image: url('/hashover/images/has-email.png'); } #hashover a.no-email { background-image: url('/hashover/images/no-email.png'); } #hashover a.has-email, #hashover a.no-email { width: 33px ! important; } #hashover hr { border: 0px; height: 1px; background-color: #808080; margin-top: 0px; margin-bottom: 5px; clear: both; } #hashover input::-moz-focus-inner { border: 0px; } #hashover .cmtdiv { clear: both; } #hashover a, #hashover a:link { text-decoration: none; color: #0000CC; outline: none; } #hashover a:visited { color: #00268F; } #hashover a:hover { text-decoration: underline; text-shadow: 0px 0px 3px #8CF5FF; cursor: pointer; color: #005EFF; } #hashover form div.cmtbox, #hashover .cmtbubble { overflow: hidden; background-color: #F6F8FF; border: 1px solid #808080 ! important; text-align: left; height: auto; width: auto; } #hashover form div.cmtbox, #hashover .cmtdiv .cmtbubble { margin-left: 64px; } #hashover .cmtdiv.reply .cmtbubble { margin-left: 49px; } #hashover .cmtdiv .cmtbubble .cmtdata { padding: 0px 10px 0px 10px; line-height: 1.4em; } #hashover .cmtdiv .cmtbubble .cmtdata img { max-width: 100%; max-height: 640px; cursor: pointer; } #hashover .cmtdiv.reply .cmtbubble .cmtdata { padding: 0px 8px 0px 8px; } #hashover .cmtdiv hr { background-color: #C1C1C1; margin: 0px; } #hashover .cmtdiv table { padding: 0px 6px 0px 5px; margin: 5px 0px 5px 0px; } #hashover .cmtdiv table tbody tr td { line-height: normal; } #hashover .cmtdiv input, #hashover .cmtdiv .optionbuttons a, #hashover .cmtdiv label { font-size: 11px ! important; } #hashover .cmtdiv input.post_cmt { margin: 0px; border: none; margin-top: 0px ! important; background-color: #F0F0F0; } #hashover .cmtdiv input.post_cmt:hover { background-color: #E9E9E9 ! important; cursor: pointer; } #hashover .cmtdiv input.post_cmt:focus { background-color: #E5E5E5 ! important; } #hashover .cmtdiv input[type="button"], #hashover .cmtdiv input.delete[type="submit"], #hashover .cmtdiv .optionbuttons a, #hashover .cmtdiv label { display: inline-block; border: 1px solid transparent ! important; background: transparent ! important; padding: 3px 4px 3px 4px ! important; margin-bottom: 5px; } #hashover .cmtdiv label { padding: 2px 5px 0px 1px ! important; } #hashover .cmtdiv .optionbuttons a { padding: 3px 6px 3px 6px ! important; color: #222222; } #hashover .cmtdiv input[type="button"]:hover, #hashover .cmtdiv .optionbuttons a:hover, #hashover .cmtdiv label:hover { border-color: #C1C1C1 ! important; background-color: #ECEEFF ! important; text-shadow: none; cursor: pointer; text-decoration: none; color: #222222; } #hashover .cmtdiv .options { display: block; overflow: hidden; width: 100%; background-color: #F0F0F0; transition: all 0.15s linear 0ms; -moz-transition: all 0.15s linear 0ms; -webkit-transition: all 0.15s linear 0ms; -o-transition: all 0.15s linear 0ms; } #hashover .cmtdiv table input { margin: 2px 0px 2px 0px; height: 26px; } #hashover .cmtdiv textarea { margin: 0px ! important; border-left: none ! important; border-right: none ! important; border-color: #C1C1C1; border-radius: 0px ! important; -moz-border-radius: 0px ! important; -webkit-border-radius: 0px ! important; -o-border-radius: 0px ! important; } #hashover .cmtfont { font-size: 16px; display: inline-block; padding-top: 2px; } #hashover .cmtdiv .cmtfont { display: inline-block; clear: right; } #hashover .cmtdiv form .cmtfont { padding-left: 8px; } #hashover .cmtdiv .optionbuttons { float: right; padding: 0px 5px 0px 0px ! important; } #hashover .cmtdiv .cmtheader { line-height: normal; padding: 8px 10px 10px 10px; margin-bottom: 10px; overflow: hidden; } #hashover .cmtdiv.reply .cmtheader { padding: 8px 8px 6px 8px; } #hashover .cmtdiv .cmtheader .cmtfont { font-size: 20px; } #hashover .cmtdiv.reply .cmtheader .cmtfont { font-size: 16px; margin-top: -1px; } #hashover .cmtdiv .cmtheader .cmtfont.at { color: #00268F; } #hashover .cmtnumber img, #hashover .cmtnumber a { display: inline-block; width: 45px; height: 45px; border: 1px solid #808080; vertical-align: top; background-color: rgba(255, 255, 255, 0.8); font-size: 18px; text-align: center; line-height: 45px; text-shadow: none; font-weight: bold; color: #808080; } #hashover .cmtdiv.reply .cmtnumber img, #hashover .cmtdiv.reply .cmtnumber a { width: 35px; height: 35px; line-height: 35px; font-size: 15px; } #hashover .cmtnumber { display: inline-block; padding-right: 19px; float: left; margin-right: -1px; background-image: url('/hashover/images/bubble-tick.png'); background-position: right center; background-repeat: no-repeat; background-attachment: scroll; } #hashover .cmtdiv.reply .cmtnumber { padding-right: 13px; background-image: url('/hashover/images/bubble-tick-reply.png'); } #hashover .cmtdiv pre, #hashover .cmtdiv code { width: 100%; max-height: 200px; display: inline-block; overflow: auto; border: 1px solid #C1C1C1; background-color: #F5F5F5; white-space: pre; padding: 5px; margin: 0px; } #hashover .cmtdiv blockquote, #hashover .cmtdiv ol, #hashover .cmtdiv ul { padding-left: 10px; margin: 0px 20px 8px 20px; } #hashover .cmtdiv blockquote { border-left: 3px solid rgba(0,0,0,0.3); } #hashover .cmtdiv .cmtdate { display: inline-block; margin-top: 3px; color: #606060 ! important; } #hashover .cmtdiv .cmtdate { margin-top: 4px; } #hashover .cmtdiv .cmtdate a, #hashover .cmtdiv .cmtdate span { text-shadow: none ! important; color: #606060 ! important; } #hashover .cmtdiv .cmtopts { padding-left: 10px; margin-top: -4px; overflow: hidden; width: auto; clear: both; } #hashover .cmtdiv.reply .cmtopts { padding-left: 8px; margin-top: -7px; } #hashover label input[type="checkbox"] { vertical-align: middle; margin-top: 1px; margin-bottom: 2px; } #hashover .cmtdiv .optionbuttons input.delete:hover, #hashover .cmtdiv .optionbuttons input.delete:focus { border: 1px solid #BB0000 ! important; background-color: #FF0000 ! important; color: #FCFCFC ! important; cursor: pointer; } #hashover .cmtdiv input.delete:focus { box-shadow: 0px 0px 3px #FF5555 ! important; -moz-box-shadow: 0px 0px 3px #FF5555 ! important; -webkit-box-shadow: 0px 0px 3px #FF5555 ! important; -o-box-shadow: 0px 0px 3px #FF5555 ! important; } #hashover .cmtdiv .cmtnote.cmtfont { font-size: 16px; display: inline-block; position: relative; top: 12px; left: 10px; vertical-align: top; color: #FF0000; } #hashover > .cmtfont:nth-child(3) { margin-bottom: 0px; display: inline-block; width: 100%; padding-bottom: 8px; border-bottom: 1px dashed rgb(190, 190, 190); } #hashover .cmtfont#message { display: block; margin-top: 6px; padding: 6px; text-align: center; background-color: rgba(210, 210, 255, 0.5); border: 1px solid #AAAAFF; }
<div style='position:relative;left:75px;width:50vw'> <script type="text/javascript" src="/hashover.php"></script> <noscript>You must have JavaScript enabled to use the comments.</noscript> </div>
/*\ title: hashoverComments.js type: application/javascript module-type: macro \*/ (function(){ exports.name = "hashoverComments"; exports.params = [ { name: "postname" }, { name: "kickback" } ]; exports.run = function(postname, kickback) { postname = postname.replace(/\'/g, "APOSTROPHIEPLACEHOLDER"); var canonUrl = "http://ooktech.com/hashover.php?canon_url=" + kickback + "?" + postname; var xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", canonUrl, false ); xmlHttp.send( null ); if (xmlHttp.readyState==4 && xmlHttp.status==200) { eval(xmlHttp.responseText); } postname = postname.replace(/APOSTROPHIEPLACEHOLDER/g,"\'"); return give_output(postname, kickback); }; })();
And now I am in Paris.
Click on stuff, you won't break anything. Also: Menu icon meanings: {{Menu Icon - Leave Comment}} - leave comment {{Menu Icon - Calendar Archives}} - Calendar archives (posts arranged in a calendar) {{Menu Icon - Font Options}} - Font Options (Change the font and word spacing used)
This house shows up a lot in my sketchbooks. I am not sure why. [img [House - Image]]
This is necessary if you are going to do anything that lets you (or anyone else) outside your network access your Raspberry Pi. Possibly even if it is only people on your network. In situations like college networks there may be a lot of people on your local network. Fortunately this is easy. *First [[ssh into your pi|Logging into your Raspberry Pi via SSH]] (or open a terminal if you are using a graphical interface) *Type the command<div> ``` passwd ``` You will then be asked for your current password, so type it in, then you will be asked for the new password two times to make sure you typed it in correctly. So enter your new password twice and you should be good. Just to be very clear, you will be asked for the new password, you type the password and press enter, then you will be asked again so yo enter it again and press enter again, you don't type in the password twice at the first prompt.
I adjusted my office chair for the first time. I am not sure why it took me over a year to do this.
If you have some flexibility with form factor the raspberry pi zero may be the most cost effective platform for small scale product manufacture, not just prototyping. At $5 a piece it is cheaper than any other generally accessible embedded solution. For the USB portion alone I spent somewhere around $1 for the required crystal the port itself, and that required me to either etch my own board or have some custom PCBs made. To use surface mount components in any real quantity it is impractical to do by hand except for single prototypes and the cheapest manufacturer I can find requires a minimum of 100in^^2^^, which was around $200 for the board itself so the cost of components needs to be added to that. So most embedded things that don't require the timing guarantees of DSPs or similar MCUs it is a pre-assembled development platform that is cheap enough to use for small-scale product runs. This makes what I want to do easier.
No, no I am not. Otherwise I wouldn't be typing this. I have been listening to [[Welcome to Night Vale]] a lot lately. It is both very good and difficult give a good description of it. Something like an existential humour science fiction/horror podcast in the form of a public radio news program for a town in the Southwest US. I have a new job doing some web design stuff for AUP. It is a 6 month job so I am looking for other work too. I am going to need one in order to stay in France after the current job is finished. I am going to look into getting a professional project visa, but I will still need to get a job so I can pay rent and eat. I have also been making stuff. Probably the most interesting is an authoring tool for interactive SVG animations and interface things in tiddlywiki. Go look at it [[here|http://ooktech.com/jed/ExampleWikis/SnapSVG/]]. Scroll down on that page (or click [[here|http://ooktech.com/jed/ExampleWikis/SnapSVG/#Animation%20Example]]) and click on the `Play Animation` button to see a simple example of what you can make using it. I just realized that you won't be able to see this part if you are on a smaller screen, but over to the right there is an image of a house, if you click on the door it will open, then clicking on it again will close the door. By itself this isn't anything interesting, but it is the basis for making games or interactive animations using what I made. For the SVG portion I am using the [[Snap.SVG|http://snapsvg.io/]] javascript library. The rest of the site is TiddlyWiki, the same thing I used to make this site. I haven't been drawing nearly enough lately, and I still don't have a cello here so I haven't played since I moved to France. I think that I may just start focusing on making things using the SVG stuff I am working on. My goal is to make an easy to use flexible tool for creating graphical games similar to how I made the [[interactive fiction engine|http://zorklike.tiddlyspot.com/]] a while ago. I should probably update the interactive fiction stuff at some point, I could make it significantly better now if I put the work into it. But I may be too distracted by the SVG stuff to do that for now. Also, way too much minecrafting.
Screenshot: http://ooktech.com/jed/externalbrain/#IBeatQWOP
I can carry everything I own. This makes me happy. I'm pretending I don't own the stuff in storage.
My way home is blocked by police in riot gear. I may not get home for a while The studio where I work is right next to Invalides, which is one of the places where the protests are in Paris. I can taste the tear gas from here. I tried walking home with javert but everything is blocked and after a few minutes javert started coughing, I assume because of the gas. This is why I should part attention to the news.
Lets start this off by saying that I was diagnosed with unipolar depression a few years ago, and more recently with cyclothymia, which is a more minor version of bipolar disorder (also called manic depressive disorder). A few days ago I made the mistake of being honest about my motivations making some things for ~TiddlyWiki. Namely that I was bored. Someone responded with something to the effect of 'if this is just you when you are bored, what are you like when you are focused?' Which has been the question from everyone for as long as I can remember. People see what I do during good times and never seem to understand what is actually going on when I end up being so productive. Explaining things often doesn't help. I was around 20 when I was first diagnosed, and something like 27 before I actually started any sort of treatment. By that time I had graduated from [[Rose-hulman|http://www.rose-hulman.edu/]] with an undergraduate degree in engineering, and was working on my PhD. So yes, I have always been pretty high functioning on average. But it has always been very inconsistent. I got very good at managing my symptoms. So when I was doing well, or at least not horribly, most of the people around me seemed to assume that this was the same as the problems going away. Which made everything much worse when I wasn't doing well. People tend to assume that since you were doing ok before you must have gotten over it and somehow anything bad that happens is a new problem. As an undergraduate I was unable to function to do much more than feed myself for about a quarter of the time. To make up for this I tended to do a lot when I was feeling good. People would see me do enough work to at least partly make up for the bad times when I was feeling good, and considering I was able to get an engineering degree under these conditions I think I can say without worrying about overselling myself that when I was doing well I was very good at just about anything I was doing, and then see me unable to do even basic things a day or two later and have no idea what was going on. I think there were more than a few people who assumed I was on meth (southern Indiana is known for that). The most obvious example of all of this is the week before finals during the winter quarter during my junior year. I was on campus studying for finals when the rain knocked out power went out for the entire campus. I have never been able to describe what happened next in an understandable way to anyone who hasn't experienced it, but it wasn't really possible for me to not act. I don't really remember how it started but I ended up in nothing but my boxers running screaming through the rain, and went though all the dorms on campus screaming at people to come play in the rain with me. I am told I am very persuasive when I am like that. I managed to gather 20 or 30 people who were running around in the rain with me for an hour or two. And then it stopped. I ended up curled up in a ball on the floor in the hallway of one of the dorms. Someone I didn't know eventually dragged/carried me out to their car and gave me a ride home. The next day I went to campus, but I could barely get the motivation to speak or walk to class. I had people from the night before following me around expecting something, but all I wanted to do was stare at a wall and not think about anything. One of the ways I manage things like this is to find something that I can do without much thought and using it to make complex structures to hold in my mind that prevent anything else from going on. Doing this I can focus on something safe and let the everything else just sit in the background. It is easy to think of it like a cat that has its claws in your leg, and as long as you don't move or pay attention to it than nothing happens, but as soon as you look at it you get attacked. A side effect of coping with problems like this is I can be very productive in a very narrow way, but this isn't something that I can really direct. So when I get bored or can't focus I try to find something with a suitably complex shape, coding seems to work most of the time, and I hold that in my head to force everything else out. When I am feeling better I don't have any reason to put myself into the state required to hold those shapes in my head and it can be very hard to continue work on what I was doing before because I often don't know how I managed any of it. I seem to have completely lost the thread of what I was saying here. In short, due to things being asked what I am able to do when I am focused tends to put me in a very bad mood by reminding me how inconsistently I am able to focus and how much I would be able to accomplish if I were able to somehow think clearly all the time. I don't like being reminded of it.
The airport in Dublin has free Wi-Fi. I will have to come back and spend time outside the airport.
Why do people use whatsapp? Is it just for people that don't understand that xmpp clients exist?
Today I finally saw things that another person made using thing I have made. This made me ridiculously happy. Before now I have had people tell me my stuff is useful, but I hadn't seen anything that someone had made using it. Also I made a plugin library for all of the plugins I have made for TiddilyWiki. I haven't seen anyone else who has done this yet (aside from the official library that Jeremy made, but he is the one who made TiddlyWiki so let me have my moment.) I also made a mobile friendly theme for tiddlywiki that I still need to work on a bit, and wrote more for the learning tiddlywiki thing I am making. For a lazy Sunday I think I have accomplished something. I have been feeling a lot better now that I have my proposal out of the way. But soon I am sure that I will realize that I have to publish all the research I have done and graduate, which will take care of my relaxed good mood. But for the moment I am ignoring that and enjoying life. On a completely unrelated note I forgot to eat today. I should fix that.
Over the past two days I have gotten more work done on my dissertation proposal than I have in the previous month. This isn't actually saying all that much because I have barely gotten any work done. Either way, another few days like this and my proposal will be written and I can start doing the stuff I need to do to actually propose. Then back to research and hopefully running off to live in Paris for a bit.
Ignore the branding stuff, I made all the electronics used in this video: https://www.youtube.com/watch?v=G9cBpSRT500
I don't have much I care about enough to pack. None of this is my life, just stuff I have.
Putting an insulated mug in the fridge to cool down its contents doesn't work well.The more you know.
''EDIT 5'' - I am not going to display all of the comments that are variations of 'test', so stop posting them. Go see [[Rejected Comments]] if you really want to see your test comment. Also, I do have to import comments before they show up. If you want to see a bit about how this works go to [[the testing site|http://ooktech.com/jed/externalbrain/testing/#Check%20for%20new%20comments]] ''EDIT 4'' - Ok, comments should actually work now. For real this time. ''EDIT 3'' - PROGRESS!! In a few hours I will either have a working version that isn't part of tiddlywiki to avoid the licensing problems, or I will be at my fathers house eating pizza. Or possibly both. (May 16 2015 15:15) ''EDIT 2'' - Comments are down for a bit while I fix some issues with licensing and stuff. '' edit'' the defaults for user name and email are set to mine because stuff. I will fix it in the morning. For now just change it, or leave me comments from me. So I was going to post the stuff that is at the bottom of this (above the comment section!!!) but then I got distracted by the problem of making one of the comment systems work instead of talking about them. So I have a mostly working commenting system now. It is a modification of [[hashover|http://tildehash.com/?page=hashover]] that works with tiddlywiki. It was surprisingly easy to make it work. The biggest problem is that I can't spell. I spent two hours trying to track down a problem that didn't exist because I couldn't tell that write and wirte weren't the same word. I would say that eventually I will learn how to spell, but if I haven't gotten it in 30 years I should just accept that I never will. Anyway, about the comments system! It separates comments by post correctly without any intervention by me, and more than one set of comments can be displayed at the same time. I don't have the comments themselves displayed yet. To do that I need to figure out how to best read a bunch of xml files that contain the contents of each comment. But you can leave comments and I will see them. I may be able to use the php stuff from hashover directly since I am going to be moderating comments so nothing would get posted until I see it anyway. I am pretty sure that I can make a good moderation system using tiddlywiki. The css also breaks when it is inside a tiddler, I don't know why but that should be fixable without too much effort. It is late and I am going to bed, I will work on this more tomorrow. I am once again stupdily excited. Also, since this is the first time I have ever touched php, is there someone who has actually used it before that can look over the code to make sure I didn't do something horribly stupid or break some security thing? And a quick note to myself about how I should set up the moderation stuff: Take the part of the php script that generates json data, use that as an input to the javascript macro, which will compare the posts there to a list of accepted comments stored in a data tiddler on the wiki here. Any comments listed in the data tiddler get displayed, others don't. Hopefully that will work. Who knows? Here is the post I was going to use before I made things work: --- These are the three that look like they have the best chance of working: *[[hashover|http://tildehash.com/?page=hashover]] *[[isso|http://posativ.org/isso/]] *[[juvia|https://github.com/phusion/juvia]] !!Hashover There are currently comments using hashover, but only for the entire site, not for individual posts. I need to figure out how to either give it the url fragment (which is impossible according to the all knowing internet) or some other way for it to distinguish between posts. The alternative is to generate static html for each post and when you click on a post title instead of opening up the tiddler for that post it brings you to the static site. All I would need to do there is put the javascript in the html for the static sites and everything would work without further input from me. That may be the solution I end up using. !!Isso While it looks promising, and uses javascript, I have no idea how to get it to work. There is supposed to be a deb file for it but none of the links I have found actually work. It may also have the same problem as hashover because it requires a script to place the comments, and you can't put javascript inside normal tiddlers. !!juvia This also looks promising, but probably has the same problems as isso. Also, to anyone reading this, you should try to leave a comment at the bottom of the page. I need people to test it. Any help in how I would go about installing isso or juvia would also be greatly appreciated. I just realized that I may be able to make a javascript macro in tiddlywiki that lets me put the comments where I want them and pass them a parameter to for the correct url. I will look into this. --- And look!! A comment section!!
This should actually work now!!
Hey Jed, congratulations!
Many thanks -- this is great!
And now a test comment that won't just show up
This looks promising. I will be following this thread.
So is this post now [[imported|<a href="https://groups.google.com/d/msg/tiddlywiki/_uB-VTIk2wI/UJzHoFt9Oe4J" target="_blank">https://groups.google.com/d/msg/tiddlywiki/_uB-VTIk2wI/UJzHoFt9Oe4J</a>]] and can actually link to [[tiddlers|My Gallery - Drawing and Photography]]?
testing
comment
I looked at the testing site, and it looks not a few step above a regular user. But any progress toward getting comments in TW, and especially TiddlySpace, is tremendous. The day comments can be put in the latter will make my year. I've had hopes of seeing something like Muut joined to TS.
You can put muut on tiddlyspot, but there are some problems. I just put a post in the [[forums|<a href="https://groups.google.com/forum/#" target="_blank">https://groups.google.com/forum/#</a>!topic/tiddlywiki/jkif0vodmNY]] about how to do it.
woooooot
Some of the links at the bottom don't work. And the text in the comment box isn't cleared when you click inside it. This is a problem with what I did, not with hashover. I am looking into it.
Heyo Jed. Looks good!<br><:-)
Looks fine :-)
Awesome work Jed !
good stuff!
I need a new test comment, so ignore this.
one more test comment
and again
I added instructions for how to use node on a Raspberry Pi for TiddlyWiki http://ooktech.com/jed/externalbrain/#Tutorials
I am going to try the apple brie sandwich. For science. I may find this lounge far too amusing.
I just played [[Finding Teddy|http://store.steampowered.com/app/259600/]] and beat it. It is a very short game, but considering I got 11 out of 19 achievements on steam I didn't do everything you can do. It took me about 2 hours to get through. I really like the atmosphere of the game. Everything kills you. Fortunately, when you die you just go back to where you were before you did whatever killed you, so you don't really lose any progress. I am very slowly going through the [[humble bundle|https://www.humblebundle.com/]] games I have acquired. There are many of them. Maybe I will start listing and reviewing the ones I play here.
The recorded message started 'Hello senior! Do to your age you are now eligible for a new medical alert system at no cost.' I am not even 30 yet. Has the definition of senior changed and no one told me?
In my search for a replacement for my black forest sour gummy worms I tried some sour gummy worms here called Shiny Acid. Here is a picture of the package: [img width=700px [http://ooktech.com/jed/externalbrain/images/ShinyAcid.jpg]] That is all.
Those ARE shiny.
Indeed they are. Tasty too.
Test comment 2
I got home late last night so Javert is once again convinced that I am going to abondon her.
I find it a bit disturbing how much I depend on my tablet for my news of the outside world.
In case anyone was wondering, there are reasons to dislike things like Google. https://vimeo.com/106681730
Every time I think about if I have completed the classwork requirements for my degree I get very worried that I have missed something. I have checked to make sure I have the requirements many times, and now I have the paperwork to get the final approval filled out. I am still worried I am missing something. This is annoying.
My desktop is online but I have a rather weak signal, I may be able to make it better tomorrow.
[[This page|https://dev.twitter.com/web/javascript/events]] has the javascript stuff for making twitter buttons and stuff reload. I may need to set up a daemon that checks for tiddlers opening, and when one does it updates the twitter things on the page.
Type Comment Here (other fields optionawaoihdasdasl)
Due to laying in bed in the dark for almost all of yesterday I missed chocolate day. Chocolate day is, of course, the best holiday of the year. It comes 3 times in the US, the day after Valentines day, the day after Easter and the day after Halloween. Unfortunately I missed yesterday and it looks like other people got to the sale candy before I got there today. The good news is that I found sour gummy worms, so now I can return to work.
I have a new toy! I finally got around to using the raspberry pi with the broken video out ports. I used my working pi to set up an sd card with [[syncthing|https://syncthing.net/]] configured on a vanilla raspbian install and just put it into the headless pi. It is sitting on top of the router at the moment. This works fine for my desktop and the pi, but my tablet doesn't seem to want to cooperate. The android version of the client is in alpha, so this isn't surprising, it just means that the syncthing server isn't all that helpful. I am going to get it set up on Felicity's computer, which should actually make it useful. While it does have a web interface, at the moment you can't get single files without syncing one of the defined folders clusters they way you can using the web version of dropbox. But I suppose that is what ftp is for. The next project for the pi is setting up a node.js server to see how I can get tiddlywiki working. If I am lucky that there will be some good way to set it up as a multi-user wiki and when I move to Paris and have to start doing the tabletop games online we can use it to keep track of everything in more or less real time as we play. If I remember correctly Rich Shumaker has some instructions for setting tiddlywiki stuff up on a raspberry pi, so that part may even be easy.
If I am actually going to set this up as a social networking tool I need to get more people to join in. I know a few people who either have stopped using facebook or are talking about it so I should try to get them to ~~be guinea pigs~~ help me work out how things should work. I think that it wouldn't be hard to use TiddlyWiki as at least a frontend for a distributed social networking system, similar to what the [[IndieWeb|http://indiewebcamp.com/]] stuff. There are some big things missing that need to be taken care of before it is complete, like being able to leave comments and share content between different sites. Including static versions of pages may be a good idea too so that the sites can be searched by external search engines. So, ~~which of you can I sucker into helping~~ who wants to try out a distributed social networking system?
I keep finding some little problem or puzzle and getting completely distracted by it until I can solve it. This is keeping me from getting my work done. This is a problem. I have an appointment with my doctor on Monday, hopefully she will have some helpful advice for this. At least the things that are distracting me have some use. I have the start of a monthly calendar to track daily events worked out. And once version 5.1.8 comes out I can use the gallery stuff to make a calendar you can page through month by month. I keep getting surprised by how flexible the filters are. I think that one reason that technology is so uneven is a lack of indexing. The combination of filtering and crosslinking in tiddlywiki makes it a better indexing tool than anything else I have found. I really should study category theory more. I don't think I have enough new stories lately. I should fix this. Wikipedia is a good start, but it is too restricted by the insistence on following the example of a normal encyclopedia. You can list all the information in the world, but unless you allow the people consuming it to organize it in ways that they come up with than it isn't going to do much good. The advances in education have come from discovering ways to create information structures that allow it to be applied to useful situations. Basic algebra was difficult to do before a good notation was worked out, but problems that were prohibitively difficult became trivial once a good way to represent the information was discovered. The problem now isn't that we lack the ideas, it is that we don't have them organized in a way that allows us to connect them together. This bothers me. Things always seem so simple when I can't think straight, but when my mind clears and it is quiet I often find myself back where I started. Junipers have started blooming in New Mexico. I know this because yesterday I wanted to scratch my eyes out to stop them from hurting. Luckly I still have some of the allergy medicine from last year. I need to get more. Indexing is important because when I can't keep thoughts straight in my head having well organized information available to me means that I don't have to be able to remember what is going on or keep any sort of plan in my head. I have been working without that crutch for long enough that it feels amazing to be able to actually do something when I don't feel good.
I am starting an art project using electronics and athletes. I may be winning this life thing.
It speaks the truth http://larptrek.com/larptrek/78-khaaaaaaaaaan/
So, I have added the icon menu interface I made here, and on [[my other site|http://inmysocks.tiddlyspot.com]]. You can get to the change tiddler with thing by clicking on the {{Menu Icon - Change Tiddler Size}} button at the top of the menu to the left. That and the gallery stuff is going to stay the way it is for a while, unfortunately the planned improvement that would have allowed me to switch to a better implementation would have done horrible things to everything else. I am hoping that someone gets around to doing what is needed to make a new list widget variant for it before I do. Things weren't going well in case the previous posts didn't get that point across. I went to see my doctor yesterday and without prompting from me suggested that I get my proposal finished and then start doing school part time and spend the rest of my time trying to get my company off the ground. She has apparently had other patients in a similar situation to where I am and said that it will probably help a lot. And not just dropping school gives me a backup plan. It is really weird to think of getting my phd as the backup plan. But that is what is going to happen. This will also let me go live with Felicity in Paris or wherever she is for work. That will also have a positive effect on my sanity. We do need to find out if we can get Javert there with us, or if we will have to find some other place for her while we are gone. There are a few people we could bribe to take care of Javert for us if we need to, it would come down to who would be the least upset that we were making them watch our dog for what may be a long time. Javert has been more needly than usual lately, but that is probably because I haven't been in a good mood. Hopefully new stuff will change that for both of us. I still have to get this damn proposal finished so I can do all of this. Stupid school.
Javert 'woof woof' me 'I need more than woof woof to understand you' Javert 'woof woof woof'
Well, I guess Javert does not like you using all the time on TiddlyWiki, when you could spend time with Javert
That is almost certainly true. But at the moment I am packing. She doesn't like this either.
I want a spaghetti tree. http://satwcomic.com/real-true-news
I wonder if I could actually get paid for making TiddlyWiki stuff. I would feel really weird asking for donations and whatnot, but someone asking me to make something may not be horrible. The idea of getting paid on an open source project seems wrong somehow.
There is a hurdle at 50m, I ended up pushing, then dragging it for about 15m. [img [IBeatQWOP - Image]]
.tc-icon-menu-icon { } .tc-icon-menu-icon-calendar { color:orange; } .tc-icon-menu-icon-calendar:hover { color:CadetBlue; } .tc-icon-menu-icon-comment { color:CadetBlue; } .tc-icon-menu-icon-comment:hover { color:green; } .tc-icon-menu-icon-font-options { color:green; } .tc-icon-menu-icon-font-options:hover { color:darkseagreen; }
<table> <$list filter='[tag[Image Display]sort[title]]'> <tr><td><$view field='title'/></td><td><$edit-text tiddler=<<currentTiddler>> field='order'/></td></tr> </$list> </table>
\define thisMakeImageLink() ``` <a href="$(LinkTo)$"> [img width=$(ImageWidth)$$(ImageWidthUnit)$ tooltip="""$(ImageToolTip)$""" [$(ImageSource)$]] </a> ``` Preview: <a href="$(LinkTo)$"> [img width=$(ImageWidth)$$(ImageWidthUnit)$ tooltip="""$(ImageToolTip)$""" [$(ImageSource)$]] </a> \end Link to: <$edit-text tiddler='$:/state/CheatWithHTML/ImageLink' field='link_to' class='tc-edit-texteditor'/> Image source: <$edit-text tiddler='$:/state/CheatWithHTML/ImageLink' field='image_source' class='tc-edit-texteditor'/> Tooltip: <$edit-text tiddler='$:/state/CheatWithHTML/ImageLink' field='tooltip' class='tc-edit-texteditor'/> Width: <$edit-text tiddler='$:/state/CheatWithHTML/ImageLink' field='width'/> Width Unit: <$select tiddler='$:/state/CheatWithHTML/ImageLink' field='width_unit'> <option>px</option> <option>%</option> </$select> <$set name=LinkTo value={{$:/state/CheatWithHTML/ImageLink!!link_to}}> <$set name=ImageSource value={{$:/state/CheatWithHTML/ImageLink!!image_source}}> <$set name=ImageWidth value={{$:/state/CheatWithHTML/ImageLink!!width}}> <$set name=ImageWidthUnit value={{$:/state/CheatWithHTML/ImageLink!!width_unit}}> <$set name=ImageToolTip value={{$:/state/CheatWithHTML/ImageLink!!tooltip}}> <<thisMakeImageLink>> </$set> </$set> </$set> </$set> </$set>
\define thisDisplayWithTemplate() {{$(TiddlerToDisplay)$||$(TemplateToUse)$}} \end !Recent Images: --- <$list filter='[tag[Image Post]!nsort[time]limit{$:/settings/Blog Settings!!num_recent_posts}]'> <$set name=TiddlerToDisplay value=<<currentTiddler>>> <$set name=TemplateToUse value={{!!template}}> <<thisDisplayWithTemplate>> </$set> </$set> </$list> <h2>Older Images:</h2> --- Year: <$select tiddler='$:/state/My Blog/Image Posts/Older Posts' field=year> <option>All</option> <$list filter='[tag[My Blog]tag[Image Post]has[year]each[year]get[year]nsort[year]]'> <option><<currentTiddler>></option> </$list> </$select> Month: <$select tiddler='$:/state/My Blog/Image Posts/Older Posts' field=month> <option>All</option> <$list filter='[tag[My Blog]tag[Image Post]has[month]each[month]get[month]nsort[month]]'> <option><<currentTiddler>></option> </$list> </$select> <$reveal type=match state='$:/state/My Blog/Image Posts/Older Posts!!year' text='All'> <$list filter='[tag[My Blog]tag[Image Post]has[year]each[year]get[year]nsort[year]]' variable=CurrentYear> ''__<<CurrentYear>>__''<br> <$reveal type=match state='$:/state/My Blog/Image Posts/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Image Post]has[month]each[month]get[month]nsort[month]]' variable=CurrentMonth> __<<CurrentMonth>>__<br> <$list filter='[tag[My Blog]tag[Image Post]!tag[Templates]month<CurrentMonth>!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Image Posts/Older Posts!!month' text='All'> __{{$:/state/My Blog/Image Posts/Older Posts!!month}}__<br> <$list filter='[tag[My Blog]tag[Image Post]!tag[Templates]month{$:/state/My Blog/Image Posts/Older Posts!!month}!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$reveal> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Image Posts/Older Posts!!year' text='All'> ''__{{$:/state/My Blog/Image Posts/Older Posts!!year}}__''<br> <$reveal type=match state='$:/state/My Blog/Image Posts/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Image Post]has[month]each[month]get[month]nsort[month]]' variable=CurrentMonth> __<<CurrentMonth>>__<br> <$list filter='[tag[My Blog]tag[Image Post]!tag[Templates]month<CurrentMonth>!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Image Posts/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Image Post]!tag[Templates]month{$:/state/My Blog/Image Posts/Older Posts!!month}!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$reveal> </$reveal>
\define thisBackButton() <$button class='tc-btn-invisible'> <$action-navigate $to=<<currentTiddler>>/>{{$:/core/images/chevron-left}} <$action-sendmessage $message='tm-close-tiddler' $param="""$(ImageTiddler)$"""/> </$button> \end \define thisForwardButton() <$button class='tc-btn-invisible'> <$action-navigate $to=<<currentTiddler>>/>{{$:/core/images/chevron-right}} <$action-sendmessage $message='tm-close-tiddler' $param="""$(ImageTiddler)$"""/> </$button> \end <$list filter="[all[current]tag[Image Display]]" variable=ImageTiddler> <$set name=thisMinusOne value=<<calc !!order -1>>> <$set name=thisPlusOne value=<<calc !!order +1>>> <div style='width:100%'> <$list filter='[tag[Image Display]order<thisMinusOne>]'> <div style='width:70%;z-index:99;position:absolute'> <<thisBackButton>> </div> </$list> <$list filter='[tag[Image Display]order<thisPlusOne>]'> <div style='text-align:right;position:absolute;width:80%;z-index:98'> <<thisForwardButton>> </div> </$list> <div style='text-align:center;position:absolute;z-index:1;width:80%'> Navigate Images <hr> </div> </div> <br> </$set> </$set> </$list>
\define thisBackButton() <$button class='tc-btn-invisible'> <$action-navigate $to=<<currentTiddler>>/>{{$:/core/images/chevron-left}} <$action-sendmessage $message='tm-close-tiddler' $param="""$(ImageTiddler)$"""/> </$button> \end \define thisForwardButton() <$button class='tc-btn-invisible'> <$action-navigate $to=<<currentTiddler>>/>{{$:/core/images/chevron-right}} <$action-sendmessage $message='tm-close-tiddler' $param="""$(ImageTiddler)$"""/> </$button> \end \define thisTest() <$reveal type=match state='!!title' text=<<ImageTiddler>>> <$set name=thisMinusOne value=<<calc $(test)$ -1>>> <$set name=thisPlusOne value=<<calc $(test)$ +1>>> <div style='width:100%'> <$reveal type=nomatch state='ImageDisplayViewTemplate!!one' text=<<test>>> <$list filter='[tag<GalleryTag>nth<thisMinusOne>]'> <div style='width:70%;z-index:99;position:absolute'> <<thisBackButton>> </div> </$list> </$reveal> <$list filter='[tag<GalleryTag>nth<thisPlusOne>]'> <div style='text-align:right;position:absolute;width:80%;z-index:98'> <<thisForwardButton>> </div> </$list> <div style='text-align:center;position:absolute;z-index:1;width:80%'> Minus 1: <<thisMinusOne>> Navigate Images test: <<test>> tiddler: <<ImageTiddler>> plus 1: <<thisPlusOne>> <hr> </div> </div> <br> </$set> </$set> </$reveal> \end <$set name=GalleryTag value={{Tiddler Gallery Settings!!gallery_tag}}> <$set name=GallerySort value={{Tiddler Gallery Settings!!gallery_sort}}> <$list filter="[is[current]tag<GalleryTag>]"> <$list filter="[tag<GalleryTag>sort<GallerySort>]" iterator=test variable=ThisOne> <$set name=LastTiddler value=<<iterator-last>>> <$reveal type=nomatch state=<<LastTiddler>> text=<<test>>> <$list filter="[tag<GalleryTag>nth<test>]" variable=ImageTiddler> <<thisTest>> </$list> </$reveal> </$set> </$list> </$list> </$set> </$set>
Before anyone starts bitching about hidden problem that have to do with hidden problems from potentially not being able to give services like video streaming or voip special treatment, I am a dissertation away from my phd in electrical engineering specializing in digital communications. Being able to rely on crutches like that causes problems like the position software is currently in, where people have been able to rely on improving hardware being able to make up for inefficient coding. Seriously, fuck you flash. The hardware and protocols should be forced to actually adapt to changing technologies instead of using ad-hoc workarounds in networks that aren't designed for these applications. That and I think that encrypted communications should be the standard, look at what the NSA and CIA are getting away with doing. If things are encrypted than handling packets based on their content becomes impossible because the content of the packets isn't known. A quote from the article: "Opponents of the new rules, led by cable television and telecommunications companies, say adopting the Title II approach opens the door to regulatory meddling in the future and will deter investment and ultimately harm consumers." This will harm consumers in the same way that having wired telephone network and power distribution as a public utility harms people. In ways like a stable network that has quality standards? <a href='http://www.nytimes.com/2015/02/27/technology/net-neutrality-fcc-vote-internet-utility.html' target='blank'>The news article at nytimes.com</a>
[[The EU said that marriage is a human right|http://www.gazzettadelsud.it/news/english/132877/Same-sex-marriage--civil-and-human-right---EP-says.htm]]. This may be seen a telling the Vatican and Saudi Arabia to go fuck themselves. Possibly also Russia.
[[The EU said that marriage is a human right|http://www.gazzettadelsud.it/news/english/132877/Same-sex-marriage--civil-and-human-right---EP-says.htm]]. This may be seen a telling the Vatican and Saudi Arabia to go fuck themselves. Possibly also Russia.
<div class='video-wrapper-16-9'> <iframe width='640' class='video-iframe-css' height='360' src='http://www.youtube.com/embed/LD3DY7z-I8o?rel=0' frameborder='0' allowfullscreen></iframe> </div> I would say 'is very formulaic and I don't find it very interesting', saying it is too formulaic when there are plenty of people who obviously enjoy it probably makes you an arrogant ass hole. Also claiming that formulaic music is unique to modern pop music ignores the history of music and insists on a very narrow definition of formulaic. How do you know a waltz is a waltz? or a sonnet a sonnet? Or, you know, disco. It fits with people bitching about selfies, but only when an attractive young woman takes one. For instance: http://photography.tutsplus.com/articles/100-seriously-cool-self-portraits-and-tips-to-shoot-your-own--photo-5689 https://en.wikipedia.org/wiki/Self-portrait http://www.vangoghgallery.com/catalog/Painting/2103/Self-Portrait.html http://www.wikiart.org/en/pablo-picasso/self-portrait-1907 the list can go on for a very long time. If you object because people are using cameras instead of more traditional media than how is your objection anything other than technophobia? Things change, the creation of art is more accessible to a wide range of people. If you are going to seriously claim that the quality of an expression or the amount of work required to create it is what makes a legitimate art form than the correct response may be 'go fuck yourself, you arrogant asshole.' These two videos have a much milder way of saying it, but the message is similar at least. <a href='https://www.youtube.com/watch?v=uT3SBzmDxGk'>2CELLOS - Thunderstruck</a> <a href='https://www.youtube.com/watch?v=47dtFZ8CFo8'>Capital Cities - Safe And Sound</a> On a slightly related topic, this may be one of the most amazing things I have ever seen: <a href="http://www.flickr.com/photos/jliba/3934321280/"> [img width=500px tooltip="""Ya-TAAHHHH!!!""" [http://farm3.staticflickr.com/2545/3934321280_654256f81a_z.jpg]] </a>
We, that is humans in general, have not learned how to effectively use digital media as a tool (Yeah, it's a split infinitive. I spit on your prescriptive grammar! I may rant about the <abbr title='Oxford English Dictionary'>OED</abbr> later). Wikipedia is a good example. It is incredibly useful as it is, but it doesn't go beyond a physical encyclopedia that you can search through. It does have some useful features like the see also sections, and embedded links in articles, but these are just variations of footnotes. It lacks the indexing that is possible when using a computer. If you took wikipedia and properly indexed it so that you could see connections between ideas and have it presented as shared concepts than I believe you could solve many problems simply by looking connections on the relevant topics. The example I always use is organ transplants. The story goes that a transplant surgeon married a graph theorist. The graph theorist heard about problems with incompatible donors and, using results that were well known in graph theory, came up with a way to match patients and donors that would save thousands of lives each year. The knowledge already existed, it just needed to be matched with the problem it could solve. Matching problems to solutions like this could be achieved by proper indexing. It is certainly not an easy task, but as the knowledge base grew it would become progressively easier. This indexing would build an object of potentially infinite dimension, so restricting it to a finite understandable basis would be one of the more difficult problems faced. But Wikipedia has an army of editors that work on improving it, so if we can bootstrap some base that shows the usefulness than expanding could be a much easier problem. I consistently fail at explaining how this would be useful. I am not sure why. I can often explain or demonstrate some situation that uses a small part of the idea, but translating this understanding to the idea as a whole is a harder process than I thought it would be. On a related note, go to youtube and watch [[John Oliver interview Edward Snowden|https://www.youtube.com/watch?v=XEVlyP4_11M]]. If you want to skip to the relevant part start at 25:00. I am very curious to see if anyone who reads this see that as relevant. If you are reading this you should leave some sort of response, either using the [[comments|Comments]] thing here or through Facebook or however you got here. Back on topic all I am saying should happen is taking what librarians and archivists do and extending it using available technology. This means much more than moving the card catalogue onto a computer. Even if you make it searchable on the computer. The Dewey decimal system is very useful, but it is one dimensional. With the information processing power available to us we are no longer restricted to a one dimensional system. Being good enough to do what you can do now isn't the same as being good enough. If we only think in terms of what is possible right now than I don't think we can ever make real progress.
Some practice on hands while I was on a plane, first in pencil than in ink. [img [Inky Hand - Image]]
''A lot of this may be out of date, it looks like they have an easier install option for the Raspberry Pi 2. Go to https://about.gitlab.com/downloads/ and select Raspberry Pi 2 on Raspbian for the new instructions. After I get settled in Paris (so mid August probably) I will reinstall everything on my pi and rewrite these instructions.'' Most of this is adapted from [[this site|https://about.gitlab.com/2015/04/21/gitlab-on-raspberry-pi-2/]]. !Installation On the raspberry pi terminal type: ``` wget https://s3-eu-west-1.amazonaws.com/downloads-packages/raspberry-pi/gitlab_7.9.0-omnibus.pi-1_armhf.deb sudo dpkg -i gitlab_7.9.0-omnibus.pi-1_armhf.deb sudo gitlab-ctl reconfigure ``` check the version numbers here https://about.gitlab.com/installation/ you want to look at the one labelled `Omnibus package for Raspberry Pi 2`. The numbers to look at are the `7.9.0` in the above commands, replace that with whatever the numbers are in the newest package at the link. *First command downloads the .deb file (the installation file) *Second command installs gitlab *Third command sets up gitlab !Configuration To open the configuration file use the command: ``` sudo nano /etc/gitlab/gitlab.rb ``` You need to run the `sudo gitlab-ctl reconfigure` command after you change the configuration file in order for the changes to take effect. !Connecting To connect: *When you are on the same network as the pi, just type the IP address of the pi into the address bar of a browser. (so something like `192.168.0.55`) *When you aren't on the same network as the pi you need to: **Set up port forwarding to the pi (I think it is just port 80 that needs to be forwarded. I will check.) **[[Set up dynamic dns stuff for the pi|Setting up dynamic DNS on your Raspberry Pi]] Then you can use the URL for the dynamic dns stuff to access the gitlab server. Just put the url in the browser and you should be brought to the login page. Note that if you are on the local network you have to use the local ip, not the url for the dynamic dns. !More stuff In order to access gitlab from outside your local network, and in order to add users (we will get to it, I am very annoyed), you need to set up [[dynamic dns for your Raspberry Pi|Setting up dynamic DNS on your Raspberry Pi]]. So do that. Then because gitlab doesn't allow you to add users that don't have email addresses and most ISPs don't let you use port 25 (it is used for some types of email, the type that just happens to be what we need. Assholes.), you need to set up forwarding through GMail. Or some other service, but this is the one that I have seen instructions for. you need to do what it says here http://www.shellhacks.com/en/Postfix-Gmail-as-Relay-Linux-Mint-Ubuntu-Debian with two notes: *I didn't have to install mailutils, so I skipped the first step. You can probably skip it too. *The when it asks for the FQDN thing you put in the host from your dynamic DNS stuff, so something.no-ip.org or whatever your host is. Go to your account at noip.com and go to manage hosts, the hostname displayed there is what you put as the FDQN (The full host name, not the Ip address). And one last annoyance, if the gitlab server is on your local network when you make your user, when you get the confirmation email you need to copy the url and replace everything before the /users/otherstuff part with the ip address of the raspberry pi on the local network. But once you have done that you should be good. and hopefully it will work. One last note: By default anyone can make an account on your gitlab server. There are plans to restrict users with emails on specific domains or other filtering options, but they haven't been implemented yet. Especially if you have your Pi accessible from outside your local network you will probably want to disable user sign up after all of your users have accounts. To disable this, log in as the root/admin user and go to the admin area (it is an icon in the upper right) then go to settings (bottom of the menu that appears on the left) and there should be a list of checkboxes. The top one should be 'enable user creation' or something similiar. Uncheck this box to disable new user creation. To reenable it just re-check the box. I keep mine disabled unless I want to add a new user, then I turn it on long enough for them to make an account before disabling it again.
!Installing using the command line #Go to https://github.com/syncthing/syncthing/releases, you should see a list of files. There should be one that looks like this: `syncthing-linux-arm-vx.xx.xx.tar.gz` where the `x`s are numbers. You need those numbers, so either leave a tab open in your browser or write down the numbers. #SSH into your pi. ([[instructions|Logging into your Raspberry Pi via SSH]]) #Download the newest release by typing `wget https://github.com/syncthing/syncthing/releases/download/vx.xx.xx/syncthing-linux-arm-vx.xx.xx.tar.gz` into the terminal. You need to replace the `x.xx.xx` with the numbers from the first step in both places. #Untar the file you just downloaded by typing: `tar xvzf syncthing-linux-arm-vx.xx.xx.tar.gz`, once again you need to replace `x.xx.xx` with the version number from step 1. #It makes life easier to have syncthing in a folder without the version number so type ` mv syncthing-linux-arm-vx.xx.xx syncthing` to put change the name of the folder to `syncthing` #To start syncthing first go into the folder by typing `cd syncthing`, then start syncthing by typing `./syncthing`. This will start syncthing and it will take a while because it needs to generate an RSA key. It took a few minutes for this step to finish on my raspberry pi 2, so have patience. It will probably take longer on one of the original pis. #Once the previous step is finished and you can see the command prompt again there should be a line from the output that is something like this `[FVCFD] 11:12:13 My ID: <a big string of letters and numbers>` That big string of letters and numbers is the syncthing id of your pi. This number is used as a unique identifier and you need it to connect to other devices. Write it down or copy it somewhere. #Then make it so you can access the web interface for syncthing from another computer on your network type `nano /home/pi/.config/syncthing/config.xml`. If you changed the user name to something other than `pi` than replace `pi` with your username. This will open up the configuration file for syncthing in the text editor nano. Scroll down to the line that says `<address>127.0.0.1:8080</address>` and change it to `<address>0.0.0.0:8080</address>`. How it is by default means that you can only access the web interface for syncthing from the pi itself, when you change it than you can access the interface from any computer. SO REMEMBER TO SET A PASSWORD (the next step). Save and exit by pressing `ctrl+x` and then enter when it asks if you want to save your changes. #On any computer on your network type the ip address of the pi followed by `:8080`, so something like this `192.168.0.36:8080`. This should open the web interface for syncthing. Click on the gear icon in the upper right corner and click on settings. Here you can change various settings for syncthing, the important parts at the moment are the `GUI Authentication User` and `GUI Authentication Password`. Type in a username and password to set the gui username and password. You probably also want to check the boxes `Enable UPnP`, `Global Discovery` and `Local Discovery` in the lower left. After you are done click the save button (in the lower right). #From here you have syncthing installed and working, but you need to manually start it every time your pi boots. So to make it start automatically when the pi boots up make the script by typing `sudo nano /etc/init.d/syncthing`, then copy and paste the script from [[here|syncthing startup script]], it is originally from [[here|https://gist.github.com/arudmin/5a13e9105814c3f568ec]] if you want to get it from the source. They should be identical. You need to edit two lines. ##If you have changed the username of the raspberry pi you need to change the line `syncthing_USERS="pi"` and replace `pi` with your username. ##If you are following these instructions, the line `DAEMON=/usr/local/bin/syncthing` should be changed to `DAEMON=/home/pi/syncthing/syncthing`. Once again, if you have changed the user name replace `pi` with your username. Now save and exit by pressing `ctrl+x` and then enter when asked if you wish to save. #Now set the script to be executable by typing `sudo chmod +x /etc/init.d/syncthing` and make sure everything is updated by typing `sudo update-rc.d syncthing defaults` #Now you can start syncthing by either restarting or by typing `/etc/init.d/syncthing start`. Syncthing will start every time your pi boots from now on. I will hopefully get around to adding steps using the graphical interface, but you really should just open a terminal and follow the command line instructions. I promise it isn't scary. <!-- #(''Grapical Interface'') If you aren't comfortable with the command line than you can use the graphical interface. Type `startx` and the graphical interface should start up. If you have used windows or linux in the past than the desktop should look pretty familiar, click on the button in the top left corner of the screen to open up the menu, the options available should be pretty self explainatory.<div> #Open the web browser (Menu->Internet->Browser, or click on the globe icon next to the menu in the top bar.) and navigate to `https://github.com/syncthing/syncthing/releases` #On that page under where it says Downloads there should be a list, you want to click on the one that says `syncthing-linux-arm-v0.11.2.tar.gz`, the numbers may be different but you it will start with `syncthing-linux-arm` </div> -->
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
!Welcome to ~TiddlyWiki! ''If you just want to import functions into your own existing wiki go to http://inmysocks.tiddlyspot.com/#How%20to%20add%20to%20the%20Dashboard for instructions and a list of the available plugins'' ~TiddlyWiki is a personal organizer or personal wiki. This is a version designed specifically so that there is almost no learning required to use it. There will (hopefully) be versions that just accomplish individual tasks, such as a task list or contacts database. This wiki contains all of the available content for the no learning required versions. !!To get started If you just want to get started working then you can click on one of the options to the left. Currently `Introduction` is highlighted to show that you are looking at the introduction tab. If you click on another option on the list than you will see the content for that option. Currently the options are: *`Citation Library` - a simple citation database *`Contacts` - a contact database with a simple interface *`Create or Edit Tiddlers` - a simple interface for adding more tiddlers to this wiki *`Dictionary` - a searchable and editable dictionary *`Manage Table of Contents` - a TOC manager for tiddlywiki *`Minimal Task List` - a task list that just lists tasks and allows you to check them off when they are finished. *`Quick Notes` - a simple searchable notepad *`Task List` - a more advanced task list that has options for adding short descriptions, deadlines and a more detailed explanation to the task. On this list if you click on a task name it will open up the details you have given that task. !!What do these words mean? Here is a list of words and definitions related to this wiki that you may not be familiar with: *''Wiki'' - a user editable document. Wikipedia is probably the most famous example of a wiki. A wiki contains pages or articles that can link to each other to allow navigation through the different articles. What you are currently reading is an example of a wiki called ~TiddlyWiki *''Link'' - A link is a word or phrase that you can click on that will bring you to a new place or open up a new page. Links in this wiki are colored blue and when you hover over one it will become underlined. Clicking on links is one of the main ways to navigate this wiki. *''Tiddler'' - A single unit used by ~TiddlyWiki. Everything on this wiki is made up of tiddlers, and when you create something here it will be a tiddler. An article on wikipedia would be equivalent to a tiddler. But a tiddler can be significantly more than what is done on wikipedia. Don't worry too much about specifics if you don't want to, the important thing to know now is that when you open something on this wiki what you open is a tiddler. For examples and more explaination go to www.tiddlywiki.com *''~TiddlyWiki'' - ~TiddlyWiki is a program that can be used in many different ways, what you are reading right now is an example of a ~TiddlyWiki, but there are many more things that can be done with one. <!-- add history or something here --> !!If you want to get rid of this message If you want to prevent this message from appearing anymore you can click on the button below. Once you do this than this message won't appear again, so make sure you understand the basics of how to use this wiki before you press it. If you want this message to stay available than just click on one of the options to the left to get started using the wiki. If you click on the word `Introduction` than this message will appear again. Click the button down below that says `Don't show this again` and this message will no longer appear when you open your wiki. <$button message='tm-modal' param=RemoveIntroMessageModal>Don't show this again</$button>
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
"Am I overcome by subtle impression of the uncanny, __racked__ by some existential terror? Or am I merely a bit put __out__?" You have to imagine it is being said by Picard. The alt text is also awesome. I like this comic. http://larptrek.com/larptrek/105-and-then-georditron-legacy/ It all probably makes a lot more sense if you are familiar with [[Next Generation|http://en.wikipedia.org/wiki/Star_Trek:_The_Next_Generation]] and [[DS9|http://en.wikipedia.org/wiki/Star_Trek:_Deep_Space_Nine]]. Now I really need to get more work done.
I forgot what snow falling at night does to a city. It is almost 10pm and this is what it looks like outside. Not quite light enough to read, but light enough for just about anything else. <<imageSlider [[Snow at night - Image]] "It is bright outside">>
It looks like I am just not going to sleep tonight. It has been over 2 years since this happened.
I can see why there are jobs dedicated solely to finding relevant grants. They don't make it easy.
There is some really impressive almost constant thunder going on. But it isn't raining.
"If you don't carry a gun then you make yourself a target" Some gun fondler in the US just said that.
If the url for this doesn't work on twitter I will be rather upset. I can post to twitter from here, but it does take multiple button presses. Hopefully I will figure out how to post to my site and to twitter with the same button. And eventually get things pushed to facebook as well. In addition to that I should find a way to make static pages out of each post, it may help some stuff.
Why aren't there git tools for (collaborative?) document editing? Or do I just not know about them?
The data-sheet was only 436 pages, so I added a few 50 page supplements for good measure. Yay!!
A sarcastic throwback to A Link to the Past, it encourages trying to break the game and speed runs. http://www.ittledew.com/
They are unsure how they feel being interrupted by someone taking their picture. [img [Javert and Proper Cow - Image]]
Javert and Sophie wonder if I have snacks for them. If not they are willing to wait until I do. [img [Javert and Sophie are very interested - Image]]
Javert has started sitting in front of the door so I can't leave without her.
This morning the landlord had the house appraised and I took Javert for a walk because she is way too excited around people to not distract the guy doing the appraisal. She was excited to go for a walk in the morning instead of in the evening, so she was smelling everything extra hard because of course it is all completely different in the morning. Then when we came back home she could smell that there had been someone in the house, so she went sprinting around the house looking for who it was, then got so excited she tripped over herself and fell. I am very sad I didn't get a video of it.
I may have a spoiled dog. [img [Javert is tired after playing in the snow - Image]]
Javert just saw a video of herself playing and ran behind the computer to go play with the other dog.
Javert moved that pillow so that she would be more comfortable. She may be spoiled. [img [Javert knows what a pillow is for - Image]]
Javert notices me taking a picture [img [Javert looks slightly irritated - Image]]
Javert wondering why I am taking a picture of her while she is trying to take a nap. [img [Javert on her chair - Image]]
Javert sits in the way to try and prevent me from packing to leave. [img [Javert packing - Image]]
A quick sketch of Javert sitting on my bed. [img [Javert Sketch - Image]]
Javert asleep on her chair before noticing me [img [Javert Sleeps - Image]]
Short haired dogs get cold. She wouldn't come out from under her blanket where it was warm. [img [Javert under her blanket - Image]]
Javert valiantly tried to protect me from the vacuum cleaner before giving up and running away.
Javert valiantly tried to protect me from the vacuum cleaner before giving up and running away.
''Jed Carty'' preferred online nickname: inmysocks --''Email''-- inmysocks -At- G mail Dot Com (Weirdness to avoid spam) --''Phone''-- People sometimes try to call me on my texting device. It is better to talk to me online. <$list filter='[tag{!!title}tag[<Name Plate>]has[name_plate_type]each[name_plate_type]]' variable=ThisTiddler> --<b><$view tiddler=<<ThisTiddler>> field='name_plate_type'/></b>-- <$set name=CurrentPerson value={{!!title}}> <$tiddler tiddler=<<ThisTiddler>>> <$list filter='[tag<CurrentPerson>tag[<Name Plate>]name_plate_type{!!name_plate_type}]' template=SiteNamePlateDisplayTemplate> </$list> </$tiddler> </$set> </$list> --''IM Things''-- AIM - JedMee (I almost never use this anymore, but pidgin is still set to log in)<br> Google chat thing whatever it is called - same as my email !!!__Tiddlers with Jed Carty Tags__ {{{ [tag[Jed Carty]] }}}
profile at bumcheekcity http://bumcheekcity.com/kol/profile.php?u=edwin%20the%20pastinaceous An amazing browser game. Don't let the art fool you, this game has depth. They are adding content all the time. Great humor and a rather addictive game if you get into it. My character is Edwin the Pastinaceous, if you end up playing send me a message and I can help you out a bit. http://www.kingdomofloathing.com/
Tiny antelope!! [img [Klipspringer - pen - Image]]
I didn't really capture how huge its beak looks. [img [Kookaburra - pen - Image]]
When I think about how to say something in French I get the answer in Spanish. This is a problem.
Bienvenue en France et à Paris !<br><br>Utilisateur de TiddlyWiki, j'ai eu l'occasion de remarquer vos contributions sur cet outil bien pratique (in English, not in Spanish ;-)<br><br>Will your new company be somewhat or totally related to France ?
I am going to be doing design for electronics and consumer communication systems, so there isn't anything specific to France. If things go well and we decide to stay in France I am hoping to get an entrepreneur visa.<br><br>I am not sure where I am going to be after this next year so I am making sure the work I do doesn't depend on me being anywhere specific.
.left-menu-text { width: {{$:/plugins/inmysocks/iconmenus/icon_menu_settings!!left_menu_width}}; color:lightblue; padding-top:0px; } .left-menu-text:hover { background:grey; }
<<tabs "[[Book List]] [[Add Books]] [[Manage Books]] [[Library Tracker Settings]]" "[[Book List]]">>
\define thisRemoveAuthor() Select Author: <$select tiddler='Library Tracker Settings' field='edit_author_list'><$list filter='[[$:/data/BookAuthors]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookAuthors##$(AuthorToRemove)$'>Remove Author</$button> \end \define thisRemoveSeries() Select Series: <$select tiddler='Library Tracker Settings' field='edit_series_list'><$list filter='[[$:/data/SeriesTitles]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/SeriesTitles##$(SeriesToRemove)$'>Remove Series</$button> \end \define thisRemoveGenre() Select Genre: <$select tiddler='Library Tracker Settings' field='edit_genre_list'><$list filter='[[$:/data/BookGenres]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookGenres##$(GenreToRemove)$'>Remove Genre</$button> \end \define thisRemoveLocation() Select Location: <$select tiddler='Library Tracker Settings' field='edit_location_list'><$list filter='[[$:/data/BookLocations]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookLocations##$(LocationToRemove)$'>Remove Location</$button> \end \define thisRemoveTag() Select Tag: <$select tiddler='Library Tracker Settings' field='edit_tag_list'><$list filter='[[$:/data/BookTags]indexes[]]'><option><<currentTiddler>></option></$list></$select> <$button set='$:/data/BookTags##$(TagToRemove)$'>Remove Tag</$button> \end <$checkbox tiddler='Library Tracker Settings' field='show_author' checked=true unchecked=false>Show Author</$checkbox><br> <$checkbox tiddler='Library Tracker Settings' field='show_series' checked=true unchecked=false>Show Series</$checkbox><br> <$checkbox tiddler='Library Tracker Settings' field='show_genre' checked=true unchecked=false>Show Genre</$checkbox><br> <$checkbox tiddler='Library Tracker Settings' field='show_location' checked=true unchecked=false>Show Location</$checkbox><br> <$checkbox tiddler='Library Tracker Settings' field='show_tags' checked=true unchecked=false>Show Tags</$checkbox><br> !!Edit Author List <$set name=AuthorToRemove value={{Library Tracker Settings!!edit_author_list}}> <<thisRemoveAuthor>> </$set> !!Edit Series List <$set name=SeriesToRemove value={{Library Tracker Settings!!edit_series_list}}> <<thisRemoveSeries>> </$set> !!Edit Genre List <$set name=GenreToRemove value={{Library Tracker Settings!!edit_genre_list}}> <<thisRemoveGenre>> </$set> !!Edit Location List <$set name=LocationToRemove value={{Library Tracker Settings!!edit_location_list}}> <<thisRemoveLocation>> </$set> !!Edit Tag List <$set name=TagToRemove value={{Library Tracker Settings!!edit_tag_list}}> <<thisRemoveTag>> </$set>
A drawing I did of one of my friends while experimenting with different styles. I like how it turned out. [img [Lines - Image]]
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
I really should remember to use `<a>` tags for links so I can make links open in a new tab.
I need to get some way to integrate a url shortener.
''I need to add how to get ssh for non-linux systems and hopefully find someone who can write up how to do this on windows or a mac.'' Short version: Open up a terminal and type (or copy paste, in linux you can paste into a terminal by using ctrl+shift+v) ``` ssh -l pi <<IP of your raspberry pi>> ``` You will then be asked for the password, so type in the password (`raspberry` by default, if you changed it than whatever you changed it to). After that you should have a command prompt that looks something like this: ``` pi@raspberrypi ~ $ ``` and you are in. If you have changed the username on your raspberry pi than you need to change `pi` to whatever the username is, the command prompt will also have your username instead of pi. how do you find the ip address if you don't have access to the router? I should figure that out.
I like how this looks. [img [Long Exposure of the Effel Tower at Night - Image]]
My boss just introduced me as 'the magic realizer of dreams'. I like this job title.
/*\ title: makeCommentTiddlers.js type: application/javascript module-type: macro \*/ (function(){ exports.name = "makeCommentTiddlers"; exports.params = [ { name: "postname" }, { name: "kickback" } ]; exports.run = function(postname, kickback) { postname = postname.replace(/\'/g, "APOSTROPHIEPLACEHOLDER"); var canonUrl = "http://ooktech.com/hashover.php?canon_url=" + kickback + "?" + postname; var xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", canonUrl, false ); xmlHttp.send( null ); if (xmlHttp.readyState==4 && xmlHttp.status==200) { eval(xmlHttp.responseText); } var comments = give_comments(); var outputstring = '.'; if (comments != "no comments") { for (var i = 0; i < comments.length; i++) { var post = comments[i].post; post = post.replace(/APOSTROPHIEPLACEHOLDER/g, "\'"); outputstring += '<$action-setfield $tiddler=\"\"\"' + post + '-' + comments[i].permalink + '\"\"\" ' + 'author=\"\"\"' + comments[i].sort_name + '\"\"\" ' + 'sort_date=' + comments[i].sort_date + ' readable_date=\"\"\"' + comments[i].twdate + '\"\"\" text=\"\"\"' + comments[i].comment + '\"\"\" tags=\"\"\"Comment [[' + post + ']]\"\"\"/>'; } } return outputstring; }; })();
\define thisSeriesSelect() <$select tiddler={{!!book_title}} field='series' default='None'> <$list filter='[[$:/data/SeriesTitles]indexes[]sort[title]regexp:[(?i)$(thisSeriesSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisGenreSelect() <$select tiddler={{!!book_title}} field='genre' default='None'> <$list filter='[[$:/data/BookGenres]indexes[]sort[title]regexp:[(?i)$(thisGenreSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisAuthorSelect() <$select tiddler={{!!book_title}} field='author'> <$list filter='[[$:/data/BookAuthors]indexes[]sort[title]regexp:[(?i)$(thisAuthorSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisLocationSelect() <$select tiddler={{!!book_title}} field='location' default='None'> <$list filter='[[$:/data/BookLocations]indexes[]sort[title]regexp:[(?i)$(thisLocationSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisTagSelect() <$select tiddler='$:/state/booktag' field='selected_tag'> <$list filter='[[$:/data/BookTags]indexes[]sort[title]regexp:[(?i)$(thisTagSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisBookSelect() <$select field='book_title'> <$list filter='[tag[Book]sort[title]regexp:[(?i)$(thisBookSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisRemoveBookButton() <$button popup='$:/state/test'>Remove Book</$button> <$reveal type="popup" state="$:/state/test"> <div class="tc-drop-down"> {{DeleteBookConfirmation}} </div> </$reveal> \end Book: <$set name=thisBookSearch value={{$:/state/newbook!!narrow_book_select}}> <<thisBookSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_book_select' placeholder='Narrow Book List'/> (<<thisRemoveBookButton>>) <br> <!--Author--> <$reveal type=match text=true state='Library Tracker Settings!!show_author'> Author: <$reveal state='$:/state/Library Tracker/add author' type=nomatch text='new'> <$set name=thisAuthorSearch value={{$:/state/newbook!!narrow_author_select}}> <<thisAuthorSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_author_select' placeholder='Narrow Author List'/> (<$button set='$:/state/Library Tracker/add author' setTo='new'>New Author</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add author' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_author' placeholder='Author'/><$button><$action-setfield $tiddler='$:/data/BookAuthors' $index={{$:/state/newbook!!book_author}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_author' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add author' setTo='notnew'>Done</$button> </$reveal><br> </$reveal> <!--End Author--> <!--Series--> <$reveal type=match text=true state='Library Tracker Settings!!show_series'> Series: <$reveal state='$:/state/Library Tracker/add series' type=nomatch text='new'> <$set name=thisSeriesSearch value={{$:/state/newbook!!narrow_series_select}}> <<thisSeriesSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_series_select' placeholder='Narrow Series List'/> (<$button set='$:/state/Library Tracker/add series' setTo='new'>New Series</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add series' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_series' placeholder='Series Title'/><$button><$action-setfield $tiddler='$:/data/SeriesTitles' $index={{$:/state/newbook!!book_series}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_series' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add series' setTo='notnew'>Done</$button> </$reveal><br> </$reveal> <!--End Series--> <!--Genre--> <$reveal type=match text=true state='Library Tracker Settings!!show_genre'> Genre: <$reveal state='$:/state/Library Tracker/add genre' type=nomatch text='new'> <$set name=thisGenreSearch value={{$:/state/newbook!!narrow_genre_select}}> <<thisGenreSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_genre_select' placeholder='Narrow Genre List'/> (<$button set='$:/state/Library Tracker/add genre' setTo='new'>New Genre</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add genre' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_genre' placeholder='Genre'/><$button><$action-setfield $tiddler='$:/data/BookGenres' $index={{$:/state/newbook!!book_genre}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_genre' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add genre' setTo='notnew'>Done</$button> </$reveal><br> </$reveal> <!--End Genre--> <!--Location--> <$reveal type=match text=true state='Library Tracker Settings!!show_location'> Location: <$reveal state='$:/state/Library Tracker/add location' type=nomatch text='new'> <$set name=thisLocationSearch value={{$:/state/newbook!!narrow_location_select}}> <<thisLocationSelect>></$set> <$edit-text tiddler='$:/state/newbook' field='narrow_location_select' placeholder='Narrow Location List'/> (<$button set='$:/state/Library Tracker/add location' setTo='new'>New Location</$button>) </$reveal> <$reveal state='$:/state/Library Tracker/add location' type=match text='new'> <$edit-text tiddler='$:/state/newbook' field='book_location' placeholder='Location'/><$button><$action-setfield $tiddler='$:/data/BookLocations' $index={{$:/state/newbook!!book_location}} $value=1/><$action-setfield $tiddler='$:/state/newbook' $field='book_location' $value=''/>Add</$button><$button set='$:/state/Library Tracker/add location' setTo='notnew'>Done</$button> </$reveal> </$reveal><br><br> <!--End Location--> <!--Tags--> <$reveal type=match text=true state='Library Tracker Settings!!show_tags'> Tags (it will always be tagged with `Book` by default):<br> <$reveal type=match state='$:/state/newbook!!add_or_create_tag' text='create'> New Tag: <$edit-text tiddler='$:/state/booktag' field='tag_temp' placeholder='New Tag'/> <$button>Create Tag <$action-setfield $tiddler='$:/data/BookTags' $index={{$:/state/booktag!!tag_temp}} $value=1/> <$action-setfield $tiddler='$:/state/booktag' $field='tag_temp' $value=''/> </$button> <$button set='$:/state/newbook!!add_or_create_tag' setTo='nocreate'>Done</$button><br> </$reveal> <$reveal type='nomatch' state='$:/state/newbook!!add_or_create_tag' text='create'> Tag to add: <$set name=thisTagSearch value={{$:/state/newbook!!narrow_tag_select}}> <<thisTagSelect>> </$set> <$fieldmangler tiddler={{!!book_title}}> <$button> <$action-sendmessage $message='tm-add-tag' $param={{$:/state/booktag!!selected_tag}}/>Add Tag </$button> <$edit-text tiddler='$:/state/newbook' field='narrow_tag_select' placeholder='Narrow Tag List'/> (<$button set='$:/state/newbook!!add_or_create_tag' setTo='create'>New Tag</$button>) </$fieldmangler> <br> </$reveal> List of current tags:<br> <$fieldmangler tiddler={{!!book_title}}> <$list filter='[{!!book_title}tags[]]-Book'><$view field='title'/> <$button>Remove Tag<$action-sendmessage $message='tm-remove-tag' $param=<<currentTiddler>>/></$button><br> </$list> </$fieldmangler> </$reveal> <!--End Tags-->
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
<ul> <li><a href="https://twitter.com/maybejed" rel="me">@maybejed on Twitter</a></li> <li><a href="https://github.com/inmysocks" rel="me">Inmysocks on Github</a></li> <li><a href="https://plus.google.com/+JedCarty" rel="me">Google+</a></li> <li><a href="https://www.facebook.com/jed.carty.3" rel="me">Facebook</a></li> <li><a href="http://inmysocks.tiddlyspot.com">Wiki Reference Wiki</a></li> </ul> <p class="h-card"> <img class="u-photo" src="./images/zebra-pencil-icon.jpg" alt="Pencil drawing of a zebra" /> <a class="p-nickname u-url" href="http://ooktech.com/jed/externalbrain/">inmysocks</a> <a rel="me" href="mailto:inmysocks@fastmail.com" class="u-email">inmysocks@fastmail.com</a> <a rel="me" href="mailto:inmysocks@gmail.com" class="u-email">inmysocks@gmail.com</a> <p class="p-org">OokTech</p> <p class="p-note">What did you expect?</p> </p> {{question}}
And now she is so very tired. <<imageSlider [[Javert is tired after playing in the snow - Image]] "Javert has no stamina">>
<$button class='left-menu-text tc-btn-invisible' tooltip='Bookmarks Manager'>Bookmarks <$action-navigate $to='Bookmarks'/> </$button>
<$button class='tc-btn-invisible' popup='$:/state/menuicon/boringstuffpopup' tooltip='Boring Options'>{{$:/core/images/right-arrow}}</$button> <$reveal type='popup' state='$:/state/menuicon/boringstuffpopup'> <div class='tc-drop-down tc-popup-keep'> <<MobileMenu MenuName:"BoringStuff" MenuType:Menu ListField:"menu_list" ShowBody:Body>> </div> </$reveal>
@@.tc-icon-menu-icon-calendar <$button class='tc-btn-invisible' tooltip='Calendar Archives' to='Calendar Archives'><<fa 'fa-calendar'>></$button> @@
<$button class='left-menu-text tc-btn-invisible'>Change Log <$action-navigate $to='Change Log'/> </$button>
<$button class='tc-btn-invisible' popup="$:/state/changetiddlerwidthpopup" tooltip='Change Tiddler Width'>{{$:/core/images/right-arrow}}</$button> <$reveal type="popup" state="$:/state/changetiddlerwidthpopup"> <div class="tc-drop-down tc-popup-keep" style='position:relative;left:1em;top:-1em'> {{TiddlerWidthSettings}} </div> </$reveal>
<$button class='left-menu-text tc-btn-invisible' tooltip='Check for new comments' to='Check for new comments'> Check comments </$button>
<$button class='left-menu-text tc-btn-invisible'>Dashboard <$action-navigate $to='Dashboard'/> </$button>
@@color:skyblue; <$button class='tc-btn-invisible' to='Font Options' tooltip='Change font options'><<fa fa-font>></$button> @@
<$button class='left-menu-text tc-btn-invisible'>Gallery <$action-navigate $to='My Gallery - Drawing and Photography'/> </$button>
<$button class='left-menu-text tc-btn-invisible'>Games I Play <$action-navigate $to='Games I Play'/> </$button>
<$button class='tc-btn-invisible' to='About Stuff' tooltip='About me and this site' class=<<tv-config-toolbar-class>>><<fa fa-question>></$button>
@@.tc-icon-menu-icon-comment <$button class='tc-btn-invisible' to=Comments tooltip='Leave a comment'><<fa fa-comment-o>></$button> @@
<$button class='left-menu-text tc-btn-invisible'>Library Tracker <$action-navigate $to='Library Tracker'/> </$button>
<$button class='left-menu-text tc-btn-invisible'>Me <$action-navigate $to='Who is this inmysocks guy?'/> </$button>
<$button class='left-menu-text tc-btn-invisible'>My Blog <$action-navigate $to='My Blog'/> </$button>
@@color:lightblue; <$button class='tc-btn-invisible' to='New Blog Post' tooltip='New Blog Post'><<fa fa-plus-circle>></$button> @@
<$button class='left-menu-text tc-btn-invisible'>People <$action-navigate $to='people'/> </$button>
<a class="twitter-share-button" href="https://twitter.com/share" tooltip='Send a Tweet'> <<fa fa-twitter>> </a>
@@text-align:left; <$scrollable fallthrough="no"> <div class="tc-sidebar-header"> <h1 class="tc-site-title"> <$transclude tiddler="$:/SiteTitle" mode="inline"/> </h1> <div class="tc-site-subtitle"> <$transclude tiddler="$:/SiteSubtitle" mode="inline"/> </div> {{||$:/core/ui/PageTemplate/pagecontrols}} <$transclude tiddler="$:/core/ui/SideBarLists" mode="inline"/> </div> </$scrollable> @@
<$button class='left-menu-text tc-btn-invisible'>Tutorials <$action-navigate $to='Tutorials'/> </$button>
<a class="twitter-mention-button" href="https://twitter.com/intent/tweet?screen_name=maybejed"> @maybejed </a>
<div class='left-menu-text'> <$button class='left-menu-text tc-btn-invisible'>Twitter <$action-navigate $to='Twitter Integration'/> </$button> </div>
@@color:beige; <$list filter='[[$:/data/Random Background URL List]indexes[]nth{$:/state/Random Background!!number}]' variable=ThisIndex> <$button class='tc-btn-invisible' tooltip='Change Background Image'><<fa fa-image>> <$action-storecount $filter='[[$:/data/Random Background URL List]indexes[]]' $tiddler='$:/state/Random Background' $field='total_num'/> <$action-randval $tiddler='$:/state/Random Background' $field='number' $lower=1 $upper={{$:/state/Random Background!!total_num}} $step=1 $numrolls=1/> <$action-setfield $tiddler='$:/state/Random Background' $field=text $value=<<ThisIndex>>/> </$button> </$list> @@
A friend of mine suggested that I start playing minecraft and could be regretting the decision. Giving me legos in a digital format may eat up way too much of my life.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
I have been putting effort into moving away from using online cloud based services lately. Instead of trying to explain I will give you [[this video|https://ind.ie/about/manifesto/]] of a talk by Aral Balkan. He explains it much more eloquently than I would. These are just some notes about the services I currently use and my progress on moving away from them. In the future I will post step by step instructions for how I set up replacements in case anyone else wants to. Hopefully these instructions won't require any knowledge on your part. Moving out of the cloud is only significant if it is easy enough that people start using the alternatives. Dropbox to syncthing on a raspberry pi is already set up, I just need to write the instructions out in a readable way. For moving away from the social media stuff I am using this site, so it is partially finished. I need to find a way to add comments. I will hopefully have good instructions and whatever else you need here soon. I haven't had a chance to set up ~GitLab on a raspberry pi, but when I do I will put up instructions if it works reasonably well. The email server may take a while, I may wait until I get to France for that. ''Note: Everywhere I talk about a raspberry pi I am using a raspberry pi 2. I am just too lazy to go through and add the 2 in every instance. I think that syncthing will work on an original raspberry pi, I don't know about the rest.'' Online tools that I currently use that are controlled by someone else: *''Dropbox'' - online file storage *''GMail'' - email service *''Google+'' - social media *''Facebook'' - social media *''Twitter'' - social media *''Google Chat/messenger/whatever it is called'' - instant messaging *''~GitHub'' - git *''~TiddlySpot'' - online tiddlywiki hosting ''Dropbox'' There are multiple reasons to stop using Dropbox: *First, the free 2 gig version isn't enough for what I have been using it for, so I would have to start paying $10/month for the 1TB version. *I can use [[syncthing|https://syncthing.net/]] and have a dedicated raspberry pi as a server with however much storage I feel like giving it for the price of a raspberry pi (a one time cost of less than US$50 for the pi and other required hardware) plus the cost of whatever extra storage I want. So it would take less than a year for the raspberry pi based server to pay for itself. Because syncthing doesn't require a static ip there are no costs associated with getting a domain or worrying about a dns or any of that. *Dropbox is controlled by someone else and they have the ability to cut off my access whenever they want. They also have access to everything I put on their servers. I don't like this. ''GMail'' GMail has similar reasons, but may be a bit harder to replace, harder doesn't mean impossible. Also syncthing is really easy to set up. There are instructions for running your own email server many places around the web, either on a normal desktop or using a raspberry pi (multiple sources for instructions [[1|https://samhobbs.co.uk/raspberry-pi-email-server]] [[2|http://www.prismaqf.com/pebble/geek/2012/12/24/1356382140000.html]] [[3|http://www.ducky-pond.com/posts/2012/Jul/installing-citadel-on-rpi/]] and undoubtedly others.). I may even be able to set up the mail server on the same pi as syncthing, since syncthing takes almost no processing power when it isn't actively syncing files. I haven't tested that yet. My biggest concern here is getting everyone to switch to using the new email address, setting GMail to forward everything still gives them all my emails. ''Google+'' I don't actually need a replacement for this, but social media sites have become so common that people expect you to have a profile. This website (the one you are reading) already acts as a replacement for posting content. I put links to what I post here on goolge+ every so often, but since they don't have a way to post to their site through third party applications I have to do it manually and rarely bother. For most practical purposes I have stopped using it other than to browse what other people post. Unless the friends I have there also move away from using it than I will keep the account open. I haven't decided if I am going to remove what is currently there or not. ''Facebook'' Same as google+, but using twitter I can post links to facebook from this website. I use facebook to see what other people are posting, but this is happening less frequently than it used to. I use facebook, through twitter, to alert other people when I post things here. ''Twitter'' I follow some people and use it to tell people when I post here. I almost never post directly to twitter. If I lose my account my only loss is a convenient way to post links back here. I am ok with how I am currently using it until some better alternative is created. The nice thing about twitter is that I can post to twitter automatically from this site and have twitter post to facebook. ''Google Chat'' This is the one I use the most by far. There are plenty of alternatives, the biggest problem is that because instant messaging necessarily requires multiple people to make any switch meaningful other people have to switch also. I do like [[cryptocat|https://crypto.cat/]], and it can work through facebook's im service. It is encrypted so facebook gets encrypted data. It still uses your account on their service so who you are talking to and how often you say something is still visible to them. I am not actually familiar with any alternatives for video chat (besides skype, which isn't a better option). I should look into this. ''~GitHub'' I don't really have a problem with ~GitHub aside from it being controlled by someone else who has no real motivation to protect the projects on the site. It is convenient and anything I put on it I want to be public anyway. The controlled by someone else part is my motivation to start to use [[GitLab|https://about.gitlab.com/]] where possible (and for private development for OokTech). Once again, I may be able to put [[GitLab on a raspberry pi|https://about.gitlab.com/2015/04/21/gitlab-on-raspberry-pi-2/]] (I like my toys, the raspberry pi is my newest one. If all have a hammer...). ~GitLab may be too processor intensive to have on the same pi as syncthing and the email server, but I haven't tried yet. ''~TiddlySpot'' I am not at all worried about ~TiddlySpot, I have [[my TiddlyWiki reference wiki|http://inmysocks.tiddlyspot.com]] hosted there for free. All the information on it is meant to be available to anyone for their own use and the only danger is tiddlyspot going under and me losing the hosting. In that case I would move it to my own domain and it wouldn't really be a problem aside from people possibly not knowing the new location. I have already replaced it in the sense that everything new gets posted to my own domain. ''So...'' Dropbox and GMail are the biggest ones, and I have a solution for them that I just need to fully implement. There is significant work being done to replace social media services, so that will only take time. ~GitHub and ~TiddlySpot aren't really problems, but I have easy alternatives to them anyway, I just need to start using ~GitLab. All in all I think I am doing pretty well.
<a class="muut" href="https://muut.com/i/jedexternalbrain/comments" type="dynamic">jedexternalbrain forum</a>
<script src="//cdn.muut.com/1/moot.min.js"></script>
If you click on the title of a post it will open up in its own [[tiddler|What is a tiddler?]], you can use this to get a permalink to posts. Click on the # button in the upper right of a post after you open it to set the browser url to the permalink for the post. ''To leave a comment'' - click on the post title and you can leave comments at the bottom of the posts tiddler that opens up. <<tabs "[[Normal Posts]][[Small Things]][[Image Posts]]" [[Normal Posts]] [[$:/state/My Blog/Tabs]]>>
Click on one of the images to open up its tiddler, at the top of the images tiddler there will be left and right arrows that you can click to go to the previous and next images. <style> .my-gallery jpg { width: 6em; height: 6em; margin: 1em; } </style> <div class="my-gallery"> <$list filter="[tag[My Drawing]sort[title]][tag[Photograph]sort[title]]" template=GalleryImageTemplate> </$list> </div>
I was too sick to go to work this morning and I have been a bit feverish all day so nothing has really seemed real. Felicity had an event this evening which she hadn't told me anything about other than that I should show up. So I walk into the room where the event is and I immediately get introduced to Leila Aichi. For those of you who don't know, she is a senator for the green party here in France. I was really not expecting that.
As an honest to god Jed I ganerntee that I can actually do what I say. Incidently if you have a lepercan problem, I can solve that too, with nazi-like precision. And if you find weasles in your weaslery I can eat them all no problem. Look at my beard, itsn’t it lovely? Look how it glowsm in the light like a fine mass of hair, look how it shimmers with the leftovers of my coffee. Yes, this is a real beard, I ain’t no faux beard wearer like those you see in the malls around Christmas. Yes, my beard is my defining characteristic. I care not for these others who pretend with their pretend beardsm those damn assholes. If you hire any of them along side me. I will totally run them over with my beard’s forklift. Yes, I bought it its own forklift. Bow before my awesome beard.. BOW Written by <a href='https://www.facebook.com/chaindrain?fref=ts'>Devon Stevens</a>
It turns out that my raspberry pi works, it just took a while for the polyfuse to reset. Now the problem is that I don't have a display it will work with because my monitor DVI input got fried when the raspberry pi had its troubles. I just tried go get a cheap monitor off of craigs list but the guy sold it to someone else. Also, I can tweet this and post it to my site at the same time. Hopefully I will find a way to do this with one button instead of two, but two works for now. Anyway, finding out I didn't break the pi the third day I had it makes me feel a bit better about the world. I am still upset about the monitor though.
In trivial news, my tablet refuses to connect to the WiFi. That is all.
<a class="twitter-timeline" href="https://twitter.com/MaybeJed" data-widget-id="573290794934657024">Tweets by @~MaybeJed</a>
<a class="twitter-timeline" href="https://twitter.com/MaybeJed/lists/neat-stuff" data-widget-id="574996304016732160">Tweets from https://twitter.com/MaybeJed/lists/neat-stuff</a>
Some stuff about her contributions to science: https://embryo.asu.edu/pages/studies-spermatogenesis-1905-nettie-maria-stevens She started her education in biology in her early 40s and unfortunately she was only actively working as a scientist for a few years years (started studying biology in 1901, died in 1912) before dying of breast cancer. She is one of the easy examples of why the barriers to women in science careers have immeasurably damaged our species. She managed this progress in 11 only years, how many people have been unable to contribute because of these arbitrary barriers?
\define thisMakeTags() [[My Blog]] \define thisGetCreationTemplate() $(SelectedTemplate)$_creation_template \end \define thisTagSelect() <$select tiddler='$:/state/New Blog Post' field='selected_tag'> <$list filter='[[$:/data/New Blog Post/Blog Post Tags]indexes[]regexp:[(?i)$(tagSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$select> \end \define thisMakeTweetSummary() $(TITLE)$ - $(SUMMARY)$ \end \define thisMakePostURL() http://ooktech.com/jed/externalbrain%23$(TITLE)$ \end Post Title: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' field='new_post_title' placeholder='Post Title'/> Template: <$select tiddler='$:/templates/blog/BasicBlogPostTemplate' field='template'><$list filter='[tag[Blog Template]]'><option value=<<currentTiddler>>><$view field='caption'/></option></$list></$select> <$set name=SelectedTemplate value={{$:/templates/blog/BasicBlogPostTemplate!!template}}> <$transclude tiddler=<<thisGetCreationTemplate>>> </$transclude> Summary: <$edit-text class='tc-edit-texteditor' tiddler='$:/temp/NewBlogPost' field='summary' placeholder='Post Summary'/> </$set> Tags (it will always be tagged with `Blog Post` by default):<br> <$reveal type=match state='$:/state/New Blog Post!!add_or_create_tag' text='create'> New Tag: <$edit-text tiddler='$:/temp/New Blog Post' field='tag_temp' placeholder='New Tag'/> <$reveal type=nomatch state='$:/temp/New Blog Post!!tag_temp' text=''> <$button>Create Tag <$action-setfield $tiddler='$:/data/New Blog Post/Blog Post Tags' $index={{$:/temp/New Blog Post!!tag_temp}} $value=1/> <$action-setfield $tiddler='$:/temp/New Blog Post' $field='tag_temp' $value=''/> </$button> </$reveal> <$reveal type=match state='$:/temp/New Blog Post!!tag_temp' text=''> <$button>Create Tag</$button> </$reveal> <$button set='$:/state/New Blog Post!!add_or_create_tag' setTo='nocreate'>Done</$button><br> </$reveal> <$reveal type='nomatch' state='$:/state/New Blog Post!!add_or_create_tag' text='create'> Tag to add: <$set name=tagSearch value={{$:/temp/New Blog Post!!narrow_tag_select}}> <<thisTagSelect>> </$set> <$edit-text tiddler='$:/temp/New Blog Post' field='narrow_tag_select' placeholder='Narrow Tag List'/> <$fieldmangler tiddler='$:/templates/blog/BasicBlogPostTemplate'> <$button> <$action-setfield $tiddler='$:/temp/New Blog Post/NewBookmark' $field='dummy_field' value='1'/> <$action-sendmessage $message='tm-add-tag' $param={{$:/state/New Blog Post!!selected_tag}}/>Add Tag </$button>(<$button set='$:/state/New Blog Post!!add_or_create_tag' setTo='create'>New Tag</$button>) </$fieldmangler> <br> </$reveal> List of current tags:<br> <$fieldmangler tiddler='$:/templates/blog/BasicBlogPostTemplate'> <$list filter='[[$:/templates/blog/BasicBlogPostTemplate]tags[]]-[[Blog Post]]-[[My Blog]]'><$view field='title'/> <$button>Remove Tag<$action-sendmessage $message='tm-remove-tag' $param=<<currentTiddler>>/></$button><br> </$list> </$fieldmangler> <$reveal type='nomatch' state='$:/temp/NewBlogPost!!new_post_title' text=''> <$list filter='[{$:/temp/NewBlogPost!!new_post_title}!has[text]]'> <$fieldmangler tiddler={{$:/temp/NewBlogPost!!new_post_title}}> <$set name=TITLE value={{$:/temp/NewBlogPost!!new_post_title}}> <$set name=SUMMARY value={{$:/temp/NewBlogPost!!summary}}> <$set name=URL value=<<thisMakePostURL>>> <$set name=TEXT value={{$:/temp/NewBlogPost}}> <$reveal type='nomatch' state='$:/temp/New Blog Post/type' text='Small Thing'> <$macrocall $name=twitterify-url text=<<thisMakeTweetSummary>> url=<<URL>>/> </$reveal> <$reveal type='match' state='$:/temp/New Blog Post/type' text='Small Thing'> <$macrocall $name=twitterify-url text=<<TEXT>> url=<<URL>> full=true/> </$reveal> </$set> </$set> </$set> </$set> <$button>Make Post <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='text' $value={{$:/temp/NewBlogPost}}/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='posted' $value=<<now>>/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='year' $value=<<now YYYY>>/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='month' $value=<<now MMM>>/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='day' $value=<<now DD>>/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='time' $value=<<now YYYY0MM0DD0hh0mm0ss>>/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='summary' $value={{$:/temp/NewBlogPost!!summary}}/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' image={{$:/temp/NewBlogPost!!image}} image_caption={{$:/temp/NewBlogPost!!image_caption}} link={{$:/temp/NewBlogPost!!link}} width={{$:/temp/NewBlogPost!!width}}/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' $field='title' $value={{$:/temp/NewBlogPost!!new_post_title}}/> <$action-setfield $tiddler='$:/temp/NewBlogPost' text='' new_post_title='' tags='' summary='' image='' image_caption='' link='' width='' tooltip=''/> <$action-setfield $tiddler='$:/templates/blog/BasicBlogPostTemplate' text='' posted='' tags=<<thisMakeTags>> summary='' month='' day='' year='' time='' image='' image_caption='' link='' width=''/> <$action-sendmessage $message='tm-add-tag' $param={{$:/temp/New Blog Post/type!!text}}/> <$action-sendmessage $message='tm-save-wiki'/> </$button> </$fieldmangler> <$radio tiddler='$:/temp/New Blog Post/type' field='text' value='Normal Post'>Normal Post</$radio> <$radio tiddler='$:/temp/New Blog Post/type' field='text' value='Small Thing'>Small Thing</$radio> <$radio tiddler='$:/temp/New Blog Post/type' field='text' value='Image Post'>Image Post</$radio> </$list> <$list filter='[{$:/temp/NewBlogPost!!new_post_title}has[text]]'> ''That title is already in use, pick a new title.'' </$list> </$reveal> <$reveal type='match' state='$:/temp/NewBlogPost!!new_post_title' text=''> ''You need to give the post a title before you can post it.'' </$reveal> <<tabs "[[Nothing]][[Preview Blog Post]][[Reference HTML]][[Cheat With HTML]]" "[[Nothing]]">>
I now have 2 24" monitors, together they cost me less than a single new one. Craigslist can be awesome.
<$edit tiddler="Stupid spiders it's my shower"/>
<<TestMacro "New Tiddler 1">>
<$macrocall $name=CommentsJavascriptMacro postname={{!!title}} >>
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
No sleep tonight. I can pretend it's because I am adjusting to Paris time, not because I am nervous.
There was some trouble because both the tiddlywiki server and the web interface for syncthing wanted to use port 8080. I changed the port that syncthing was listening on for the web interface, but then in just opened a broken version of it while the port I changed it to worked. So I ended up turning off the web interface before realizing that I could change the port node used for tiddlywiki. I should probably turn the syncthing web interface back on at some point. That is two projects more or less finished today. I can live with that. They were closely related and pretty small projects to start with, but they could end up being very useful.
A comment here to test it
\define thisDisplayWithTemplate() {{$(TiddlerToDisplay)$||$(TemplateToUse)$}} \end !Recent Posts: --- <$list filter='[tag[My Blog]tag[Normal Post]!nsort[time]limit{$:/settings/Blog Settings!!num_recent_posts}]'> <$set name=TiddlerToDisplay value=<<currentTiddler>>> <$set name=TemplateToUse value={{!!template}}> <<thisDisplayWithTemplate>> </$set> </$set> </$list> <h2>Older Posts:</h2> --- Year: <$select tiddler='$:/state/My Blog/Normal Posts/Older Posts' field=year> <option>All</option> <$list filter='[tag[My Blog]tag[Normal Post]has[year]each[year]get[year]nsort[year]]'> <option><<currentTiddler>></option> </$list> </$select> Month: <$select tiddler='$:/state/My Blog/Normal Posts/Older Posts' field=month> <option>All</option> <$list filter='[tag[My Blog]tag[Normal Post]has[month]each[month]get[month]nsort[month]]'> <option><<currentTiddler>></option> </$list> </$select> <$reveal type=match state='$:/state/My Blog/Normal Posts/Older Posts!!year' text='All'> <$list filter='[tag[My Blog]tag[Normal Post]has[year]each[year]get[year]nsort[year]]' variable=CurrentYear> ''__<<CurrentYear>>__''<br> <$reveal type=match state='$:/state/My Blog/Normal Posts/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Normal Post]has[month]each[month]get[month]nsort[month]]' variable=CurrentMonth> __<<CurrentMonth>>__<br> <$list filter='[tag[My Blog]tag[Normal Post]!tag[Templates]month<CurrentMonth>!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Normal Posts/Older Posts!!month' text='All'> __{{$:/state/My Blog/Normal Posts/Older Posts!!month}}__<br> <$list filter='[tag[My Blog]tag[Normal Post]!tag[Templates]month{$:/state/My Blog/Normal Posts/Older Posts!!month}!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$reveal> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Normal Posts/Older Posts!!year' text='All'> ''__{{$:/state/My Blog/Normal Posts/Older Posts!!year}}__''<br> <$reveal type=match state='$:/state/My Blog/Normal Posts/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Normal Post]has[month]each[month]get[month]nsort[month]]' variable=CurrentMonth> __<<CurrentMonth>>__<br> <$list filter='[tag[My Blog]tag[Normal Post]!tag[Templates]month<CurrentMonth>!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Normal Posts/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Normal Post]!tag[Templates]month{$:/state/My Blog/Normal Posts/Older Posts!!month}!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$reveal> </$reveal>
The raspberry pi boots when plugged into the 2A supply, but not for the 700mA supply. This may be because the fuse hasn't fully recovered. All I know is that the pi boots, I don't have a display to try out because the DVI in on my monitor doesn't work. I just made pancakes. Pancakes are delicious. I generally use pancakes as an excuse to eat way too much butter.
I just went ice skating on the Eiffel tower. What did you do with your evening?
The email only said 'I have a contract for you'. I demand better quality spam!
And I find out that having ! at the end of a post title breaks things. Le sigh. I will fix it later.
I am about to take apart my computer so I can bring it to Paris. I hope I don't break like last time.
Welcome to Europe! Please arrive safe and sound...you and your computer. As a big fan of your TW-stuff, I seem to be constantly translating into danish and learning a lot by doing it. My lovely big black dog, Vaks wants to ask you, where will Javert be?<br><br>Birthe
Javert flew out last week. She has been keeping Felicity company and learning to woof with a French accent.
I am stupidly excited right now. I got every thing but the mail server, and it looks like the mail server isn't going to happen anytime soon because I will need a static IP for it. This is because of my ISP, not because of any technical requirements. But I have written out instructions for everything from setting up the Raspberry Pi itself through logging into your ~GitLab server. I may add more detail later. Things are listed [[here|Tutorials]]. I have instructions for: *[[Getting and setting up a Raspberry Pi]] *[[Logging into your Raspberry Pi via SSH]] *[[How to change the default password of your Raspberry Pi]] *[[Setting up dynamic DNS on your Raspberry Pi]] *[[Installing syncthing on a Raspberry Pi]] *[[Installing GitLab on a Raspberry Pi]] In case you are wondering, this is exactly the list of things I had to do while setting everything up. I now have this in case I need to reinstall it in the future. Everything here can be found elsewhere online, I just put it all in one place. Edit: I have just added [[Setting up node on a Raspberry Pi for TiddlyWiki]] to the list. Edit 2: My Raspberry Pi 2 is able to have syncthing, ~GitLab and a node ~TiddlyWiki server going at the same time. The CPU usage hasn't gone above 40% yet, but I am currently the only user. This is with syncthing actively syncing, ~GitLab doing a commit and the node server just running, no active modification of the ~TiddlyWiki. I am only one person.
A quick test comment
I got node and tiddlywiki working. I have an apple airport for a router at the moment so I didn't want to get into trying to forward the ports, so I tried weaved.com's software router - it gives you a url like sdjhvkjv.c9.weaved.com and I can get to my tiddlywiki - but I get the error: syncer-browser - 23:06:10 2 7 2015 Sync error while processing '$:/StoryList': XMLHttpRequest error code: 404 - do you think this might something to do with cross-origin requests? or? Weaved works well for ssh connections.<br><br> I suppose I'll have to connect my pi directly to my modem alongside the airport and see if I can open a port to it from there and then get a dynamic DNS. <br><br>Thanks for the instructions, btw - very handy to have all this in one place.
I am going to be moving to Paris this Saturday. Weird.
There isn't much to show here at the moment. This should change in the near future.
<meta property="og:title" content="Jed's Stuff"/> <meta property="og:type" content="website"/> <meta property="og:url" content="http://ooktech.com/jed/externalbrain/"/> <meta property="og:image" content="http://ooktech.com/jed/externalbrain/images/Klipspringer%20-%20pen.JPG"/> <meta property="og:image:width" content="100" /> <meta property="og:image:height" content="100" /> <meta property="og:description" content="Stuff!! Also things. Blog like things along with bookmarks and stuff I don't want to lose. But mostly stuff."/>
I am in the middle of a bunch of things right now. The three biggest are moving to France from the US, trying to finish my dissertation, and starting up my company OokTech. The last two were going to be related but the more I look at the channels I would use for starting up a business using my dissertation work the less I want to touch any of it. So this presents me with a rather serious problem: I want to make things that would benefit people and still eat. I know that there are ways to do this, crowd funding is an obvious choice. But the problem with that is I need a way to show a large enough group of people that I am able to make something that they would like enough to give me money so I can eat while doing it. I would imagine that convincing people of this would require me to have something significant to show already, which requires me to have time to make it and still eat, which brings me back to the original problem. And I have no idea what would be sufficient to demonstrate that. For the cognitive radio project I want to do would demonstrating a self-organizing mutli-hop mesh network with 10 nodes do it? How about 100? Would presenting the theory and plans for creating the network be enough? Would showing that the network is scalable be required? Would I need to demonstrate the full cognitive aspect of it? Would the mixed collection of hardware that I have at the moment (arduinos and some other general purpose microcontrollers and dsps) be enough to demonstrate that it can be done on a wide range of hardware or would I need to do something like make an android or ios app? These are my questions, and depending on the answers I could either be ready in a month with what I have no or it could take a year or two and a few thousand dollars in funding. If I would need to code things for ios and/or android probably longer or enough money to get a dedicated coder with experience. One problem is that I keep starting projects when I probably have too many already. I may have to work on that. Ok, that is enough of that for now. I am going to go do something more interesting now. There is lots of design work to be done. Or video games. Or play with Javert, she leaves for Paris tomorrow. One way or the other. <$reveal state='$:/state/reveal/Open source/hardware, eating and the bootstrapping problem' type='nomatch' text='show'> <$button class='tc-btn-invisible' set='$:/state/reveal/Open source/hardware, eating and the bootstrapping problem' setTo=show>{{$:/core/images/new-button}}If for some reason you want to know the general areas I want to work in with OokTech click here.</$button> </$reveal> <$reveal state='$:/state/reveal/Open source/hardware, eating and the bootstrapping problem' type='match' text='show'> <$button class='tc-btn-invisible' set='$:/state/reveal/Open source/hardware, eating and the bootstrapping problem' setTo=hide><<fa fa-minus>>If for some reason you want to know the general areas I want to work in with OokTech click here.</$button> <br> <br> <br> <div> Things I would like to work on and I have enough experience with to be confident in my ability: <br><br> <p> *Cognitive Radio (Mesh networks, decentralized and distributed networks) *Computer peripherials (custom designs for disabled users, alternate input methods, smart sensors) *Computer assisted hearing/vision aids – I partly lost my hearing a few years ago and the available hearing aids are way too expensive and lack many things I think should be basic features. Hearing aid design is full of potential patent troubles so I would need some sort of serious backing before I could even start with a commercial application. Vision wouldn't be as bad but would require more development. *Smart homes (smart sensors, automated control) ← I wouldn't be involved after design and instillation aside from in a possible support role. I wouldn't collect any user data as I would be trying to provide alternatives to services provided by companies based on data mining. *TiddlyWiki – Because I like playing with it and I am pretty good at making stuff. If I could get paid for it that would be awesome. And I would spend more time on it. </p> </div> I have a working prototype for one project that may have a large enough audience, but I don't have access to the manufacturing capability that would be required to make them in bulk so I would only be able to go forward with it if I can get a reasonably sized group from crowd funding. </$reveal>
In Denmark we have this organisation <a href="http://opfind.nu/english.aspx" target="_blank">http://opfind.nu/english.aspx</a>, I just saw that the pages is translated into English so you might get the idea. This is for Danes in Denmark, but maybe you could find something similar. Help to evaluate ideas...and the right people to contact. Sorry if I am totally off in my naivity! Also organisations working for the handicapped, elderly and so on might be interested in some of your ideas. They have lots of members, so I would guess potential money also. That would of course need a more for the public understandable description.<br>I think that way because I know, that when you create something of great interest you will be up against the mighty.<br>TiddlyWiki: No doubt your are capable, and in time when TW has more users and are more widely known I think it will be possible.<br>Best wishes for you and your company.<br><br>Birthe
Birthe, that looks like exactly what I need. Now I just need to find something like that I can use. But now I have know that at least one service like that exists, so I have a better idea of what to look for. Thank you.<br><br>Maybe I should start looking for people to work with in Denmark.
2 or 3 years ago all papers wrote about all the new startups and inventors in Paris. Angel funds and all that. Try to search for inventor/startup networking groups, preferable with meetups locally. They might have speakers coming to talk about funding and the juridic pitfalls and some may have local knowledge of other possibilities.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
\define my-toc-selective-expandable(tag,sort:"",itemClassFilter) <ol class="tc-toc toc-selective-expandable"> <$list filter="[all[shadows+tiddlers]tag[$tag$]!has[draft.of]$sort$]"> <$list filter="[all[current]toc-link[no]]" variable="ignore" emptyMessage="<<my-toc-linked-selective-expandable-body tag:'$tag$' sort:'$sort$' itemClassFilter:'$itemClassFilter$'>>"> <<my-toc-unlinked-selective-expandable-body tag:"""$tag$""" sort:"""$sort$""" itemClassFilter:"""$itemClassFilter$""">> </$list> </$list> </ol> \end \define my-toc-unlinked-selective-expandable-body(tag,sort:"",itemClassFilter) <$set name="toc-state" value=<<qualify "$:/state/toc/$tag$-$(currentTiddler)$">>> <$set name="toc-item-class" filter="""$itemClassFilter$""" value="toc-item-selected" emptyValue="toc-item"> <li class=<<toc-item-class>>> <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>"> <$reveal type="nomatch" state=<<toc-state>> text="open"> <$button set=<<toc-state>> setTo="open" class="tc-btn-invisible"> <<toc-caption>> </$button> </$reveal> <$reveal type="match" state=<<toc-state>> text="open"> <$button set=<<toc-state>> setTo="close" class="tc-btn-invisible"> <<toc-caption>> </$button> </$reveal> </$list> <$reveal type="match" state=<<toc-state>> text="open"> <$macrocall $name="""toc-selective-expandable""" tag=<<currentTiddler>> sort="""$sort$""" itemClassFilter="""$itemClassFilter$"""/> </$reveal> </li> </$set> </$set> \end \define my-toc-linked-selective-expandable-body(tag,sort:"",itemClassFilter) <$set name="toc-state" value=<<qualify "$:/state/toc/$tag$-$(currentTiddler)$">>> <$set name="toc-item-class" filter="""$itemClassFilter$""" value="toc-item-selected" emptyValue="toc-item"> <li class=<<toc-item-class>>> <$link> <$list filter="[all[current]tagging[]limit[1]]" variable="ignore" emptyMessage="<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>"> <$reveal type="nomatch" state=<<toc-state>> text="open"> <$button set=<<toc-state>> setTo="open" class="tc-btn-invisible"> {{$:/settings/TableOfContentsSettings!!closed_image}} </$button> </$reveal> <$reveal type="match" state=<<toc-state>> text="open"> <$button set=<<toc-state>> setTo="close" class="tc-btn-invisible"> {{$:/settings/TableOfContentsSettings!!open_image}} </$button> </$reveal> </$list> <<toc-caption>> </$link> <$reveal type="match" state=<<toc-state>> text="open"> <$macrocall $name="my-toc-selective-expandable" tag=<<currentTiddler>> sort="""$sort$""" itemClassFilter="""$itemClassFilter$"""/> </$reveal> </li> </$set> </$set> \end
<$checkbox tiddler='Black Line' tag='$:/tags/ViewTemplate'>Show Horizontal Rule Under Tiddler Titles</$checkbox><br> <$checkbox tiddler='$:/core/ui/PageTemplate/sidebar' tag='$:/tags/PageTemplate'>Toggle Old Sidebar</$checkbox> (This only hides the menu, it doesn't change the size of the tiddlers)
<<imageSlider "http://insidemediatrack.com/wp-content/uploads/2014/09/timthumb.jpg" "The Egyptologist Hair">> The actor and character connected isn't bad. But we all know that his hair is the real star of the show. Perhaps one day I can be so amazing. Edit: Another image, because you can never have too many. <<imageSlider "http://ooktech.com/jed/externalbrain/images/Egyptologist Hair.png" "More Hair">>
People are working on making a social network type thing using TiddlyWiki. This is a crude start to how connecting to people on that hypothetical network may work. Each person/page would have a <<NamePlate>> that contained information about where their wiki is located and whatever is needed to pull information from that wiki. It would probably also contain other small bits of biographical or contact information about the person similar to a social networks profile. This idea is being promoted by [[Rich Shumaker]] and is best articulated at his site [[<Name Plate>@TiddlyWiki Hangouts|http://www.richshumaker.com/tw5/TiddlyWiki-Hangouts.html#%3CName%20Plate%3E]] This idea is pretty new and needs to be fleshed out a lot, so input is appreciated. The best place to give this input would be on the [[google group page|https://groups.google.com/forum/#!forum/tiddlywiki]]. Note that due to html syntax if you just put the text `<Name Plate>` in a tiddler it wouldn't show up as anything, so I made a macro called [[NamePlate|<Name Plate> Macro]] that will display <<NamePlate>> anywhere you put `<<NamePlate>>`. Because a single person could have multiple sites they could have site <<NamePlate>>s tagged with their name. These site nameplates would probably be the part that contains the information for pulling information form the site. People: <$list filter='[tag[people]]'> </$list>
<a class="twitter-timeline" href="https://twitter.com/MaybeJed/lists/people-who-tweet" data-widget-id="574996544404873216">Tweets from https://twitter.com/MaybeJed/lists/people-who-tweet</a>
Probably as much as everyone else I follow combined. <a class="twitter-timeline" href="https://twitter.com/MaybeJed/lists/people-who-tweet-a-lot" data-widget-id="574997054461636608">Tweets from https://twitter.com/MaybeJed/lists/people-who-tweet-a-lot</a>
An hour ago I felt like I was dying, now I feel great. Was that actually just ibuprofen?
I should find a way to get permalinks from posts and stuff inside the dashboard interface.
*1 1/2 cup water - determines flour to use per crust (use tepid water) *add 1 package yeat and a couple table spoons flour (rapid rise yeast works well) *add a few table spoons crushed garlic (if you want) *a table spoon of salt *add flour till you can kneed it, kneed it till it is not sticky *about a quarter cup of olive oil *nice warm place to let it rise *brush the top with olive oil, cloth over bowl *punch it down, roll it out or toss it *greese or oil the pan before the crust goes on the pan *brush the top of crust with oil before the sauce *hormel is bad pepperoni - dont use it *cheese - put a little shredded cheese before the other stuff *bake at 450 for 12 minutes - 13 minutes for really dark (you need to watch it) *take it out and let it sit while the second pizza is cooking and when it is done te first one is ready to eat *crust less than half inch thick when rolling it out *need a bit more than a quart sized jar of sauce for this
@tiddlywiki I can post to twitter from my wiki. Facebook may be a bit harder.
\define thisDisplayPreview() {{$(ThisTiddler)$||$(ThisTemplate)$}} \end <$set name=ThisTiddler value='$:/temp/NewBlogPost'> <$set name=ThisTemplate value={{$:/templates/blog/BasicBlogPostTemplate!!template}}> <<thisDisplayPreview>> </$set> </$set>
Do you like what I do with ~TiddlyWiki and want to [[donate to the 'help jed eat and pay rent fund'|Donate]]?
After doing enough work that I could reasonably say that I had accomplished something today I decided that instead of working on one of the many coding projects I have been working on I would draw instead. I haven't drawn in pen for a while so I did a few 5 minute drawings to see how horrible I have become. It turns out not nearly as bad as I expected, out of 3 attempts I have two that are reasonable. The third one is a duck, and everyone knows that ducks are assholes. That and it was a horrible choice for a quick line drawing, I am not sure what I was thinking. So I didn't post the duck. Jerk. I drew a kookaburra and a klipspringer from pictures I took at the zoo here a while ago. They aren't particularly good, but better than I expected considering I haven't drawn with a fountain pen in well over a year. Also I didn't feel like setting up the scanner so you get pictures I took with my camera so there are some annoying shadows. <<imageSlider [[Kookaburra - pen - Image]] "A kookaburra. It should have a bigger beak.">> <<imageSlider [[Klipspringer - pen - Image]] "A klipspringer is a tiny antelope from Africa.">>
The rain yesterday cleaned pollen out of the air. Now I can breathe. I am so very happy.
\define thisCSS() html body.tc-body { background: url("$(URL)$") no-repeat center center fixed; background-size: cover; height: 100%;} \end <$set name=URL value={{$:/state/Random Background}}> <<thisCSS>> </$set>
John Scalzi decided to pass time between Christmas and new years by insulting people on twitter. Click below to get a new insult. You can see his post about it [[here|http://whatever.scalzi.com/2015/12/30/insulting-things-i-called-people-on-twitter-today-a-collection/]]. <$set name=CurrentInsult value={{$:/state/Random Insult!!text}}> <$list filter='[[Scalzi Insult List]indexes[]nth{$:/state/Random Insult!!number}]'> <$button class='tc-btn-invisible' tooltip='Random Scalzi Insult'><<fa fa-star>> New Random Scalzi Insult <$action-storecount $filter='[[Scalzi Insult List]indexes[]]' $tiddler='$:/state/Random Insult' $field='total_num'/> <$action-randval $tiddler='$:/state/Random Insult' $field='number' $lower=1 $upper={{$:/state/Random Background!!total_num}} $step=1 $numrolls=1/> </$button> <<currentTiddler>> </$list> </$set> <$button>Click here if things stop working<$action-setfield $tiddler='$:/state/Random Insult' $field='number' $value=1/></$button>
I really need to get around to making a recipe book plugin *[[Pizza Recipe]] *[[Biscuits Recipe]]
Some code snippets so I don't have to remember this stuff. Adding an image link: ``` <a href="http://www.smbc-comics.com"> <img src="http://www.smbc-comics.com/comics/20150204.png" width=100px/> </a> ```
At the moment this mainly consists of test comments made on the blog. Anything offensive will also end up in here, probably with the content either removed or replaced with something about how much the poster loves kitties/puppies/baby goats. <$list filter='[tag[Comment]tag[Rejected]sort[sort_date]limit[10]]' template= BlogPostCommentTemplate> </$list> older rejected comments: <$list filter='[tag[Comment]tag[Rejected]sort[sort_date]butfirst[10]]'> </$list>
I removed the analytics stuff from my site. It didn't serve anything other than my ego anyway.
Filter that makes the list: <$edit-text tiddler='$:/temp/Reorder Lists' field='filter' class='tc-edit-texteditor'/> Order field name: <$edit-text tiddler='$:/temp/Reorder Lists' field='sort' class='tc-edit-texteditor'/> (use 'order' unless you have a reason to use something different.) <table> <tr><th>Name</th><th>Order</th></tr> <$list filter={{$:/temp/Reorder Lists!!filter}}> <tr><td><$link to=<<currentTiddler>>><$view field='title'/></$link></td><td><$edit-text tiddler=<<currentTiddler>> field={{$:/temp/Reorder Lists!!sort}}/></td></tr> </$list> </table>
I like the art. A world/civilization building game. It has a kind of slow pace and interesting play style. http://www.reusgame.com/
''Rich Shumaker'' [img[http://www.richshumaker.com/images/selfportrait1th.jpg]] <<linkimg RichShumakerNamePlate.png RichShumakerNamePlate.png "RichShumakerNamePlate" height="76">> """ {{Rich Shumaker.m4a}} --''Email''-- Rich Shu ma k er -At- G mail Dot Com - Crazy format to avoid the spiders of the web that spam-a-lot --''Phone''-- Call me and I will let you know if you are talking to me, #heheh. - It would be cool if we could encrypt this and give people the 'passcode' to decrypt it. --''~TiddlyWiki 5 Stuff on the Net''-- [[5 Steps to TW5|http://www.richshumaker.com/tw5/FiveStepsToTiddlyWiki5.htm]] - This is my attempt to get a TiddlyWiki NOOB up and running [[LegacyCd Virtual|http://www.contactjuggling.com/LegacyCd.html]] - Currently in Beta - Release date is set for 5-5-15 - 10 years after the original ~LegacyCd Release [[This Site - TiddlyWiki-Hangouts|http://www.richshumaker.com/tw5/TiddlyWiki-Hangouts.html]] --''~TiddlyWiki Classic on the Net''-- [[Dream Machine|http://dreammachine.tiddlyspot.com/]] - Currently working on updating this using TW5 --''Not Yet TW Sites''-- [[Rich Shumaker F(V)anity Site|http://www.RichShumaker.com]] [[Contact Juggling Dot Com|http://www.contactjuggling.com]] --''Social Site''-- [[Twitter|https://twitter.com/richshumaker]] [[YouTube|http://www.YouTube.com/richshumaker]] [[Google +|https://plus.google.com/102360582405563354873/posts]] --''Social Sites I don't use enough''-- Facebook Instagram --''Almost Archived Social Sites''-- ~MySpace Tribe ~LiveJournal Del.ic.ous Deviant Art Tumblr I am sure I have forgotten some for sure """ !!!__Tiddlers with Rich Shumaker Tags__ {{{ [tag[Rich Shumaker]] }}} ``` Below is the code for the above - I am trying to standardize this stuff so knowing what I did will help to make this more consistent for everyone --Start of Rich Shumaker [[<Name Plate>]]-- ''Rich Shumaker'' [img[http://www.richshumaker.com/images/selfportrait1th.jpg]] <<linkimg RichShumakerNamePlate.png RichShumakerNamePlate.png "RichShumakerNamePlate" height="76">> """ {{Rich Shumaker.m4a}} --''Email''-- Rich Shu ma k er -At- G mail Dot Com - Crazy format to avoid the spiders of the web that spam-a-lot --''Phone''-- Call me and I will let you know if you are talking to me, #heheh. - It would be cool if we could encrypt this and give people the 'passcode' to decrypt it. --''~TiddlyWiki 5 Stuff on the Net''-- [[5 Steps to TW5|http://www.richshumaker.com/tw5/FiveStepsToTiddlyWiki5.htm]] - This is my attempt to get a TiddlyWiki NOOB up and running [[LegacyCd Web|http://www.contactjuggling.com/LegacyCd.html]] - Currently in Beta - Release date is set for 5-5-15 - 10 years after the original ~LegacyCd Release [[This Site - TiddlyWiki-Hangouts|http://www.richshumaker.com/tw5/TiddlyWiki-Hangouts.html]] --''~TiddlyWiki Classic on the Net''-- [[Dream Machine|http://dreammachine.tiddlyspot.com/]] - Currently working on updating this using TW5 --''Not Yet TW Sites''-- [[Rich Shumaker F(V)anity Site|http://www.RichShumaker.com]] [[Contact Juggling Dot Com|http://www.contactjuggling.com]] --''Social Site''-- [[Twitter|https://twitter.com/richshumaker]] [[YouTube|http://www.YouTube.com/richshumaker]] [[Google +|https://plus.google.com/102360582405563354873/posts]] --''Social Sites I don't use enough''-- Facebook Instagram --''Almost Archived Social Sites''-- ~MySpace Tribe ~LiveJournal Del.ic.ous Deviant Art Tumblr I am sure I have forgotten some for sure """ !!!__Tiddlers with Rich Shumaker Tags__ {{{ [tag[Rich Shumaker]] }}} --End of Rich Shumaker [[<Name Plate>]]-- ''Note about the below, This is a useful feature to include in your [[<Name Plate>]] as it allows you to see all references to your name that have been tagged at the site that copies your [[<Name Plate>]]'' Need to create it so that every Tiddler Reference as well as Tags show in the list below so that you get all references to your name in the TW that has this. !!!Tiddlers with Rich Shumaker Tags {{{ [tag[Rich Shumaker]] }}}
A side scrolling platformer rogue-like. You die. A lot. And then you die some more. Lava worms almost always kill me. The longer you play, the harder it gets. It has a good multiplayer, if you have it and want to play let me know. http://riskofraingame.com/
Side scrolling puzzle platformer. You play as a chicken fighting fascist penguins. You have a jetpack and guns. So far it has been every bit as awesome as that sounds. http://www.rocketbirds.com
The first sketch of a tattoo idea. I may stay with the stylized version or I may use a more classical Greek style. Who knows. [img [RockSisyphusTattooIdea - Image]]
A small alteration to the original. It may look a bit cleaner this way. [img [RockSisyphusTattooIdea2 - Image]]
With the apple this time. The apple could use some work. [img [RockSisyphusTattooIdea3 - Image]]
Sidescrolling rogue-like (I seem to play a lot of those) with a fun art style and other stuff. I like it. http://www.roguelegacy.com/
UNWASHED SLOTH:true DORKTWIDDLERS:true CHUCKLESPLEEN:true PIEBALD KITTENSNORFFLER:true BEETLETOED JACKNEEDLE:true TWISTED SACKS OF BUTTERKNUCKLES:true CHRONIC FISHSPACKLER:true MUCUSOIDAL FERRET:true POSSOM-SPLAYED SOCKET-LICKER:true CHEESESNORTING RHODE ISLAND NICKELHOARDERS:true THE INSIDE OF CHEKOV’S GYM LOCKER:true BARRELSCRAPING CUTICLE FUNGUS:true PROCRASTINATING KEYBOARDFINGERER:true OXYGENHOARDING WASTE OF MARZIPAN:true PROTOZOAN NOODLESCRIBBLER:true OCTOPODEAN KNISHSTUFFER:true CRABFIDDLING BOOGER CATALOGUER:true TIREPOKING BARKSTRIPPER:true WANTON LAWN PUNCHER:true EIN KATZENZUNGE:true TIPTREE TIARA OVERFONDLER:true PICTUREFRAMING OYSTERPUSHER:true UPHOLSTERED BEERFOAMER:true JAGGED-EDGED WALL CLIPPER:true REVISIONIST MONKTRANSCRIBER:true COD-BATTERING CHIP SHOVER:true OVERQUALIFIED PIGEON RUFFLER:true CRAVEN INSULTMONGERS:true
\define thisSelectField() Field Content to replace: <$select field='selected_field'> <$set name=FieldSearch value={{$:/temp/changefield!!search_field}}> <$list filter='[fields[]regexp[(?i)$(FieldSearch)$]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$set> </$select> <$edit-text tiddler='$:/temp/changefield' field='search_field' class='tc-exit-textexitor' placeholder='Narrow Fields List'/> \end This lets you search for all tiddlers with a specific field and selectivly replace the content of the field. Or if the 'Replace With' field is empty just remove the field from the tiddler(s). <<thisSelectField>> Replace With: <$edit-text tiddler='$:/temp/changefield' field='replace_field' class='tc-edit-texteditor'/> <table> <tr><th>Tiddler</th><th>Field Content</th><th>Replace?</th></tr> <$list filter='[has{!!selected_field}]'> <tr> <$fieldmangler tiddler=<<currentTiddler>>> <td><$link to=<<currentTiddler>>><$view field='title'/></$link></td><td><$view field={{Search and Replace Fields!!selected_field}}/></td><td><$button>Replace Content<$action-setfield $field={{Search and Replace Fields!!selected_field}} $value={{$:/temp/changefield!!replace_field}}/></$button></td> </$fieldmangler> </tr> </$list> </table>
\define thisSelectTag() Tag to replace: <$select field='selected_tag'> <$set name=TagSearch value={{$:/temp/changetags!!search_tags}}> <$list filter='[tags[]regexp[(?i)$(TagSearch)$]sort[title]]'> <option value=<<currentTiddler>>><$view field='title'/></option> </$list> </$set> </$select> <$edit-text tiddler='$:/temp/changetags' field='search_tags' class='tc-exit-textexitor' placeholder='Narrow Tags List'/> \end This lets you search for all tiddlers with a specific tag and selectivly replace that tag with another one. Or if the 'Replace With' field is empty just remove the tag from the tiddler(s). <<thisSelectTag>> Replace With: <$edit-text tiddler='$:/temp/changetags' field='replace_tag' class='tc-edit-texteditor'/> <$list filter='[tag{!!selected_tag}]'> <$fieldmangler tiddler=<<currentTiddler>>> <$link to=<<currentTiddler>>><$view field='title'/></$link> <$button>Change Tag<$action-sendmessage $message='tm-add-tag' $param={{$:/temp/changetags!!replace_tag}}/><$action-sendmessage $message='tm-remove-tag' $param={{Search and Replace Tags!!selected_tag}}/></$button><br> </$fieldmangler> </$list>
yep. This looks like a good place to start: https://samhobbs.co.uk/raspberry-pi-email-server
For stuff about dynamic dns using dreamhost go here: http://wiki.dreamhost.com/Dynamic_DNS This is much simpler than any of that. This is simply a redirect, nothing profound or difficult. As always, it is mainly here so I can remember it. Log into your [[dreamhost panel|https://panel.dreamhost.com/]]. At the top there is a button that says `Add Hosting to a Domain/ Sub-Domain`, click it. Scroll down to the section labeled `Redirect`. In the top option (`Domain to redirect:`) put in a the domain that you have and want to redirect (or a subdomain, like bob.ooktech.com, subdomains are free if you have the domain). In the bottom option (`Redirect to URL:`) put in the domain for your dynamic dns service (like bob.ddns.com). Then click `Redirect this domain`. You could get confirmation that it is going to do the redirect. In the panel next to the (sub-)domain name there should be a little icon that says 'updating' or something similar. Once that goes away things should be ready. It may take a few hours. I have this set up for my GitLab server, I don't know if you can do things like `bob.ooktech.com:9090` to get to a specific port after the redirect instead of going to `bob.ddns.com:9090`, which does work. Here `bob.ddns.com` is the url for your dynamic dns stuff, `bob.ooktech.com` is the dreamhost sub-domain.
I am using [[no-ip.com|http://www.noip.com]] because I have used them before. These instructions are for their services, you can use whatever you want. There are many tutorials for how to do this around the net. First, go to https://www.noip.com, if you have an account than sign in, if you don't than make an account. Once you are signed in click on `my account`, it should be in the bar at the top of the page. Then pick `Add Host` from the menu (it is in the middle of the left side of the page. I am bad at finding things on web pages.) Under Hostname Information enter the name you want and pick the suffix from the list, unless you are paying only the free domains are available. After you have entered the name and picked a domain click on the `Add Host` button and you are done with this site for now. [[SSH into your Pi|Logging into your Raspberry Pi via SSH]] (or boot up your pi and open a terminal if you aren't running it headless). Type these commands in the Raspberry Pi terminal (from https://www.noip.com/support/knowledgebase/installing-the-linux-dynamic-update-client-on-ubuntu/) ``` cd /usr/local/src/ wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz tar xf noip-duc-linux.tar.gz cd noip-2.1.9-1/ make install ``` ''Note:'' It may not be `cd noip-2.1.9-1/` for you, to see what you should use type `ls` (see [[Some helpful commands]] for what that means) and one of the things listed should be `noip-x.x.x-x` where the x's are numbers, replace `noip-2.1.9-1` with whatever is listed in the line `cd noip-2.1.9-1/` above. If you have multiple hosts set up through noip.com than it will ask which one you want to use, otherwise it will pick the only one (the one you just made on their website.) Then in the terminal type (this configures the noip daemon): ``` sudo /usr/local/bin/noip2 -C ``` it will ask for your username and password again (this is your username and password for noip.com, not your root password for the pi) and the update interval. I set the update interval to 300 (that is 300 seconds, so 5 minutes.). This is how often the ip address is checked and updated. Then run ``` /usr/local/bin/noip2 ``` to start the service. At this point you are almost finished, all you need to do is set things up so that it starts automatically when your pi turns on. !!Starting the noip service when your pi boots: In the terminal type: ``` sudo nano /etc/init.d/rcX.d ``` then copy and paste this into the editor (to paste into the editor you need to use `ctrl+shift+v` instead of `ctrl+v`): ``` ####################################################### #! /bin/sh . /etc/rc.d/init.d/functions # uncomment/modify for your killproc case "$1" in start) echo "Starting noip2." /usr/local/bin/noip2 ;; stop) echo -n "Shutting down noip2." killproc -TERM /usr/local/bin/noip2 ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0 ####################################################### ``` then exit and save (press `ctrl+x` then enter when it asks for where you want to save it) and you should be done.
!!Installing node (copied from [[here|https://learn.adafruit.com/node-embedded-development/installing-node-dot-js]]) Type the following commands (remember you can copy and past into the command line using `ctrl+c` to copy and `ctrl+shift+v` to paste): ``` curl -sLS https://apt.adafruit.com/add | sudo bash sudo apt-get install node ``` This may take a few minutes. You can check if it worked by checking the version number: ``` node -v ``` which should say something like `v0.12.0` (the numbers may be different). !!Installing TiddlyWiki (copied from [[here|http://tiddlywiki.com/#GettingStarted%20-%20Node.js]] After installing node, type: ``` sudo npm install -g tiddlywiki ``` This will once again take a few minutes. You can check to make sure it worked by typing: ``` tiddlywiki --version ``` You should get something like `5.1.8` as the result, this may take a while, it took over a minute on my Raspberry Pi 2 with the ~GitLab and syncthing daemons running. Once that is done create a new wiki by typing: ``` tiddlywiki <wikiname> --init server ``` where you replace `<wikiname>` with the name of the wiki you want to create (this is different from the wiki title or subtitle, this determines the location where the wiki is stored). It will create a wiki called `<wikiname>` in `~/<wikiname>`. If that doesn't mean anything to you don't worry, it won't have any effect on what you do. To start serving the wiki type: ``` tiddlywiki <wikiname> --server 9090 $:/core/save/all text/plain text/html "" "" 0.0.0.0 ``` where you once again replace `<wikiname>` with the name of the wiki (the same one you used for the `tiddlywiki <wikiname> --init server` command). This will once again take a minute. Nothing visible will happen for a bit then it will say `Serving on 0.0.0.0:9090` and after that you will see various other things as you use your wiki. The important part is `(press ctrl-C to exit)`, which means that if you want to stop the server when you are finished you should press `ctrl+c` on the command line and it will stop the server. If you look at the image below you can see what happens in a terminal when trying to serve on a port that is in use (in this case port 8080) and a successful start below that. <<imageSlider [[Starting TiddlyWiki on a Raspberry Pi - Image]] "An example terminal starting a TiddyWiki server">> Now, to use the tiddlywiki the Raspberry Pi is serving, open a browser and type the ip address of the pi followed by `:9090` in the address bar, so for mine I type in `192.168.0.36:9090`. This should bring up your wiki. !!Some notes: What each part of the command means: |tiddlywiki |The command that you are using, you can't change this | |`<wikiname>` |The name of the wiki that you are running the server for, you can have multiple wikis. | |--server |The part that tells it that you want to start the server, you can't change this part. | |`9090` |The port that it is served on, you can change this to some other values, not all will work. This is 9090 instead of the default 8080 because syncthing also defaults to using 8080 for its web interface and if you have both than trying to start the tiddlywiki server on 8080 will give you an error. You can change where syncthing has it's web interface, but it is easier to change here. | |`$:/core/save/all` |The tiddler to serve at the root | |`text/plain` | | |`text/html` | | |the first `""` | | |the second `""` | | |`0.0.0.0` |The ip address used. If you don't have this the wiki is only accessible through `127.0.0.1` on the machine running the server (in this case the pi, which you aren't on.). Setting this to `0.0.0.0` lets any ip address access it. |
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
\define tv-wikilink-template() #$uri_encoded$ \define tv-config-toolbar-icons() no \define tv-config-toolbar-text() no \define tv-config-toolbar-class() tc-btn-invisible <textarea rows="20" style='width:100%'> <$view field=top/> <$set name="exportFilter" value="[!is[system]!tag[static]!title[Table of Contents]!sort[modifed]]"> {{RenderSitemap}}</$set> <$view field=bottom/> </textarea>
<a href={{!!url}} target='_blank'><$view field='caption'/></a> - <$view field='description'/><br>
\define thisDisplayWithTemplate() {{$(TiddlerToDisplay)$||$(TemplateToUse)$}} \end !Recent Small Things: --- <$list filter='[tag[Small Thing]!nsort[time]limit{$:/settings/Blog Settings!!num_recent_posts}]'> <$set name=TiddlerToDisplay value=<<currentTiddler>>> <$set name=TemplateToUse value={{!!template}}> <<thisDisplayWithTemplate>> </$set> </$set> </$list> <h2>Older Things:</h2> --- Year: <$select tiddler='$:/state/My Blog/Small Things/Older Posts' field=year> <option>All</option> <$list filter='[tag[My Blog]tag[Small Thing]has[year]each[year]get[year]nsort[year]]'> <option><<currentTiddler>></option> </$list> </$select> Month: <$select tiddler='$:/state/My Blog/Small Things/Older Posts' field=month> <option>All</option> <$list filter='[tag[My Blog]tag[Small Thing]has[month]each[month]get[month]nsort[month]]'> <option><<currentTiddler>></option> </$list> </$select> <$reveal type=match state='$:/state/My Blog/Small Things/Older Posts!!year' text='All'> <$list filter='[tag[My Blog]tag[Small Thing]has[year]each[year]get[year]nsort[year]]' variable=CurrentYear> ''__<<CurrentYear>>__''<br> <$reveal type=match state='$:/state/My Blog/Small Things/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Small Thing]has[month]each[month]get[month]nsort[month]]' variable=CurrentMonth> __<<CurrentMonth>>__<br> <$list filter='[tag[My Blog]tag[Small Thing]!tag[Templates]month<CurrentMonth>!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Small Things/Older Posts!!month' text='All'> __{{$:/state/My Blog/Small Things/Older Posts!!month}}__<br> <$list filter='[tag[My Blog]tag[Small Thing]!tag[Templates]month{$:/state/My Blog/Small Things/Older Posts!!month}!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$reveal> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Small Things/Older Posts!!year' text='All'> ''__{{$:/state/My Blog/Small Things/Older Posts!!year}}__''<br> <$reveal type=match state='$:/state/My Blog/Small Things/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Small Thing]has[month]each[month]get[month]nsort[month]]' variable=CurrentMonth> __<<CurrentMonth>>__<br> <$list filter='[tag[My Blog]tag[Small Thing]!tag[Templates]month<CurrentMonth>!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$list> </$reveal> <$reveal type=nomatch state='$:/state/My Blog/Small Things/Older Posts!!month' text='All'> <$list filter='[tag[My Blog]tag[Small Thing]!tag[Templates]month{$:/state/My Blog/Small Things/Older Posts!!month}!nsort[time]]-[[$:/templates/blog/BasicBlogPostTemplate]]'> <$view field='posted'/>: <$link to=<<currentTiddler>>><$view field='title'/> - <$view field='summary'/></$link><br> </$list> </$reveal> </$reveal>
I think this means that the city will be shut down for the next few weeks. <<imageSlider [[There is not supposed to be snow in albuquerque - Image]] "You can see Javerts footprints">>
I always forget what snow does to light in a city. It was almost 10pm when I took this picture. [img [Snow at night - Image]]
I forgot what a city looks like at night when it is snowing. Well, a city like Albuquerue or Terre Haute anyway. New York just looked a bit soggy when it was snowing there. I just took Javert for a walk, the sun has been down for over an hour and you can see everything clearly outside. It is about as bright as a overcast day. The weird part is that unless you are standing next to an artificial light there are no shadows. Also since it is Albuquerque and people are frightened by this white stuff falling out of the sky no one is around. Javert really likes the snow and wanted to run the entire time. Unfortunately the snow was a bit slippery and I couldn't run with her, so she spent the entire walk waiting for me to catch up with her and then sprinting to the end of her leash before waiting for me again. And it is still snowing, we already have a lot of snow by the standards of this city, we may get a reasonable amount of snow by the standards of places that actually get snow. If it does snow a lot I may skip my cello lesson. I am terrible at driving and everyone else will be freaking out because of the snow. It doesn't sound like it would be a good combination. We shall see.
What is this stuff falling from the sky?!?? [img [Snow in Albuquerque - Image]]
Seeing snow fall is strange enough for me to take a picture. The flash is on to make the falling snow show up so it looks much darker outside than it is. <<imageSlider [[Snow in Albuquerque - Image]] "What is this white stuff falling from the sky?">>
Wonderella has some words of wisdom: http://nonadventures.com/2015/06/20/the-some-of-all-fears/
A drawing from my sketch book. [img [Some Dude - Image]]
The colors used by your terminal may be different than shown in the example images here. Click on the <<fa fa-plus>> to show the example images. *`exit` - ends the ssh session (disconnects from the pi) *`df` - shows you how much space is available on your sd card <<imageSlider [[Output of df command on a Raspberry Pi - image]] "example output of `df` command">> *`top` - show memory usage <<imageSlider [[Output of top command on Raspberry Pi - image]] "example output of `top` command">> *`nano` - default command line text editor. The commands are listed at the bottom, note that `^X` means `ctrl+x`, you will be asked if you want to save when you exit. <<imageSlider [[Default view of Nano on Raspberry Pi - image]] "the default view of nano with an empty buffer">> *`ls` - lists the contents of the current directory (folder) <<imageSlider [[Output of ls command on Raspberry Pi - image]] "Example output of the `ls` command">> *`cd` - change directory *`mkdir` - make directory
I am never going to be able to pull off wearing a hat as well as she does. <a href="http://vintageblackglamour.tumblr.com/post/13736763220/carolathhabsburg-beauty-in-riding-habits-late" target=blank><$image tooltip='Seriously, I never will.' source='http://41.media.tumblr.com/tumblr_lsahtt5SrI1qzjmo0o1_1280.jpg'/></a> There is no part of this picture that I don't like. <a href='http://www.archives.gov.on.ca/en/explore/online/alvin_mccurdy/big/big_54_unidentified_woman02.aspx' target=blank><$image source='http://www.archives.gov.on.ca/en/explore/online/alvin_mccurdy/pics/24789_520.jpg'/></a>
A pencil drawing that I did and later digitally colored using GIMP. The [[House]] shows up again here. [img [Sometimes I call the hole in my house a window - Image]]
Sophie would like everyone to know that she is completely ready if you feel the need to let a dog outside.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
Fun, kinda short. I am having a lot of trouble with the final boss. http://steamworldgames.com/
This is a random collection of little things that I find interesting. There probably won't be anything too heavy here. *[[Nettie Stevens]] - She was involved in, and mostly responsible for, the discovery of the significance of the x and y chromosomes. One of the many non-Marie Curie scientists at a time when being a woman in academia presented even more trouble than it does now. *[[Women Feigning Interest in Western Art History]] - Some great examples of women obviously uninterested in presumably romantic advances show in art. The captions are awesome. *[[Some Victorian Women’s Fashion]] - Why am I so interested in Victorian fashion? I am going to blame [[Gail Carriger|http://gailcarriger.com/]] for this one.
Here is a list of things I am hoping to do with my various projects. If you are looking for TiddlyWiki specific things go [[here|http://inmysocks.tiddlyspot.com/#Change%20Log]]. <<CategoryList Tag:"Task" FinishedTag:"Done" ListType:"Task" ShowAddItem:"True" ShowSearch:"True" ShowFinished:"True">>
This direct memory access stuff is giving me more trouble than I expected. Stupid microcontrollers.
Don't give into peer pressure and try migraines no matter cool they seem. I am going to lay down now.
I didn't want to move away from Albuquerque, then I found a black widow in my shower.
Run. All the time, go as fast as you can. You will die. And die. Also, meat. A very strange game. http://www.supermeatboy.com/
I haven't decided if I am going to allow myself to use too much profanity here, otherwise there would be a lot more of it in the title. The news in the US has been depressing enough that I haven't spent much time following other places. Let's consider the news story [[Pentagon Considers Turning Cell Phones Into Walkie-Talkies During Emergencies|http://www.nationaljournal.com/defense/pentagon-terrorism-threat-cellphones-walkie-talkies-20150508]]. With that headline it doesn't seem like it would be a problem at all. It sounds neat. In fact it could be a wonderful idea that allows communication during emergency situations when existing infrastructure isn't up to the task. Which in theory is all true. And if the first two words were missing I would be excited about it. That is exactly the sort of thing I am studying and trying to create. An emergency broadcast system is great. The government sends you a text saying that something has happened, and then uses your phone to transmit the message on to other phones within range. But in order to do this, the Pentagon has to have control over your phone. To use cell phones as an effective emergency broadcast system the government has to prevent you from using your phone for other purposes. The stated use for this would apply to a very narrow range of situations and be beneficial to everyone involved. But, as we have learned from the NSA (and the TSA, and the CIA, and the FBI, and the....) an organization that has access to a system that can gather large amounts of data on people will use that system, often in illegal ways. At its simplest, this system would involve some mechanism by which the government could send a command to your phone over something other than the cell network, removing even that tiny bit of a check (not that getting the cooperation of the providers actually means anything, but it would at least be an extra step), this message would cause your phone to deliver some message to you, and then make the phone send on the same command and message to any other phones in range. If it stopped there than it wouldn't be too terrible a thing. But for safety reasons, such as times when evacuation is required, it would be completely reasonable to also make the phone send a message back to wherever the message originated with information like your location. That may not be too terrible in disaster situations, anonymous tracking information on practically every person in the US could save many lives. But then this system would unavoidably have security flaws, and as these flaws are found updates would need to be pushed out to fix them. In a mesh network any node can access the network, and in order for the network to reach everyone all of the nodes along the way have to work. Opting out of these updates would cause the network to become disconnected which would compromise security in a disaster situation, so you can't opt out. All of this means that, for the basic network functions, some government agency would have to have the ability to, without your consent (possibly without your knowledge), control and modify your phone to force it to send and receive information you have no control over. Even without explicitly adding anything to allow for monitoring through the cell phones they have the ability to take full control of your phone for whatever they want. As has been demonstrated by various parts of the US government, this type of ability will be abused. In the name of national security of course. Just like the TSA exists for safety, not solely for the purpose of finding excuses for the TSA to continue existing. Now, one thing that makes me so angry about this is that the same sort of technology, that is distributed mesh networks, could be used to prevent this sort of surveillance from being possible. At the most secure end of things you would have the equivalent of the TOR network using mobile phones as nodes. In a more generally useful situation you would just have a distributed mesh network where phones or wifi access points or whatever is available is used as a relay in a network that doesn't require controllers past the users in the network. In this situation there is no way for a central authority (or anyone really) to perform any sort of mass surveillance without controlling a large portion of the nodes in the network. So if someone wanted to take down the network they would have to take down every node. Using this same technology the government is planning on making something that does precisely the opposite. They could just remotely disable your phone for one of their updates. I think that the solution to this is to get there first and design and start implementing a distributed mesh network independent of them. It would have to be made so that it could work with existing networks, but not so that it relies on them. The technology for this exists, and with some of the newer hardware available it could probably be done relatively cheaply. If there is a demand than the cost would drop quickly. We can have a network that is secure and not subject to any central authority. My biggest fear about it is that it will require just a little more effort or knowledge than the alternatives so no one will use it and we will all be carrying around the telescreens in our pockets instead of having them stuck in our living rooms. I find it hard to feel like I am being alarmist or pessimistic when the NSA is explicitly trying to do this. The government stated that they want total information awareness, it shouldn't be surprising that they are taking steps to achieve that goal.
``` #!/bin/sh ### BEGIN INIT INFO # Provides: syncthing # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Should-Start: $network # Should-Stop: $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Multi-user daemonized version of syncthing. # Description: Starts the syncthing daemon for all registered users. ### END INIT INFO # Replace with users you want to run syncthing clients for # syncthing_USERS="<your name here>" syncthing_USERS="pi" DAEMON=/usr/local/bin/syncthing startd() { for stuser in $syncthing_USERS; do HOMEDIR=$(getent passwd $stuser | awk -F: '{print $6}') if [ -f $config ]; then echo "Starting syncthing for $stuser" start-stop-daemon -b -o -c $stuser -S -u $stuser -x $DAEMON else echo "Couldn't start syncthing for $stuser (no $config found)" fi done } stopd() { for stuser in $syncthing_USERS; do dbpid=$(pgrep -fu $stuser $DAEMON) if [ ! -z "$dbpid" ]; then echo "Stopping syncthing for $stuser" start-stop-daemon -o -c $stuser -K -u $stuser -x $DAEMON fi done } status() { for stuser in $syncthing_USERS; do dbpid=$(pgrep -fu $stuser $DAEMON) if [ -z "$dbpid" ]; then echo "syncthing for USER $stuser: not running." else echo "syncthing for USER $stuser: running (pid $dbpid)" fi done } case "$1" in start) startd ;; stop) stopd ;; restart|reload|force-reload) stopd && startd ;; status) status ;; *) echo "Usage: /etc/init.d/syncthing {start|stop|reload|force-reload|restart|status}" exit 1 ;; esac exit 0 ```
<a class="twitter-timeline" href="https://twitter.com/MaybeJed/lists/tech-people" data-widget-id="597440819356794880">Tech People</a>
\define thisDayMacro(day) <div style='height:100%;width:100%;overflow:hidden;'> <$set name=ThisDay value=$day$> <$reveal type='match' state='$:/state/Today!!day' text=$day$> <<thisTodayMacro>> </$reveal> <$reveal type='nomatch' state='$:/state/Today!!day' text=$day$> <<thisOtherDayMacro>> </$reveal> </$set> </div> \end \define thisTodayMacro() <div style='width:100%;height:100%;background-color:red;'> <<thisOtherDayMacro>> </div> \end \define thisOtherDayMacro() $(ThisDay)$<br> <$list filter='[tag[My Blog]day[$(ThisDay)$]]'> </$list> \end <$set name=Today value={{$:/state/Today!!day}}> <$calendar-month year=2015 month=March day_macro='thisDayMacro'/> </$set>
/*\ title: TestMacro.js type: application/javascript module-type: macro \*/ (function(){ exports.name = "TestMacro"; exports.params = [ { name: "postname" } ]; exports.run = function(postname) { $.getScript('http://ooktech.com/hashover.php',function()){}; }; })();
I now have my computer partially set up. I forgot that I would need new power cables.
I didn't think that they were broken before, but they only had one month to work with and I wasn't sure that it would automatically generate months correctly.
There are bones from over 6 million people there. I just can't wrap my head around that. [img [The Catacombs - Image]]
Grumpy chameleon babies! <a href="http://www.zooborns.com/zooborns/2015/03/a-wee-bit-o-green-for-st-patricks-day.html"> [img width=500px tooltip="""The chameleon wants these damn kids off its lawn.""" [http://www.zooborns.com/.a/6a010535647bf3970b01b7c764f3bd970b-800wi]] </a>
I should be able to make every visible part of the comment system use native tiddlywiki things and just have hashover take care of the backend. This would give people control over things like how to take the input and what things to ask for. Depending on how much is required I may be able to just write something new to use instead of hashover since I have some idea of how things work now. TiddlyWiki does give a very good way to set up the frontend so it may work out well. And if I make something new I can have the comments stored in json to play with tiddlywiki better. Remaking the backend is probably a bit too ambitious a goal for the moment. I will worry about all of that later. For now I have comments and some comment moderation and stuff. Yay! I still need to write usable instructions for how to put this stuff into someone else's wiki. In the meantime if anyone wants to use this and needs help let me know. I can use that to figure out what needs to go into writing more general instructions. And now you can use the comments to leave messages! I am still very excited about this. I should update the leave a message thing to use this as well instead of the google form.
This is really cool! Keep it up :)
It wouldn't be a trip to Paris if I didn't get this shot. [img [The Eiffel Tower - Image]]
I just stepped out onto the street to thunderous applause. There was also a dog with French facepaint
No it isn't, that was yesterday but I forget who won.
Twitter tells me it isn't talking to facebook now. Le sigh.
You can't handle the Ruth! http://www.nydailynews.com/news/politics/ruth-bader-ginsburg-funny-t-shirt-brooklyn-court-article-1.2151495
It looks like the required work for making the plugin directory for TiddlyWiki 5 is nearing completion. Due to reasons, I am going to continue to maintain the list on [[my site|http://inmysocks.tiddlyspot.com]], but it will also be listed on the [[community search|https://rawgit.com/erwanm/tw-aggregator/master/tw-community-search.html]] because that is where people are going to look for this sort of thing. If this works than I am going to see about getting people to help make a listing of non-reference community wikis that don't have any reason to have their tiddlers indexed (like this one) but would show off what is being done. Something to demonstrate what they can be used for so we can get more users.
I'm an electrical engineer, why do I get emails from the Protein Society asking me to submit papers?
Felicity watched QE2s speech, I watched queen of Irelands speech. https://youtu.be/4vH6vEndT1A
I plugged the board into my new monitor and while the LEDs indicate that it is booting correctly the monitor isn't displaying anything. There seem to be two options, first I may have fried the HDMI out when everything shorted last time, or there is some setting in the OS that is causing problems. The internet only has information about the second one so I am hopeful. But of course I can't find any of my microsd card readers so I can't check that. Since it is possible to run a raspberry pi headless I will probably make it into a [[syncthing|http://syncthing.net/]] server if the hdmi out is actually fried. I don't think that this raspberry pi is good for my mental health. And if it is broken that means I need to get another one to actually do the development stuff I wanted to do on it. Although I may be able to get other people to subsidise that, which would be awesome. Eventually OokTech will be a real thing.
The standing desk is nice but my feet hurt. I didn't anticipate this problem.
Interesting approach to gathering comments. And, I'd like to see a picture of your standing desk! I'm working on one that allows me to either sit or stand and easily adjust during the day....
It is a rough thing my brother made for working on electronics a while ago. Unfortunately it isn't adjustable at all. I will put up a photo of it whenever I figure out where my camera went.
I can actually breathe today. The trees must be luring me into a false sense of security.
Being able to compare the size of a single country with an entire continent is weird. The US is only a little smaller than Europe, and has less than half the population. When me and Felicity drove from Massena to Albuquerque we drove farther than the distance between Paris and Moscow. And we drove slightly more than half way across the country. This may be part of why a lot of the people in the US seem to think of Europe as a single country. Also it may be hard to get used to living in Paris. New Mexico is about a quarter of the size of France, and has about the same number of people as the city of Paris. If the internet is to be believed, Albuquerque has an areas of about 190mi^^2^^, and Paris has an area of about 40mi^^2^^. Albuquerque has about half a million people, Paris has a bit over 2 million. This is going to take a bit of getting used to. Just some random thoughts as I get ready to move.
and the something says
what about now?
To allow post titles to have ' in the title, it is temporarily replaced with APOSTROPHEPLACEHOLDER because for some reason the normal options of %27 and " didn't work. I am not proud of this. But I do find it rather funny.
I don't know if anyone will actually understand what is going on in this picture. It isn't particularly clear. [img [The view from my telescope - Image]]
Tea and cake. This must be some conspiracy by the British. Click on the image and go read Girl Genius. <a href="http://www.girlgeniusonline.com/comic.php?date=20150422#.VTfHY_DQgmE"> [img width=700 tooltip="""Tea and Cake!""" [http://www.girlgeniusonline.com/ggmain/strips/ggmain20150422.jpg]] </a>
Seriously, what's up with that? [img [There is not supposed to be snow in albuquerque - Image]]
I can see the messages Felicity sends me. It doesn't look like she can see mine. Tragic.
Look, a puppy: [img [http://wp.production.patheos.com/blogs/wwjtd/files/2015/03/trust.gif]] <<textSlider "Lots of news stuff" """ Recently in oblivious American politics, [[a state senator says that mandatory church attendance on Sundays would make any sort of gun laws unnecessary|http://freethoughtblogs.com/dispatches/2015/03/27/arizona-senator-suggests-mandatory-church-attendance/]]. She claims 'any church of your choosing', so I guess that only religions that have regular worship services on Sundays actually count, because apparently freedom of religion really only means freedom to pick between different Christian sects. Or something. Yay theocracy? In related news, Indiana has decided that discrimination is ok, as long as you are doing it because religion. [[Many people don't like this|http://www.bbc.com/news/world-us-canada-32094331]]. [[Arkansas doesn't want to fall behind in bigotry|http://www.arktimes.com/ArkansasBlog/archives/2015/03/27/religious-freedom-bill-passes-senate]]. The good news is that GenCon is probably going to leave Indiana, Yelp has decided that it will pull out of Indiana as much as possible, the city of San Fransisco has banned any non-critical business travel to Indiana for city employes (I doubt that city employees from San Fransisco go to Indiana on official business much). And [[George Takei is calling for a boycott of Indiana|https://twitter.com/GeorgeTakei/status/581141254026608640]]. Remember kids, [[it's ok to be Takei!|https://www.youtube.com/watch?v=dRkIWB3HIEs]]. A representative of Sweden had planned to say some rather bland things about human rights when Saudi Arabia threw a temper tantrum and decided that saying 'women are people too' was meddling in internal affairs and that [['[t]he Kingdom is proud of its Islamic laws, which protects human rights, dignity and private property'|http://www.arabnews.com/saudi-arabia/news/721226]], so it must be true. Also, [[Shariah has guaranteed human rights and preserved people’s lives, possessions, honor and dignity|http://english.alarabiya.net/en/News/middle-east/2015/03/18/Arab-foreign-minister-denounce-Swedish-FM-s-statements-against-Saudi-Arabia.html]], as long as you are not gay, a woman, a cartoonist, a blogger or an apostate. I guess they don't count as humans? Anyway, now Saudi Arabia has cut off most diplomatic ties with Sweden and is trying to put pressure on the rest of the world to make them apologize or something. [[Here is the speech that offended Saudi Arabia so much|http://www.regeringen.se/sb/d/19230/a/255437]]. It wasn't actually given, Saudi Arabia wouldn't let that happen. So all of this is because of a speech that wasn't given and that doesn't mention Saudi Arabia. From what I have heard this is the part that led to complaints: <<< Human rights are a priority in Swedish foreign policy. Freedom of association, assembly, religion and expression are not only fundamental rights and important tools in the creation of vibrant societies. They are indispensable in the fight against extremism and radicalisation. So is a vibrant civil society. Yesterday was International Women's Day. This is a day to celebrate women's achievements, recognise challenges, and focus attention on women's rights, women's representation and their adequate resources. Our experience is that women's rights do not only benefit women, but society as a whole. More than 20 years ago, in 1994, the International Conference on Population and Development met here in Cairo to discuss various issues, including education of women and protection of women from all forms of violence, including female genital mutilation and sexual harassment. Many of these issues are still very much in play today and I urge you to contribute to upholding the agreements made here in Cairo 20 years ago. <<< And so far the rest of Europe and North America hasn't said anything. In nicer news, [[a city thought to be used as a headquarters for Boko Haram was retaken in Nigeria|http://www.bbc.com/news/world-africa-32087211]]. Hopefully things will go well in that fight. And back to the 'what the fuck USA' news, [[the US has given a permit to someone allowing him to import a black rhino if he kills one|http://www.bbc.com/news/world-us-canada-32089948]]. The hunter is, of course, from Texas. As I have said before, [[Google isn't really living up to its 'do no evil' motto|http://www.bbc.com/news/technology-32083188]]. It tried, and failed, to get out of any consequences for illegally circumventing browser preferences for the purposes of advertising. Some [[other countries are actually persecuting people involved in torture|http://www.bbc.com/news/world-africa-32051711]], unlike the [[US harboring|http://www.nytimes.com/2014/12/11/us/politics/americans-involved-in-torture-can-be-prosecuted-abroad-analysts-say.html]] [[war criminals|http://ccrjustice.org/case-against-rumsfeld]]. Oh, and [[ebola is still a problem|http://www.bbc.com/news/world-africa-32083363]], there has just been almost no reporting on it in the US, the Catholic church is [[being the Catholic church|http://www.bbc.com/news/world-latin-america-32004240]] and [[Antarctic ice is still melting|http://www.bbc.com/news/science-environment-31965454]]. """>> On a slightly nicer note, [[social change through comics in India|http://www.bbc.com/news/world-asia-india-30288173]]. One of these days I will probably rant about the perception of comics as all being represented by mid-90s wildcats or 1980s x-men.
I am trying to actually get some work done on the various electronics projects I have, and I can't get the teensy-lc to work. The arduino ide keeps saying that I need to press the button to turn on the boot loader, but pressing the button hasn't worked. Everything else on the computer claims that it is set up with the bootloader. I am annoyed. I guess back to audio stuff. Eventually I will get this working again. I should find some people to work with here in Paris. There should be hacker spaces around somewhere, hopefully with people who speak English. My French isn't anywhere near good enough to talk about electronics.
Indiegogo for a show by Alan Tudyk and Nathan Fillion, you don't need more http://igg.me/at/conman/x
A Siberian Husky wearing earmuffs. What else can I say? http://vk.com/id153817456?z=photo153817456_355403108%2Falbum153817456_00%2Frev
Did this get posted to Facebook?
I was told, in an academic context and with a straight face, that I should treat someone approaching me to collaborate on research as a threat to national security. This is the most depressing thing that happened to me in a long time. What happened to an open exchange of ideas? Wasn't that what I was supposed to be getting by doing academic research? Unfortunately I imagine that other countries aren't any better. Now I need to get back to my dissertation so I can leave academia and contribute to the horrible state of higher education in this country.
Eventually people will actually see our engagement photos. Me and Felicity are in the background. <$image width=100% source='./images/IMG_1410.jpg'/>
Gratulations. Romance and Paris my memory went back 50 years.....oh. sweet memory...and also an old favorit of mine <a href="https://www.youtube.com/watch?v=HjhU-1menXQ." target="_blank">https://www.youtube.com/watch?v=HjhU-1menXQ.</a> <br><br>May you be very happy!<br>Birthe
Oh my yes, [[this|http://freethoughtblogs.com/pharyngula/2015/03/06/i-did-not-know-this-was-a-thing/]]. Felicity may kill me.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
<h1>Tiddler Gallery Settings</h1> Gallery Tag: <$select tiddler='Tiddler Gallery Settings' field='gallery_tag'> <$list filter='[!is[system]tags[]]'> <option><$view field='title'/></option> </$list> </$select> Gallery Sort: <$select tiddler='Tiddler Gallery Settings' field='gallery_sort'> <option value=title>Title</option> <option value=modified>Modified</option> </$select>
| Set Tiddler Width | What looks good |h |<$radio tiddler='$:/settings/apperance/TiddlerWidthSettings' field='width_option' value='seventh'> Full Width</$radio>| | |<$radio tiddler='$:/settings/apperance/TiddlerWidthSettings' field='width_option' value='sixth'> 1500px</$radio>| Looks good on a 24" monitor | |<$radio tiddler='$:/settings/apperance/TiddlerWidthSettings' field='width_option' value='fifth'> 1200px</$radio>| | |<$radio tiddler='$:/settings/apperance/TiddlerWidthSettings' field='width_option' value='fourth'> 1000px</$radio>| Looks good on a 17" monitor | |<$radio tiddler='$:/settings/apperance/TiddlerWidthSettings' field='width_option' value='third'> 900px</$radio>| Looks good on a 10" tablet | |<$radio tiddler='$:/settings/apperance/TiddlerWidthSettings' field='width_option' value='second'> 770px</$radio>| tiddlywiki.com default | |<$radio tiddler='$:/settings/apperance/TiddlerWidthSettings' field='width_option' value='first'> 700px</$radio>| |
https://github.com/felixhayashi/TW5-TiddlyMap
Between initializing variables and namespaces C++ is going to kill me. As a note for the future, starting a for loop with 'for (unsigned int a; a < LENGTH; a++)' isn't helpful. Also, 'using namespace arma' has to come BEFORE function prototypes that use Armadillo data types. I rant about matlab a lot so I will keep this brief. Code to do the same thing in matlab and in c++ using armadillo results in about 200 lines of code in matlab and about 40 in c++, it takes about 2 minutes to run in matlab and runs in about 0.005 seconds in c++. WHY DO PEOPLE INSIST ON USING MATLAB????? It isn't significantly easier, costs way too much and runs slow enough that even with the time to learn how to code you can do everything faster because of the performance boost. I don't think that this is an argument I will ever win. This bothers me. Stupid vendor lock.
The APOSTROPHIEPLACEHOLDER is because I couldn't get the php/javascript/wikitext combination to work using any of the other escape sequences. I am not proud of this.
Hello how is this implemented?
I have some rather poorly written instructions [[here|Adding comments sections to tiddlers on a tiddlywiki using hashover]]. You need to be able to access the server your wiki is hosted on and the server needs to support at least php version 5.3.3
I tried to get work done today, but after not noticing the time between around 9am and 1pm I realized that I was having a migraine. Then I spent the rest of the day laying down with Javert trying to lay on top of me. I suppose I am happy that it wasn't accompanied by the normal horrible pain and a loss of motor skills, but I am a bit concerned that I didn't notice what was going on for so long. This is the first migraine I have had in months. I was hoping to be productive today. I need to get this presentation finished.
Isometric hack and slash in the spirit of Diablo. The female characters actually get pants! http://www.torchlightgame.com/
Sequel to torchlight. A larger world, different classes. You can have a headcrab or a panda as pets. Or a badger. http://www.torchlight2game.com/
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
This is me testing to see if I can make this work, so if you can comment here it works. Edit: Only sort of, I may not be able to make separate comment threads for different posts. I am looking into it. <div id="disqus_thread"></div> <noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
Currently this is a placeholder. I have started way too many projects and getting around to this may take a while. I am going to be filling out the tutorials as I complete each thing on my own. I am mainly doing this so I have instructions on how to do it again later. ''All of this is done on the Raspberry Pi 2'' - GitLab may not work on the old raspberry pi but syncthing and node shouldn't have any trouble. Someone should try GitLab on one of the older ones and let me know. I will try to add screen shots to each of these. They shouldn't be needed but things tend to be a bit nicer when there are images. If you use any of this please let me know, there are [[many|Who is this inmysocks guy?]] [[options|Comments]] for how to do this. Any comments, requests, suggestions or secret recipes for your grandmothers famous coleslaw are welcome. Also let me know if you have trouble with any of the parts so I can fix it. !!''BIG IMPORTANT NOTE OF DOOM:'' If you are going to do any of these things that lets you connect to your pi from outside your local network make sure to change the password to something other than the default `raspberry`, otherwise anyone on the internet will be able to ssh into your pi and do whatever they want with it. ''THIS IS IMPORTANT.'' !List of stuff This is a list of the things I have done, or things I am planning on doing, and written instructions that other people may find useful. *For most ~TiddlyWiki related stuff, go to my [[other site|http://inmysocks.tiddlywiki.com]]. *[[Adding comments sections to tiddlers on a tiddlywiki using hashover]] (I am hoping to have a version of this for hosting on a raspberry pi soon, this is how there are comments on the blog part of this site.) *Raspberry Pi **[[Getting and setting up a Raspberry Pi]] (since everything is on a pi, this is required before you do the others. It is missing how to set up a wireless connection from the command line) **[[Logging into your Raspberry Pi via SSH]] (this is required to do the rest on a headless raspberry pi, incomplete, only linux commands, I have no idea how to do this in windows or on a mac) ***[[Some helpful commands]] (Useful commands for controlling your raspberry pi via ssh) **[[How to change the default password of your Raspberry Pi]] (THIS IS VERY IMPORTANT IF YOU DO ANY OF THE STUFF BELOW) **[[Setting up dynamic DNS on your Raspberry Pi]] (required to be able to access your pi from outside your local network. Make sure you [[change your password|How to change the default password of your Raspberry Pi]] first if you left it as the default `raspberry`. Seriously, change your password.) **[[Installing syncthing on a Raspberry Pi]] (only command line instructions and cheating because I point you to another site.) **[[Installing GitLab on a Raspberry Pi]] (this is missing how to set up port forwarding) **[[Setting up node on a Raspberry Pi for TiddlyWiki]] *[[Setting up a redirect from a dreamhost domain to a dynamic dns thing]] (very simple, nothing at all profound, probably the laziest way to do it.) planned or incomplete tutorials: *Finding the ip address of your raspberry pi so you can connect to it *Setting up port forwarding *~~Setting up a Raspberry Pi as a mail server~~ - this isn't going to happen any time soon because my isp blocks port 25 so the simple options won't work. *Using a Raspberry Pi as an XMPP (instant messaging) server --- [[About Me|Who is this inmysocks guy?]] [[About this site]] [[Leave a comment|Comments]] Do you find this helpful? Want to help me pay rent/eat so I can continue making stuff like this? You can [[donate here|Donate]].
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
\define thisTweetURL() https://twitter.com/intent/tweet?text=$(TweetText)$&url=$(TweetURL)$ \end Tweet Text: <$edit-text tiddler='$:/temp/Twitter Post' field='tweet_text' class='tc-edit-texteditor' placeholder='Tweet text'/> URL: <$edit-text tiddler='$:/temp/Twitter Post' field='tweet_url' class='tc-edit-texteditor' placeholder='Tweet url'/> <$set name=TweetText value={{$:/temp/Twitter Post!!tweet_text}}> <$set name=TweetURL value={{$:/temp/Twitter Post!!tweet_url}}> <a href=<<thisTweetURL>>><<fa fa-twitter>> Tweet</a> </$set> </$set> <<tabs "[tag[Twitter List]]" [[My Tweets]]>>
I could turn on a type of commenting using twitter. It wouldn't be hard to make a button that would make a tweet that indicates the post title you are talking about and lets you fill in the rest and post it to me on twitter. But between the post title and pointing it to me you may not get a lot of space for the comments. The new tweet buttons sort of work, but they have very long urls so not much else can be said. Also, if you click on a post title it will open that post in its own tiddler and have a tweet button. It will also update the url in your browser to be a permalink to that post. And it isn't a great solution either way. But I am working on it. I think that twitter and facebook play together so I may be able to use posting to twitter as a way to post to facebook. We shall see. Oh, and people seem to like the calendar plugin. They want me to work on it more. It does what I want it to do so unless someone is going to give me some sort of encouragement it may be a while before I feel like playing with it again.
\define PartialTwitterLink() <a class="twitter-share-button" href="https://twitter.com/share" data-url=<<twitterify-permalink "$(ThisTitle)$">>> Tweet </a> \end \define TwitterShareTiddlerButton() <$set name=ThisTitle value=<<currentTiddler>>> <<PartialTwitterLink>> </$set> \end
<a class="twitter-timeline" href="https://twitter.com/search?q=%40maybejed" data-widget-id="574630789364609025">Tweets about @maybejed</a>
I made one that just moves the location of the words: <<imageSlider [[./images/RockSisyphusTattooIdea2.jpg]] "Biggest rock is best rock, with moved words">> and one with the apple instead of a rock: <<imageSlider [[./images/RockSisyphusTattooIdea3.jpg]] "The apple could use some work">> So, that is where things are at the moment.
Older game. Many people say this is the best in the series, but I like Ultima VI better.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
<script> function InitPxVideo(options) { "use strict"; // Utilities for caption time codes function video_timecode_min(tc) { var tcpair = []; tcpair = tc.split(' --> '); return videosub_tcsecs(tcpair[0]); } function video_timecode_max(tc) { var tcpair = []; tcpair = tc.split(' --> '); return videosub_tcsecs(tcpair[1]); } function videosub_tcsecs(tc) { if (tc === null || tc === undefined) { return 0; } else { var tc1 = [], tc2 = [], seconds; tc1 = tc.split(','); tc2 = tc1[0].split(':'); seconds = Math.floor(tc2[0]*60*60) + Math.floor(tc2[1]*60) + Math.floor(tc2[2]); return seconds; } } // For "manual" captions, adjust caption position when play time changed (via rewind, clicking progress bar, etc.) function adjustManualCaptions(obj) { obj.subcount = 0; while (video_timecode_max(obj.captions[obj.subcount][0]) < obj.movie.currentTime.toFixed(1)) { obj.subcount++; if (obj.subcount > obj.captions.length-1) { obj.subcount = obj.captions.length-1; break; } } } // Display captions container and button (for initialization) function showCaptionContainerAndButton(obj) { obj.captionsBtnContainer.className = "px-video-captions-btn-container show"; if (obj.isCaptionDefault) { obj.captionsContainer.className = "px-video-captions show"; obj.captionsBtn.setAttribute("checked", "checked"); } } // Unfortunately, due to scattered support, browser sniffing is required function browserSniff() { var nVer = navigator.appVersion, nAgt = navigator.userAgent, browserName = navigator.appName, fullVersion = ''+parseFloat(navigator.appVersion), majorVersion = parseInt(navigator.appVersion,10), nameOffset, verOffset, ix; // MSIE 11 if ((navigator.appVersion.indexOf("Windows NT") !== -1) && (navigator.appVersion.indexOf("rv:11") !== -1)) { browserName = "IE"; fullVersion = "11;"; } // MSIE else if ((verOffset=nAgt.indexOf("MSIE")) !== -1) { browserName = "IE"; fullVersion = nAgt.substring(verOffset+5); } // Chrome else if ((verOffset=nAgt.indexOf("Chrome")) !== -1) { browserName = "Chrome"; fullVersion = nAgt.substring(verOffset+7); } // Safari else if ((verOffset=nAgt.indexOf("Safari")) !== -1) { browserName = "Safari"; fullVersion = nAgt.substring(verOffset+7); if ((verOffset=nAgt.indexOf("Version")) !== -1) { fullVersion = nAgt.substring(verOffset+8); } } // Firefox else if ((verOffset=nAgt.indexOf("Firefox")) !== -1) { browserName = "Firefox"; fullVersion = nAgt.substring(verOffset+8); } // In most other browsers, "name/version" is at the end of userAgent else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) < (verOffset=nAgt.lastIndexOf('/')) ) { browserName = nAgt.substring(nameOffset,verOffset); fullVersion = nAgt.substring(verOffset+1); if (browserName.toLowerCase()==browserName.toUpperCase()) { browserName = navigator.appName; } } // Trim the fullVersion string at semicolon/space if present if ((ix=fullVersion.indexOf(";")) !== -1) { fullVersion=fullVersion.substring(0,ix); } if ((ix=fullVersion.indexOf(" ")) !== -1) { fullVersion=fullVersion.substring(0,ix); } // Get major version majorVersion = parseInt(''+fullVersion,10); if (isNaN(majorVersion)) { fullVersion = ''+parseFloat(navigator.appVersion); majorVersion = parseInt(navigator.appVersion,10); } // Return data return [browserName, majorVersion]; } //https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode // launch fullscreen function launchFullScreen(elem) { if (!elem.fullscreenElement && // alternative standard method !elem.mozFullScreenElement && !elem.webkitFullscreenElement && !elem.msFullscreenElement ) { // current working methods var requestFullScreen = elem.requestFullscreen || elem.msRequestFullscreen || elem.mozRequestFullScreen || elem.webkitRequestFullscreen; requestFullScreen.call(elem); } } // change styles of fullscreen accordingly function fullScreenStyles() { if (document.fullscreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement) { obj.fullScreenBtn.checked = true; //must apply other styles in container obj.container.setAttribute("style", "width: 100%; height: 100%;"); obj.controls.className = "px-video-controls js-fullscreen-controls"; obj.captionsContainer.className = "px-video-captions js-fullscreen-captions"; obj.movie.setAttribute('width', '100%'); obj.movie.setAttribute('height', '100%'); } else { obj.fullScreenBtn.checked = false; // revert back to default styles // obj.container.setAttribute("style", "width:" + obj.movieWidth + "px"); obj.controls.className = "px-video-controls"; obj.captionsContainer.className = "px-video-captions"; obj.movie.setAttribute('width', obj.movieWidth); obj.movie.setAttribute('height', obj.movieHeight); } } // exit fullscreen function exitFullScreen() { // get appropriate vendor prefix and then call it with respect to the document var exitFullScreen = document.exitFullscreen || document.msExitFullscreen || document.mozCancelFullScreen || document.webkitExitFullscreen; exitFullScreen.call(document); } // Global variable var obj = {}; obj.arBrowserInfo = browserSniff(); obj.browserName = obj.arBrowserInfo[0]; obj.browserMajorVersion = obj.arBrowserInfo[1]; // If IE8, stop customization (use fallback) // If IE9, stop customization (use native controls) if (obj.browserName === "IE" && (obj.browserMajorVersion === 8 || obj.browserMajorVersion === 9) ) { return false; } // If smartphone or tablet, stop customization as video (and captions in latest devices) are handled natively obj.isSmartphoneOrTablet = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent); if (obj.isSmartphoneOrTablet) { return false; } // Set debug mode if (typeof(options.debug)==='undefined') { options.debug = false; } obj.debug = options.debug; // Output browser info to log if debug on if (options.debug) { console.log(obj.browserName + " " + obj.browserMajorVersion); } // Set up aria-label for Play button with the videoTitle option if ((typeof(options.videoTitle)==='undefined') || (options.videoTitle==="")) { obj.playAriaLabel = "Play"; } else { obj.playAriaLabel = "Play video, " + options.videoTitle; } // Get the container, video element, and controls container obj.container = document.getElementById(options.videoId); obj.movie = obj.container.getElementsByTagName('video')[0]; obj.controls = obj.container.getElementsByClassName('px-video-controls')[0]; // Remove native video controls obj.movie.removeAttribute("controls"); // Generate random number for ID/FOR attribute values for controls obj.randomNum = Math.floor(Math.random() * (10000)); // Insert custom video controls if (options.debug) { console.log("Inserting custom video controls"); } obj.controls.innerHTML = '<div class="progress-bar">' + '<progress class="px-video-progress" max="100" value="0"><span>0</span>% played</progress>' + '</div>' + '<div class="controls">' + '<div class="px-video-time">' + '<span class="sr-only">time</span> <span class="px-video-duration">00:00</span>' + '</div>' + '<div class="px-video-playback-buttons">' + '<button class="px-video-restart"><span class="sr-only">Restart</span></button>' + '<button class="px-video-rewind"><span class="sr-only">rewind <span class="px-seconds">10</span> seconds</span></button>' + '<button class="px-video-play" aria-label="'+obj.playAriaLabel+'"><span class="sr-only">Play</span></button>' + '<button class="px-video-pause hide"><span class="sr-only">Pause</span></button>' + '<button class="px-video-forward"><span class="sr-only">forward <span class="px-seconds">10</span> seconds</span></button>' + '</div>' + '<div class="px-video-volume-controls">' + '<div class="px-video-mute-btn-container">' + '<input class="px-video-mute sr-only" id="btnMute'+obj.randomNum+'" type="checkbox" />' + '<label id="labelMute'+obj.randomNum+'" for="btnMute'+obj.randomNum+'"><span class="sr-only">Mute</span></label>' + '</div>' + '<div class="px-video-volume-slider">' + '<label for="volume'+obj.randomNum+'" class="sr-only">Volume:</label><input id="volume'+obj.randomNum+'" class="px-video-volume" type="range" min="0" max="10" value="5" />' + '</div>' + '<div class="px-video-captions-btn-container hide">' + '<input class="px-video-btnCaptions sr-only" id="btnCaptions'+obj.randomNum+'" type="checkbox" />' + '<label for="btnCaptions'+obj.randomNum+'"><span class="sr-only">Captions</span></label>' + '</div>' + '<div class="px-video-fullscreen-btn-container show">' + '<input class="px-video-btnFullScreen sr-only" id="btnFullscreen'+obj.randomNum+'" type="checkbox" />' + '<label for="btnFullscreen'+obj.randomNum+'"><span class="sr-only">Fullscreen</span></label>' + '</div>' + '</div>' + '</div>'; // Adjust layout per width of video - container obj.movieWidth = obj.movie.width; if (obj.movieWidth < 360) { obj.movieWidth = 360; } // obj.container.setAttribute("style", "width:" + obj.movieWidth + "px"); // Adjust layout per width of video - controls/mute offset obj.labelMute = document.getElementById("labelMute" + obj.randomNum); obj.labelMuteOffset = obj.movieWidth - 390; if (obj.browserName==="Firefox") { // adjust for Firefox rendering obj.labelMuteOffset = obj.labelMuteOffset - 10; } if (obj.labelMuteOffset < 0) { obj.labelMuteOffset = 0; } obj.labelMute.setAttribute("style", "margin-left:" + obj.labelMuteOffset + "px"); // Get URL of caption file if exists var captionSrc = "", kind, children = obj.movie.childNodes; for (var i = 0; i < children.length; i++) { if (children[i].nodeName.toLowerCase() === 'track') { kind = children[i].getAttribute('kind'); if (kind === 'captions') { captionSrc = children[i].getAttribute('src'); } } } // Record if caption file exists or not obj.captionExists = true; if (captionSrc === "") { obj.captionExists = false; if (options.debug) { console.log("No caption track found."); } } else { if (options.debug) { console.log("Caption track found; URI: " + captionSrc); } } // Set captions on/off - on by default if (typeof(options.captionsOnDefault) === 'undefined') { options.captionsOnDefault = true; } obj.isCaptionDefault = options.captionsOnDefault; // Number of seconds for rewind and forward buttons if (typeof(options.seekInterval) === 'undefined') { options.seekInterval = 10; } obj.seekInterval = options.seekInterval; // Get the elements for the controls obj.btnPlay = obj.container.getElementsByClassName('px-video-play')[0]; obj.btnPause = obj.container.getElementsByClassName('px-video-pause')[0]; obj.btnRestart = obj.container.getElementsByClassName('px-video-restart')[0]; obj.btnRewind = obj.container.getElementsByClassName('px-video-rewind')[0]; obj.btnForward = obj.container.getElementsByClassName('px-video-forward')[0]; obj.btnVolume = obj.container.getElementsByClassName('px-video-volume')[0]; obj.btnMute = obj.container.getElementsByClassName('px-video-mute')[0]; obj.progressBar = obj.container.getElementsByClassName('px-video-progress')[0]; obj.progressBarSpan = obj.progressBar.getElementsByTagName('span')[0]; obj.captionsContainer = obj.container.getElementsByClassName('px-video-captions')[0]; obj.captionsBtn = obj.container.getElementsByClassName('px-video-btnCaptions')[0]; obj.captionsBtnContainer = obj.container.getElementsByClassName('px-video-captions-btn-container')[0]; obj.duration = obj.container.getElementsByClassName('px-video-duration')[0]; obj.txtSeconds = obj.container.getElementsByClassName('px-seconds'); obj.fullScreenBtn = obj.container.getElementsByClassName('px-video-btnFullScreen')[0]; obj.fullScreenBtnContainer = obj.container.getElementsByClassName('px-video-fullscreen-btn-container')[0]; // Update number of seconds in rewind and fast forward buttons obj.txtSeconds[0].innerHTML = obj.seekInterval; obj.txtSeconds[1].innerHTML = obj.seekInterval; // Determine if HTML5 textTracks is supported (for captions) obj.isTextTracks = false; if (obj.movie.textTracks) { obj.isTextTracks = true; } // Play obj.btnPlay.addEventListener('click', function() { obj.movie.play(); obj.btnPlay.className = "px-video-play hide"; obj.btnPause.className = "px-video-pause px-video-show-inline"; obj.btnPause.focus(); }, false); // Pause obj.btnPause.addEventListener('click', function() { obj.movie.pause(); obj.btnPlay.className = "px-video-play px-video-show-inline"; obj.btnPause.className = "px-video-pause hide"; obj.btnPlay.focus(); }, false); // Restart obj.btnRestart.addEventListener('click', function() { // Move to beginning obj.movie.currentTime = 0; // Special handling for "manual" captions if (!obj.isTextTracks) { obj.subcount = 0; } // Play and ensure the play button is in correct state obj.movie.play(); obj.btnPlay.className = "px-video-play hide"; obj.btnPause.className = "px-video-pause px-video-show-inline"; }, false); // Rewind obj.btnRewind.addEventListener('click', function() { var targetTime = obj.movie.currentTime - obj.seekInterval; if (targetTime < 0) { obj.movie.currentTime = 0; } else { obj.movie.currentTime = targetTime; } // Special handling for "manual" captions if (!obj.isTextTracks) { adjustManualCaptions(obj); } }, false); // Fast forward obj.btnForward.addEventListener('click', function() { var targetTime = obj.movie.currentTime + obj.seekInterval; if (targetTime > obj.movie.duration) { obj.movie.currentTime = obj.movie.duration; } else { obj.movie.currentTime = targetTime; } // Special handling for "manual" captions if (!obj.isTextTracks) { adjustManualCaptions(obj); } }, false); // Get the HTML5 range input element and append audio volume adjustment on change obj.btnVolume.addEventListener('change', function() { obj.movie.volume = parseFloat(this.value / 10); }, false); // Mute obj.btnMute.addEventListener('click', function() { if (obj.movie.muted === true) { obj.movie.muted = false; } else { obj.movie.muted = true; } }, false); obj.btnMute.onkeypress = function(e) { if(e.keyCode == 13){ // enter key e.preventDefault(); if (this.checked == true) { this.checked = false; } else { this.checked = true; } if (obj.movie.muted === true) { obj.movie.muted = false; } else { obj.movie.muted = true; } } } // Duration obj.movie.addEventListener("timeupdate", function() { obj.secs = parseInt(obj.movie.currentTime % 60); obj.mins = parseInt((obj.movie.currentTime / 60) % 60); // Ensure it's two digits. For example, 03 rather than 3. obj.secs = ("0" + obj.secs).slice(-2); obj.mins = ("0" + obj.mins).slice(-2); // Render obj.duration.innerHTML = obj.mins + ':' + obj.secs; }, false); // Progress bar obj.movie.addEventListener('timeupdate', function() { obj.percent = (100 / obj.movie.duration) * obj.movie.currentTime; if (obj.percent > 0) { obj.progressBar.value = obj.percent; obj.progressBarSpan.innerHTML = obj.percent; } }, false); // Skip when clicking progress bar obj.progressBar.addEventListener('click', function(e) { obj.pos = (e.pageX - this.offsetLeft) / this.offsetWidth; obj.movie.currentTime = obj.pos * obj.movie.duration; // Special handling for "manual" captions if (!obj.isTextTracks) { adjustManualCaptions(obj); } }); // Toggle display of fullscreen button obj.fullScreenBtn.addEventListener('click', function() { if (this.checked) { launchFullScreen(obj.container); } else { exitFullScreen(); } }, false); obj.fullScreenBtn.onkeypress = function(e) { if (e.keyCode == 13){ // enter key e.preventDefault(); if (this.checked == true) { this.checked = false; exitFullScreen(); } else { this.checked = true; launchFullScreen(obj.container); } } } // Clear captions at end of video obj.movie.addEventListener('ended', function() { obj.captionsContainer.innerHTML = ""; }); // *** // Captions // *** // Toggle display of captions via captions button obj.captionsBtn.addEventListener('click', function() { if (this.checked) { obj.captionsContainer.className = "px-video-captions show"; } else { obj.captionsContainer.className = "px-video-captions hide"; } // if fullscreen add fullscreen class if (document.fullscreen || document.mozFullScreen || document.webkitIsFullScreen || document.msFullscreenElement) { var currClass = obj.captionsContainer.className; obj.captionsContainer.className = currClass + ' js-fullscreen-captions'; } }, false); obj.captionsBtn.onkeypress = function(e) { if (e.keyCode == 13){ // enter key e.preventDefault(); if (this.checked == true) { this.checked = false; } else { this.checked = true; } if (this.checked) { obj.captionsContainer.className = "px-video-captions show"; } else { obj.captionsContainer.className = "px-video-captions hide"; } } } // If no caption file exists, hide container for caption text if (!obj.captionExists) { obj.captionsContainer.className = "px-video-captions hide"; } // If caption file exists, process captions else { // Can't use native captioning in the follow browsers: if ((obj.browserName==="IE" && obj.browserMajorVersion===10) || (obj.browserName==="IE" && obj.browserMajorVersion===11) || (obj.browserName==="Firefox" && obj.browserMajorVersion>=31) || (obj.browserName==="Chrome" && obj.browserMajorVersion===43) || (obj.browserName==="Safari" && obj.browserMajorVersion>=7)) { if (options.debug) { console.log("Detected browser unable to play HTML5 captions; using custom captions"); } // set to false so skips to 'manual' captioning obj.isTextTracks = false; // turn off native caption rendering to avoid double captions [doesn't work in Safari 7; see patch below] var track = {}; var tracks = obj.movie.textTracks; for (var j=0; j < tracks.length; j++) { track = obj.movie.textTracks[j]; track.mode = "hidden"; } } // Rendering caption tracks - native support required - http://caniuse.com/webvtt if (obj.isTextTracks) { if (options.debug) { console.log("textTracks supported"); } showCaptionContainerAndButton(obj); var track = {}; var tracks = obj.movie.textTracks; for (var j=0; j < tracks.length; j++) { track = obj.movie.textTracks[j]; track.mode = "hidden"; if (track.kind === "captions") { track.addEventListener("cuechange",function() { if (this.activeCues[0]) { if (this.activeCues[0].hasOwnProperty("text")) { obj.captionsContainer.innerHTML = this.activeCues[0].text; } } },false); } } } // Caption tracks not natively supported else { if (options.debug) { console.log("textTracks not supported so rendering captions 'manually'"); } showCaptionContainerAndButton(obj); // Render captions from array at appropriate time obj.currentCaption = ''; obj.subcount = 0; obj.captions = []; obj.movie.addEventListener('timeupdate', function() { // Check if the next caption is in the current time range if (obj.movie.currentTime.toFixed(1) > video_timecode_min(obj.captions[obj.subcount][0]) && obj.movie.currentTime.toFixed(1) < video_timecode_max(obj.captions[obj.subcount][0])) { obj.currentCaption = obj.captions[obj.subcount][1]; } // Is there a next timecode? if (obj.movie.currentTime.toFixed(1) > video_timecode_max(obj.captions[obj.subcount][0]) && obj.subcount < (obj.captions.length-1)) { obj.subcount++; } // Render the caption obj.captionsContainer.innerHTML = obj.currentCaption; }, false); if (captionSrc != "") { // Create XMLHttpRequest object var xhr; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE8 xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { if (options.debug) { console.log("xhr = 200"); } obj.captions = []; var records = [], record, req = xhr.responseText; records = req.split('\n\n'); for (var r=0; r < records.length; r++) { record = records[r]; obj.captions[r] = []; obj.captions[r] = record.split('\n'); } // Remove first element ("VTT") obj.captions.shift(); if (options.debug) { console.log('Successfully loaded the caption file via ajax.'); } } else { if (options.debug) { console.log('There was a problem loading the caption file via ajax.'); } } } } xhr.open("get", captionSrc, true); xhr.send(); } } // If Safari 7, removing track from DOM [see 'turn off native caption rendering' above] if (obj.browserName === "Safari" && obj.browserMajorVersion === 7) { console.log("Safari 7 detected; removing track from DOM"); var tracks = obj.movie.getElementsByTagName("track"); obj.movie.removeChild(tracks[0]); } } document.addEventListener("fullscreenchange", function () { fullScreenStyles(); }, false); document.addEventListener("mozfullscreenchange", function () { fullScreenStyles(); }, false); document.addEventListener("webkitfullscreenchange", function () { fullScreenStyles(); }, false); document.addEventListener("msfullscreenchange", function () { fullScreenStyles(); }, false); }; </script> <script> // Initialize new InitPxVideo({ "videoId": "myvid", "captionsOnDefault": false, "seekInterval": 20, "videoTitle": "Javert and Roscoe Play", "debug": false }); </script>
.section--title { border-top: 1px solid black-thirty; clear: both; font-size: 38px; line-height: OneAndThreeQuartersLineHeights; margin-top: OneAndAHalfLineHeights; padding-top: OneLineHeight; } @media only screen and (min-width: 600px) { .section--title { font-size: 42px; line-height: TwoLineHeights; width: 100%; } } .video-thumbnail { clear: both; margin-top: HalfLineHeight; margin-bottom: HalfLineHeight; overflow: hidden; } @media only screen and (min-width: 670px) { .video-thumbnail img { float: left; margin-top: OneLineHeight; width: 45%; } } @media only screen and (min-width: 670px) { .session--title, .session--speaker, .session--description, .session--transcript, .session--watch { float: right; margin-left: 5%; width: 50%; } } .session--watch .button { max-width: 140px; } .session--title { font-size: 27px; line-height: OneAndAQuarterLineHeights; } .session--title a { color: black-seventy; text-decoration: none; } @media only screen and (min-width: 670px) { .session--title { margin-top: OneLineHeight; margin-bottom: HalfLineHeight; } } .session--speaker, .session--description, .session--transcript { margin-bottom: HalfLineHeight; } .session--video { margin-bottom: ThreeQuartersLineHeight; } .session--video .session--speaker { clear: both; float: none; margin-left: 0; margin-bottom: QuarterLineHeight; text-align: center; width: 100%; } .session--video p { text-align: center; } .transcript h2 { font-family: "Avenir Next", Avenir, 'Helvetica Neue', Helvetica, sans-serif; font-size: 36px; line-height: TwoLineHeights; margin-top: OneLineHeight; } @media only screen and (min-width: 820px) { .transcript h2 { font-size: 42px; line-height: ThreeLineHeights; } } .transcript h3 { font-weight: bold; line-height: OneAndAHalfLineHeights; margin-bottom: QuarterLineHeight; font-size: 20px; } .transcript p { word-wrap: break-word; } @media only screen and (min-width: 500px) { .transcript p { word-wrap: normal; } } .transcript-navigation { overflow: hidden; } .transcript-navigation ul { display: -webkit-flex; display: flex; -webkit-flex-flow: row wrap; flex-flow: row wrap; -webkit-justify-content: center; justify-content: center; margin-bottom: 0; margin-left: 0; overflow: hidden; } .transcript-navigation ul li { float: left; -webkit-flex: none; flex: none; list-style-type: none; margin-bottom: 0; } @media only screen and (min-width: 390px) { .transcript-navigation ul li { margin-right: HalfLineHeight; margin-left: HalfLineHeight; } } .transcript-navigation ul li a { display: block; } .js .transcript-navigation { overflow: visible; } #transcript-select { float: right; margin-left: OneLineHeight; } .transcript-navigation + h2 { margin-top: OneLineHeight; } .transcript-note { border-top: 1px solid black-thirty; color: black-sixty; font-style: italic; padding-top: QuarterLineHeight; } .transcript-link { display: block; font-size: 15px; float: right; line-height: OneLineHeight; margin-top: -10px; } @media only screen and (min-width: 620px) { .transcript-link { float: left; font-size: 17px; } } .transcript-link:after { display: block; font-size: 0; content: " "; clear: both; height: 0; visibility: hidden; } @media only screen and (min-width: 620px) { .custom-controls .transcript-link { margin-top: -44px; } } .transcript-single { border-bottom: 2px solid black-thirty; } .transcript-single.hidden { display: none; } .session--watch { margin-bottom: HalfLineHeight; } .session--watch .button { background: black-sixty; margin-top: QuarterLineHeight; } .session--watch .button:hover, .session--watch .button:active, .session--watch .button:focus { background: black-seventy; } /* utilities */ .sr-only { position: absolute !important; clip: rect(1px, 1px, 1px, 1px); padding: 0 !important; border: 0 !important; height: 1px !important; width: 1px !important; overflow: hidden; } .hide { display: none; } .show-inline { display: inline-block; } /* video */ .px-video-container { overflow: hidden; min-width: 300px; } .px-video-img-captions-container { position: relative; padding-bottom: 56.25%; height: 0; } .px-video { position: absolute; top: 0; left: 0; margin-top: 0; width: 100%; height: 100%; } /* containers */ .px-video-img-captions-container * { box-sizing: border-box; } .px-video-img-captions-container { position: relative; } .px-video-wrapper { position: relative; padding-bottom: 56.25%; height: 0; z-index: 1; } .px-video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .progress-bar { width: 85%; } @media only screen and (min-width: 480px) { .progress-bar { width: 90%; } } @media only screen and (min-width: 480px) { .progress-bar { width: 92.5%; } } @media only screen and (min-width: 970px) { .progress-bar { width: 95%; } } @media only screen and (min-width: 1795px) { .progress-bar { width: 97.5%; } } .px-video-controls { margin-bottom: 10px; margin-top: 10px; } .px-video-controls:after { display: block; font-size: 0; content: " "; clear: both; height: 0; visibility: hidden; } /* progress indicator */ .px-video-progress { display: block; width: 100%; margin-bottom: 10px; height: 10px; } .px-video-progress[value] { /* Reset the default appearance */ -webkit-appearance: none; border: none; } .px-video-progress[value]::-webkit-progress-bar { background-color: #e6e6e6; } .px-video-progress[value]::-webkit-progress-value { background-color: #009cdf; } /* time */ .px-video-time { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; float: right; line-height: 30px; margin-top: -30px; font-size: 14px; } /* caption area */ .px-video-captions { box-sizing: border-box; position: absolute; top: 1px; left: 0; width: 100%; padding: 0.5em; min-height: 2.5em; background-color: #000; color: #fff; font-size: 1.1em; text-align: center; opacity: 0.75; z-index: 2; } /* buttons */ .px-video-playback-buttons { float: left; line-height: 20px; min-width: 145px; } @media only screen and (min-width: 620px) { .px-video-playback-buttons { float: none; left: 50%; margin-left: -120px; min-width: 200px; position: absolute; width: 200px; } } .px-video-controls button { border: 1px transparent solid; background: transparent; padding: 0; margin: 0 5px; width: 25px; height: 25px; overflow: hidden; background: no-repeat url("../images/px-video-sprite.svg"); } @media only screen and (min-width: 620px) { .px-video-controls button { background-size: 150%; width: 40px; height: 40px; } } /* use with Modernizr to provide a no-svg class on <html> to support browsers that don't support SVG */ .no-svg .px-video-controls button { background: no-repeat url("../images/px-video-sprite.png"); } .px-video-controls button:focus { border: 1px #999 dotted; outline: none; } .px-video-controls button { cursor: pointer; } /* restart button */ .px-video-controls button.px-video-restart { background-position: -9px -331px; } .px-video-controls button.px-video-restart:hover, .px-video-controls button.px-video-restart:focus { background-position: -9px -295px; } @media only screen and (min-width: 620px) { .px-video-controls button.px-video-restart { background-position: -9px -523px; } } @media only screen and (min-width: 620px) { .px-video-controls button.px-video-restart:hover, .px-video-controls button.px-video-restart:focus { background-position: -9px -466px; } } /* rewind button */ .px-video-controls button.px-video-rewind { background-position: -9px -187px; } .px-video-controls button.px-video-rewind:hover, .px-video-controls button.px-video-rewind:focus { background-position: -9px -151px; } @media only screen and (min-width: 620px) { .px-video-controls button.px-video-rewind { background-position: -9px -295px; } .px-video-controls button.px-video-rewind:hover, .px-video-controls button.px-video-rewind:focus { background-position: -9px -238px; } } /* play button */ .px-video-controls button.px-video-play { background-position: -8px -43px; } .px-video-controls button.px-video-play:hover, .px-video-controls button.px-video-play:focus { background-position: -8px -7px; } @media only screen and (min-width: 620px) { .px-video-controls button.px-video-play { background-position: -8px -67px; } .px-video-controls button.px-video-play:hover, .px-video-controls button.px-video-play:focus { background-position: -8px -10px; } } /* pause button */ .px-video-controls button.px-video-pause { background-position: -9px -115px; } .px-video-controls button.px-video-pause:hover, .px-video-controls button.px-video-pause:focus { background-position: -9px -79px; } @media only screen and (min-width: 620px) { .px-video-controls button.px-video-pause { background-position: -9px -182px; } } @media only screen and (min-width: 620px) { .px-video-controls button.px-video-pause:hover, .px-video-controls button.px-video-pause:focus { background-position: -9px -124px; } } /* forward button */ .px-video-controls button.px-video-forward { background-position: -10px -259px; } .px-video-controls button.px-video-forward:hover, .px-video-controls button.px-video-forward:focus { background-position: -10px -223px; } @media only screen and (min-width: 620px) { .px-video-controls button.px-video-forward { background-position: -10px -409px; } .px-video-controls button.px-video-forward:hover, .px-video-controls button.px-video-forward:focus { background-position: -10px -352px; } } .px-video-fullscreen-btn-container { float: left; width: 25px; } .px-video-fullscreen-btn-container label { display: inline-block; width: 25px; height: 20px; margin-top: 3px; margin-left: 1px; background: no-repeat url("../images/px-video-sprite.svg"); background-position: -6px -943px; } @media only screen and (min-width: 540px) { .px-video-fullscreen-btn-container label { margin-top: 5px; } } .no-svg .px-video-fullscreen-btn-container { /* use with Modernizr to provide a no-svg class on <html> to support browsers that don't support SVG */ background: no-repeat url("../images/px-video-sprite.png"); } .px-video-fullscreen-btn-container input[type="checkbox"]:focus+label { outline: 1px #999 dotted; background-position: -6px -907px; } .px-video-fullscreen-btn-container input[type="checkbox"]:hover+label { background-position: -6px -907px; cursor: pointer; } .px-video-fullscreen-btn-container input[type="checkbox"]:focus+label { outline: 1px #999 dotted; background-position: -6px -907px; } .px-video-fullscreen-btn-container input[type="checkbox"]:checked+label { background-position: -6px -979px; } .px-video-fullscreen-btn-container input[type="checkbox"]:checked:hover+label { background-position: -6px -1015px; } /* captions button */ .px-video-captions-btn-container { float: left; } @media only screen and (min-width: 540px) { .px-video-captions-btn-container { clear: none; margin-top: 1px; margin-left: 10px; } } .px-video-captions-btn-container label { display: inline-block; width: 25px; height: 20px; margin-top: 3px; background: no-repeat url("../images/px-video-sprite.svg"); background-position: -6px -835px; } @media only screen and (min-width: 540px) { .px-video-captions-btn-container label { margin-top: 4px; } } .no-svg .px-video-captions-btn-container label { /* use with Modernizr to provide a no-svg class on <html> to support browsers that don't support SVG */ background: no-repeat url("../images/px-video-sprite.png"); } .px-video-captions-btn-container input[type="checkbox"]:focus+label { outline: 1px #999 dotted; background-position: -6px -799px; } .px-video-captions-btn-container input[type="checkbox"]:hover+label { background-position: -6px -799px; cursor: pointer; } .px-video-captions-btn-container input[type="checkbox"]:focus+label { outline: 1px #999 dotted; background-position: -6px -799px; } .px-video-captions-btn-container input[type="checkbox"]:checked+label { background-position: -6px -871px; } /* mute button */ .px-video-volume-controls { float: right; overflow: hidden; min-width: 133px; } @media only screen and (min-width: 540px) { .px-video-volume-controls { margin-top: 1px; } } .px-video-mute-btn-container { float: left; width: 26px; } .px-video-mute-btn-container label { display: inline-block; width: 25px; height: 20px; margin-top: 3px; background: no-repeat url("../images/px-video-sprite.svg"); background-position: -6px -476px; } @media only screen and (min-width: 540px) { .px-video-mute-btn-container label { margin-top: 6px; } } .no-svg .px-video-mute-btn-container label { /* use with Modernizr to provide a no-svg class on <html> to support browsers that don't support SVG */ background: no-repeat url("../images/px-video-sprite.png"); } .px-video-mute-btn-container input[type="checkbox"]:focus+label { outline: 1px #999 dotted; background-position: -6px -440px; } .px-video-mute-btn-container input[type="checkbox"]:hover+label { background-position: -6px -440px; cursor: pointer; } .px-video-mute-btn-container input[type="checkbox"]:focus+label { outline: 1px #999 dotted; background-position: -6px -440px; } .px-video-mute-btn-container input[type="checkbox"]:checked+label { background-position: -6px -692px; } .px-video-mute-btn-container input[type="checkbox"]:checked:hover+label, .px-video-mute-btn-container input[type="checkbox"]:checked:focus+label { background-position: -6px -656px; } /* volume range input */ .px-video-volume-slider { float: left; width: 80px; } @media only screen and (min-width: 540px) { .px-video-volume-slider { width: 95px; } } .px-video-controls .controls { position: relative; /* fixing display for IE10+ */ } .px-video-controls .controls input[type='range'] { -webkit-appearance: none; height: 6px; width: 70px; margin-top: 9px; margin-right: 0; margin-left: 5px; background-color: #e6e6e6; outline: none; } @media only screen and (min-width: 540px) { .px-video-controls .controls input[type='range'] { margin-top: 12px; width: 85px; } } .px-video-controls .controls input[type='range']:focus::-webkit-slider-thumb { outline: 1px #999 dotted; } .px-video-controls .controls input[type='range']::-moz-range-track { -moz-appearance: none; height: 6px; background-color: #e6e6e6; border: none; } .px-video-controls .controls input[type='range']::-webkit-slider-thumb { -webkit-appearance: none !important; height: 10px; width: 6px; background-color: #666; } .px-video-controls .controls input[type='range']::-moz-range-thumb { background-color: #666; border: none; height: 12px; width: 8px; } @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { .px-video-controls .controls input[type='range'] { position: relative; padding: 0; height: 8px; top: -3px; } .px-video-controls .controls .px-video-time { margin-top: 4px; } .px-video-controls .controls .px-video-captions { padding: 8px; min-height: 36px; } }
<div class="px-video-container" id="myvid"> <div class="px-video-img-captions-container"> <div class="px-video-captions hide"></div> <div class="px-video-wrapper"> <video poster="media/JavertGhandi.jpg" class="px-video" controls> <!-- video files --> <!-- Standard video files --> <source src="media/javertandroscoeplay.mp4" type="video/mp4" /> <!-- fallback for browsers that don't support the video element --> <div> <a href="media/javertandroscoeplay.mp4"> <img src="media/javertandroscoeplay.jpg" width="640" height="360" alt="download video" /> </a> </div> </video> </div> </div><!-- end container for captions and video --> <div class="px-video-controls"></div> </div><!-- end video container -->
Me and Javert have gone on much longer walks than normal the past few days. Walking for about an hour instead of just dashing around the block the way she does when it is cold. There are a few dogs around here that walk around without leashes, I keep telling Javert that if she is good we will be able to do that some day. I don't think she believes me. I may not believe me.
Seriously, they are dangerous. <a href="http://my-ear-trumpet.tumblr.com/post/115559226170/just-a-friendly-reminder-to-lock-your-doors"> [img width=500px tooltip="""Violent Bunnies""" [http://36.media.tumblr.com/cbd9994537040e33aca27ed933d93720/tumblr_nmbvk30pXj1qzelz9o1_500.jpg]] </a> <br> (click the images for more) More pretty pictures! <a href="http://www.itsokaytobesmart.com/post/115679833882/nevver-magnetic-north-tiina-tormanen-fun-fact"> [img width=500px tooltip="""Spaaaaaaaaaace!!""" [http://40.media.tumblr.com/49e87dc30d9efe60c212a3e8ca2b156a/tumblr_nme8q9TaKS1qz6f9yo3_1280.jpg]] </a> <a href="http://www.slate.com/blogs/bad_astronomy/2015/04/08/undulatus_asperatus_rare_wave_cloud_formation_over_south_carolina.html"> [img width=500px tooltip="""Clouds!""" [http://www.slate.com/content/dam/slate/blogs/bad_astronomy/2015/04/07/mcelveen_asperatus_2.jpg.CROP.original-original.jpg]] </a> If [[this map|http://colchrishadfield.tumblr.com/post/115678976233/day-month-year-makes-the-most-sense-to-me]] is accurate the US is the only place in the world that exclusively uses MDY format for dates. I am almost 30 and have lived here my entire life and I often forget and put the date is DMY format, because that is what actually makes sense. Go read this comic.<br> <a href="http://dresdencodak.tumblr.com/post/115827311071/interested-in-my-work-but-dont-know-where-to"> [img width=500px tooltip="""Seriously, it is amazing.""" [http://40.media.tumblr.com/a364f3823baaa53f7ec4b8d81395e608/tumblr_nmh1ismh9H1qcbajko1_500.png]] </a> And in todays horrific news from the US, [[police once again kill a man who wasn't a threat on camera and claim it was self defense|http://www.nytimes.com/2015/04/08/us/south-carolina-officer-is-charged-with-murder-in-black-mans-death.html]]. And the most shocking part of it is that the officer is actually being charged with murder. Have [[some rather dark humor about the situation|http://freethoughtblogs.com/pharyngula/2015/04/08/sound-advice/]]. After that bit of horribleness, have some baby Fennec Foxes. <a href="http://www.zooborns.com/zooborns/2015/03/fennec-fox-kits-make-social-media-debut.html"> [img width=500px tooltip="""Click for more fox kits""" [http://www.zooborns.com/.a/6a010535647bf3970b01b7c76e7b40970b-800wi]] </a> I am not feeling well enough to go through the news from the rest of the world. There are plenty of horrible things in the US.
We are out of Javert's dog treats. She insists I am holding out on her and is watching me like hawk.
I am flying through the clouds right now. We live in the future.
I may have some contract work with a group doing privacy by design research for the EU. I am happy.
I got a raspberry pi 2 that I wanted to play with. I installed raspiban on it and used it a few times to see what it could do, I was planning on using it to do some realtime audio processing with Pure Data. But after spending way too long trying to get puredata installed on my desktop to do development in a nicer environment I finally gave up. Josh said that I was having almost comic amounts of difficulty getting it working on my computer. I had almost everything, but the most useful bits for what I wanted to do, namely the fir object, the generic filter object and the unit delay object, were all missing. So I set up the raspberry pi to use my nice monitor and plugged it in. There was a rather large spark from the powerbrick I was using to power it. I immediately unplugged it and the power brick is fried now, and smells. The pi doesn't look burnt, but after testing another powerbrick on my phone when I plugged in the pi nothing happened, not even the power led turned on. I had just gotten the raspberry pi a few days ago, this was the third time I was trying to use it. I am not amused. But what may be the best part is that when I put everything back on my desktop, my larger monitor (the one I had the pi plugged into) wouldn't display anything. At this point I wanted to burn down the house and start over. So instead I watched cartoons and startrek on my tablet. I finally got around to watching first contact. So that wasn't horrible. This morning after unsuccessfully trying to get my monitor to work using the DVI input I tried using the VGA in and it worked. So the monitor isn't completely fried, just the DVI port. According to the internet this may not be hard to fix, but it will require some surface mount soldering and a potentially hard to find fuse. But since my video card only has DVI and HDMI out and my second monitor only has VGA in now I need to find a second DVI to VGA adapter so I can use my second monitor. That or get a new monitor. As much as I would like a new monitor I don't think that I can really justify getting one considering the other toys I have bought recently, mainly the raspberry pi, which may be broken. The universe may be angry at me. Luckly the pi uses a [[polyfuse|https://en.wikipedia.org/wiki/Resettable_fuse]], so I am going to hope it worked and has reset by now so I can use it again. This time with my smaller monitor. If I can't fix the fuse or whatever is broken on the monitor myself than I can get a replacement board for the part that is broken, but that would cost ~$40 and if it comes to that I will probably try to get a used monitor with a DVI or HDMI input that is better than my current second monitor. The monitor I can't use because I need an adapter. Did I mention that the universe seems angry at me? In better news I have created something that lets you effectively run startup scripts in tiddlywiki and may go into the tiddlywiki core. Which would be cool.
That wasn't as hard as I expected. Now to make things I can post with.
And I didn't even die. My entire committee commented on how great an idea it was for me to bring coffee and doughnuts for everyone. It may have distracted them from asking too many hard questions. This may have been part of my plan. Or I could have just wanted an excuse to have doughnuts. We may never know. Now that that is done, it may be time to let the stress catch up to me and do nothing but sleep for the next few days. If no one hears from he I probably am just sleeping off the past few months. I am still bothered that it took me so long, I should have done all of this two years ago. The next deadline is in 5 years. If I take 5 years to finish this now I should just give up. It should take about a year of actual work. Maybe less if I am lucky. Or more if people insist on making hardware implementations. We shall see.
I just sent in application materials for a position as a part time math lecturer for undergraduate math classes at the American University in Paris. I am qualified for the job, I hope that the application I sent in properly reflects this. And thanks everyone who helped me put together my application, no matter how small you may think your contribution was I doubt that I would have been able to put together a reasonable application without you. Now that I have that sent off I really should put up my resume website. I was planning on doing that as soon as I had a place to host it and now I do. So I am going to do that now.
* Playing around making an SVG authoring tool ([[see a demo here|http://ooktech.com/jed/ExampleWikis/SnapSVG/]]) * Working on my resume/portfolio site, there should be a link to it soon. * Some webdesign using Drupal and PHP for the American University in Paris * Learning French
This site is a [[TiddlyWiki|http://tiddlywiki.com]], it is made up of things called tiddlers. Think of them as the atomic unit that a ~TiddlyWiki is made out of. Everything here from the menu across the top to the blog posts themselves are tiddlers.
I am Jed Carty, generally online I go by inmysocks. Except on twitter, some guy who never uses it took the name inmysocks before I got to it. This makes me slightly sad. I am sort of working on finishing up my ~PhD in electrical engineering. I do a lot of work in cognitive radio and wireless communications systems in general. I used to live in Albuquerque, New Mexico (located in the southwestern United States), but I currently live in Paris, France. I am in the process of starting my company OokTech. I design and create small scale consumer electronics and communications devices, but recently I have been doing small jobs as a web designer using PHP and Drupal. The things I want to do seem to change from day to day, the only consistent part has been a desire to create a free and open distributed internet. I spend way too much time playing with my various toys including embedded micro controllers and [[TiddlyWiki|http://tiddlywiki.com]]. I also [[draw and stuff|My Gallery - Drawing and Photography]], nothing too amazing but I like doing it. I made all the electronics used in this video ([[youtube link|https://www.youtube.com/watch?v=G9cBpSRT500]]). Sorry I don't think it is anywhere accessible other than on youtube. You can contact me through any of the options listed below, I have a [[linkedin profile|https://www.linkedin.com/pub/jedediah-carty/53/293/7a8]], but as much as I don't like the silo social media sites, I don't like linkedin more so I almost never use it. I am working on a resume/portfolio site but that isn't ready yet. {{Me}}
I can't find a creative commons French-English dictionary. Am I just looking in the wrong place?
As always, this is kind of jumbled and not particularly coherent. I am not really sure what would be the best place to start with this one. So I am going to pick nuclear weapons. A bit over a year ago I was all but offered a job at a national lab. The lab in question did lots of different things, including the theory aspects of advanced wireless communication systems, which is my field. Unfortunately the job wasn't with that part of the lab, the job was engineering support for inductive heating (the lab contacted me, I didn't apply for this job). With the sort of thing they wanted me to work with you can get very high quality metal casts, which is important when you are making detonation systems for nuclear weapons. Which is what I would have been doing if I had taken the job. This job would have put me directly in the manufacturing chain for nuclear weapons. They didn't tell me much during the interview because it is all classified, but there are some things that are easy enough to figure out from context. They didn't tell me what the job was about before the interview, otherwise I probably wouldn't have shown up. I will get back to that probably part in a minute. This job would have come with a lot of benefits. It would pay between 3x and 4x minimum wage for the internship, and as long as I didn't completely fuck up I was told that I would have an all but guaranteed job at the lab after I graduated. And that after my work on this project I would have an easy time switching to one of the other groups, like the non-terrestrial communications group. So I would have been paid, and paid well, to do the sort of research I wanted to do. It would just require me to work on nuclear weapons for a few months first. The interview for this job came right after I had been turned down after interviewing for a few other jobs, all of which would have been with civilian telecom companies who don't do government contracts. I was (and still am) well qualified for all of the jobs I interviewed for, but they all turned me down. So the only job where people seemed to want me was in weapons manufacturing. And since then I have started looking into what government labs are researching in my field. It seems to all be things like active jamming systems and other military applications or things that could/would be used to prevent open communication between people. None of this is surprising, but it is relevant since almost all funding for academic research in the area comes from government contracts. I work on cognitive radio, which is a wireless system that could, without user intervention, determine all of the ways it could connect to a network and pick the best one for whatever application the user wants. So if you wanted a voice connection to someone and you were somewhere where wifi and 3g connectivity were both available it could determine which would be best for your connection. In the future, if things go the way I want them to, we will have a distributed mesh network where the radio would determine what other radios were in range and negotiate with them to find which ones would be willing to act as a relay for your communication, which would be a significantly more complex task than just deciding wifi vs 3g. This is an incomplete description of what cognitive radio is, but no one has come up with a complete description yet and it will do for my purposes here. The government is very interested in cognitive radio because using it you could develop a network that was robust against node failure, so no single node dropping out of the network would disrupt traffic, and if done well you could lose many nodes and still have a functioning network. The network would adapt to changing topologies as nodes move and none of this would require human intervention. This sort of thing makes people who want information superiority during combat situations start drooling. What they like even more is that each node in the network could find any enemy communications and actively work to disrupt them while avoiding similar disruptions to their own network. This could be applied to ground combat or satellite communications or disrupting a country's existing networks. Like I said, the military types really want this sort of thing. But that is only one way that the development could go. Another application is to use similar technology to create a decentralized internet (or internet-like network) where each node is treated equally and there are no central controlling locations. With no central locations any sort of large scale snooping becomes much harder. That is what I want to build, I have both the theory background and I am working on making some prototype hardware now. But this is exactly the sort of thing that would disrupt government surveillance of the sort that the US seems so very enamoured with at the moment. And from what I gather the UK is following suit. As far as I can see I have 3 options, I can work for some private company to improve existing networks and just ignore all of this, I could work for the government on military applications and probably applications that would actively go against what I would like to create or I could just make the things myself. The only one of those options that is acceptable to me is to just start making things. So that is one aspect of why I don't want to finish my degree. Next there is the internet of things and its applications. By itself the internet of things isn't a bad idea. Having everything you own connected so that you can make everything work together, things like having your oven start preheating before you get home when you are planning on baking something. Or smart grid applications that can automatically do load balancing over a large area to reduce energy costs for everyone. Or any number of health monitoring devices built into everything. These things don't sound bad on the surface, and in principle they don't need to be a problem. The problem comes in because the money in these applications comes from large centralized services. So you get things like [[Nest|https://nest.com/]], which [[gives all your data to Google|http://blogs.wsj.com/digits/2014/06/24/nest-to-share-user-information-with-google-for-first-time/]]. This is being used so that instead of just knowing what you do online, Google gets to know what you are doing offline as well when you are in the supposed privacy of your home. But somehow people only think this is a problem when a government does it, a corporation like Google getting all that information isn't considered a problem. This offends me on a very personal level. I started kindergarten when I was 4 and ever since then I have wanted to do pretty much the same thing. What I want has certainly gotten more specific but I am one of what seems like a very small group who is doing what I wanted to do when I was a kid. But there are rather powerful groups working to make all of the things I want to make what I want to help create into a method of mass surveillance instead of using it to create a system that ensures privacy and unrestricted communication. This is not an acceptable situation. Most people I talk to about this don't have any objection to what is happening. Either because they don't understand the implications or because most people truly don't care. Or in some cases because they don't believe that what is happening is possible, despite it starting already. But as I said in [[a previous post|Gutting net neutrality is the subversion of the democratic process]], this isn't just a technology issue, because the way people interact with the internet this is a matter of preserving basic democratic principles. With the attitudes that I have encountered expecting any sort of response from the general public is at best wishful thinking. The only solution I can see is to make a competing system that is good enough for people to want to use. That is not a simple task, but it is possible. I am in a position where I can try, so I am going to. This does all fit into why I don't want to finish my degree, I promise. Almost anywhere that would hire me would either want me to work on military applications of what I studied or work on unrelated projects. The letters after my name may get people to listen to me a bit more, but I have gone through everything where I am supposed to learn, form this point out I would be doing my own research to show that I can survive the hazing instead of learning more. Getting my degree pushes back when I can start doing what I want to do, and the places that would want me more because of the letters after my name are the places that I don't want to work with. So screw that.
I have some reasons why listed [[here|http://inmysocks.tiddlyspot.com/#Why%20TiddlyWiki%3F]]. Surprisingly it wouldn't be classified as a rant.
|Name |<$view field='caption'/> | |Type |<$view field='name_plate_type'/> | |Description |<$view field='description'/> | |URL |<a href={{!!url}} target='_blank'><$view field='url'/></a> |
These change the behavior or appearance of the other parts of the wiki. <<tabs "[tag[Wiki Settings]]">>
This is just to test if I actually fixed the url problem.
http://the-toast.net/2015/03/19/women-men-western-art-history/ 'Keep him looking in that direction and I'll keep signalling for help.' The artists would have had to study the visible indicators of human emotion to develop their skills. I don't think that they are all unintentional.
Today the US got around to taking another step toward the minimum for being a decent society. Yay us.
My writing is terrible. I should work on that.
I hope everyone who's upset helps fix our government. I suggest starting a local pirate party chapter.
I can type résumé correctly now. You needed to know this.
Mat testing to see if any error messages.
Just FYI: No error message from previous posting.<br>(I guess none for this either, when I click "Post Comment".)
Some version names for a library I am using: 'Ankle Biter Deluxe' and 'Intravenous Caffeine Injector'.
Corgis are objectively funny dogs.
Agreed
Agreed
I don't think I can interact with the world right now. At times like this I think that leaning to touch type was a very good idea because talking sure as hell isn't going to happen without lots of effort. I an continually surprised that my hands follow my thoughts. I would very much like to be continue working on my dissertation. I am not sure if I can, I keep losing the thread of what I am doing after a few sentences. I don't think that this will result in readable stuff. In other news the proposed FCC rules that will be voted on in a few weeks will classify all telecom as common carrier. This is kind of awesome in the way that it would prevent many of the ways that the service providers in the US try to fuck people over. Perhaps if this goes through the telecom network in the US will actually improve a bit. Or at least not get worse since the providers will still not be allowed to act as gatekeepers for what information can be sent over the networks. We will find out what the decision is in three weeks. This paper was written by a guy working for Alcatel-Lucent in Murray Hill. I tried to get internships there. They never responded. I don't think I took my medication this morning. I should go get the paper that the dude signed for me and then go home. I don't want to move, there is music here. I may be a little scattered today. <a href="http://www.smbc-comics.com/index.php?db=comics&id=3631"> <img src="http://www.smbc-comics.com/comics/20150204.png" width=100px/> </a>
I added some stuff so now you can click on the <<fa fa-comment-o>> icon in the upper left next to the calendar button and it will open up some stuff so you can leave a comment. I isn't part of the wiki and isn't visible to anyone but me. So it isn't great, but I am seeing if it works. And if anyone uses it. And if anyone reads this stuff. So an experiment all around.
Another drawing that probably doesn't actually explain what is going on. [img [You can only see part of the story - Image]]
A zebra from the Albuquerque zoo. [img [Zebra - Image]]
Zuko wearing his hood like a hat. Zuko was a friends red hawk. [img [Zuko wearing his hat - Black and White - Image]]
A pencil drawing of my friends red hawk wearing his hood as a hat. Digitally colored using GIMP. [img [Zuko wearing his hat - Color - Image]]
A lucky picture of Zuko as he lands. [img [Zuko Wings - Image]]