ulaulaman.github.io/index.html

3312 lines
3.8 MiB
HTML
Raw Normal View History

2020-07-28 12:10:58 +02:00
<!doctype html>
<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->
<!-- saved from url=(0021)https://tiddlywiki.com -->
<html lang="en-GB">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<!--~~ Raw markup for the top of the head section ~~-->
<meta http-equiv="X-UA-Compatible" content="IE=Edge"/>
<meta name="application-name" content="TiddlyWiki" />
<meta name="generator" content="TiddlyWiki" />
<meta name="tiddlywiki-version" content="5.3.1" />
2020-07-28 12:10:58 +02:00
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="mobile-web-app-capable" content="yes"/>
<meta name="format-detection" content="telephone=no" />
<meta name="copyright" content="TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)
Copyright (c) 2004-2007, Jeremy Ruston
Copyright (c) 2007-2023, UnaMesa Association
2020-07-28 12:10:58 +02:00
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." />
<link id="faviconLink" rel="shortcut icon" href="favicon.ico">
<title>Gianluigi Filippelli — un TiddlyWiki di presentazione</title>
2020-07-28 12:10:58 +02:00
<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->
<!--~~ Raw markup ~~-->
</head>
<body class="tc-body">
<!--~~ Raw markup for the top of the body section ~~-->
<!--~~ Static styles ~~-->
<div id="styleArea">
<style data-tiddler-title="$:/boot/boot.css" data-tiddler-type="text/css" type="text/css">/*
Basic styles used before we boot up the parsing engine
*/
/*
Error message and password prompt
*/
.tc-error-form {
font-family: sans-serif;
color: #fff;
z-index: 20000;
position: fixed;
background-color: rgb(255, 75, 75);
border: 8px solid rgb(255, 0, 0);
border-radius: 8px;
width: 50%;
margin-left: 25%;
margin-top: 4em;
padding: 0 2em 1em 2em;
}
.tc-error-form h1 {
text-align: center;
}
.tc-error-prompt {
text-align: center;
color: #000;
}
.tc-error-message {
overflow: auto;
max-height: 40em;
padding-right: 1em;
margin: 1em 0;
white-space: pre-line;
}
.tc-password-wrapper {
font-family: sans-serif;
z-index: 20000;
position: fixed;
text-align: center;
width: 200px;
top: 4em;
left: 50%;
margin-left: -144px; /* - width/2 - paddingHorz/2 - border */
padding: 16px 16px 16px 16px;
border-radius: 8px;
}
.tc-password-wrapper {
color: #000;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
background-color: rgb(197, 235, 183);
border: 8px solid rgb(164, 197, 152);
}
.tc-password-wrapper form {
text-align: left;
}
.tc-password-wrapper h1 {
font-size: 16px;
line-height: 20px;
padding-bottom: 16px;
}
.tc-password-wrapper input {
width: 100%;
}
</style>
</div>
<!--~~ Static content for Google and browsers without JavaScript ~~-->
<noscript>
<div id="splashArea">
<p>This <a class="tc-tiddlylink-external" href="https://tiddlywiki.com" rel="noopener noreferrer" target="_blank">TiddlyWiki</a> contains the following tiddlers:</p><p><ul>
<li>$:/build</li>
2020-08-24 12:49:17 +02:00
<li>$:/config/KookmaPluginLibrary</li>
2021-10-23 16:35:28 +02:00
<li>$:/config/Manager/System</li>
2020-07-28 21:29:27 +02:00
<li>$:/config/RelinkOnRename</li>
2020-08-15 16:57:45 +02:00
<li>$:/config/SideBar/Visibility/$:/core/ui/SideBar/More</li>
<li>$:/config/SideBar/Visibility/$:/core/ui/SideBar/Open</li>
<li>$:/config/SideBar/Visibility/$:/core/ui/SideBar/Recent</li>
<li>$:/config/SideBar/Visibility/$:/core/ui/SideBar/Tools</li>
<li>$:/config/SideBar/Visibility/Menu</li>
2021-10-23 15:52:28 +02:00
<li>$:/config/SideBar/Visibility/ulaulaman</li>
2020-09-06 00:24:57 +02:00
<li>$:/config/Whitespace/search</li>
2020-07-28 21:29:27 +02:00
<li>$:/config/Whitespace/sidebar</li>
2020-07-28 12:10:58 +02:00
<li>$:/core</li>
<li>$:/core/macros/ulaulaman/TagTable</li>
<li>$:/core/Stylesheet/blue-table</li>
2020-08-15 19:27:23 +02:00
<li>$:/custom-svg-style</li>
<li>$:/custom-tag-styles</li>
2020-07-28 12:10:58 +02:00
<li>$:/DefaultTiddlers</li>
2020-08-15 12:24:38 +02:00
<li>$:/favicon.ico</li>
2020-07-28 12:28:49 +02:00
<li>$:/Import</li>
2020-07-28 12:10:58 +02:00
<li>$:/isEncrypted</li>
<li>$:/macros/ulaulaman/TagTable.js</li>
2020-08-24 13:00:27 +02:00
<li>$:/plugins/kookma/pinboard</li>
<li>$:/plugins/kookma/shiraz</li>
2020-07-28 12:28:49 +02:00
<li>$:/plugins/tiddlywiki/katex</li>
<li>$:/plugins/tiddlywiki/markdown</li>
2020-07-28 21:29:27 +02:00
<li>$:/SiteSubtitle</li>
<li>$:/SiteTitle</li>
<li>$:/state/http-requests</li>
2021-10-23 15:52:28 +02:00
<li>$:/state/tab-1593268138</li>
2021-10-23 15:52:28 +02:00
2020-07-28 12:10:58 +02:00
<li>$:/status/RequireReloadDueToPluginChange</li>
2020-07-28 21:29:27 +02:00
<li>$:/status/UserName</li>
2020-07-28 12:10:58 +02:00
<li>$:/StoryList</li>
2020-07-28 21:29:27 +02:00
<li>$:/theme</li>
<li>$:/themes/jd/Whitespace</li>
2020-07-28 12:10:58 +02:00
<li>$:/themes/tiddlywiki/snowwhite</li>
<li>$:/themes/tiddlywiki/vanilla</li>
<li>$:/view</li>
<li>Articoli per Lo Spazio Bianco</li>
2020-08-29 19:10:53 +02:00
<li>Astronomy</li>
<li>Blog</li>
2020-08-15 12:24:38 +02:00
<li>BookTemplate</li>
<li>CitationsTools</li>
<li>CoAuthorsWidget</li>
<li>code</li>
<li>ebook</li>
2020-07-28 21:29:27 +02:00
<li>EduINAF</li>
<li>EduINAFAjaxFilter</li>
2020-07-28 12:10:58 +02:00
2020-08-24 13:00:27 +02:00
<li>EduINAFChangelog</li>
2021-10-08 17:05:42 +02:00
<li>EduINAFChangelog2018</li>
<li>EduINAFChangelog2020</li>
<li>EduINAFChangelogPre</li>
2020-08-24 13:00:27 +02:00
<li>EduINAFDescrizione</li>
<li>English</li>
2020-07-28 12:10:58 +02:00
<li>GettingStarted</li>
<li>Gianluigi Filippelli</li>
<li>GitHubRepository</li>
2020-08-29 19:10:53 +02:00
<li>Graphics</li>
<li>How to show macros code</li>
<li>icon style</li>
2020-08-29 19:10:53 +02:00
<li>Infographics</li>
<li>Italiano</li>
<li>Lavoro</li>
<li>Macros</li>
2020-08-29 19:10:53 +02:00
<li>Mathematics</li>
2020-07-28 21:29:27 +02:00
<li>Menu</li>
2020-08-29 19:10:53 +02:00
<li>Physics</li>
<li>png icons</li>
<li>Presentazioni</li>
2020-08-15 16:57:45 +02:00
<li>svg</li>
<li>svgStylesheet</li>
2020-08-01 00:59:56 +02:00
<li>Table-of-Contents Macros</li>
<li>TagTable</li>
<li>TikzDraw</li>
<li>twitter.svg</li>
<li>twitterFollowButton</li>
<li>twitterFollowButtonExample</li>
2020-07-28 21:29:27 +02:00
<li>ulaulaman</li>
<li>WordpressPlugin</li>
2020-08-15 12:24:38 +02:00
2020-07-28 12:10:58 +02:00
</ul>
</p>
<style>
.tc-remove-when-wiki-loaded {display: none;}
</style>
</div>
</noscript>
<!--~~ Ordinary tiddlers ~~-->
<script class="tiddlywiki-tiddler-store" type="application/json">[
{"title":"$:/build","commit":"81b4e99ccc3c2ca3c3f960b25c4463f60e79c268","text":"Built from branch 'tiddlywiki-com' at commit 81b4e99ccc3c2ca3c3f960b25c4463f60e79c268 of https://github.com/Jermolene/TiddlyWiki5 at 2021-10-22 13:36:56 UTC\n"},
{"title":"$:/config/KookmaPluginLibrary","type":"text/vnd.tiddlywiki","text":"Kookma plugin library is a set of plugins developed by [[Mohammad|https://github.com/kookma]]. A good recommendation is to backup your data before installing any plugins. These plugins distributed under MIT license.\n\nTo use in other wikis, drag and drop this link to those wikis: [[Kookma Plugin Library|$:/config/KookmaPluginLibrary]]","bag":"default","caption":"Kookma Plugin Library","created":"20200306121057751","modified":"20200307172402266","revision":"0","tags":"$:/tags/PluginLibrary","url":"https://kookma.github.io/TW-PluginLibrary/library/index.html"},
2021-10-23 16:35:28 +02:00
{"created":"20211023143205987","creator":"ulaulaman","text":"","title":"$:/config/Manager/System","modified":"20211023143205987","modifier":"ulaulaman"},
{"title":"$:/config/RelinkOnRename","text":"yes","created":"20200728124027100","modified":"20200728124027100"},
2021-10-23 16:35:28 +02:00
{"created":"20200815145448342","creator":"ulaulaman","title":"$:/config/SideBar/Visibility/$:/core/ui/SideBar/More","text":"hide","modified":"20211023135144939","modifier":"ulaulaman"},
{"created":"20200815145323767","creator":"ulaulaman","title":"$:/config/SideBar/Visibility/$:/core/ui/SideBar/Open","text":"hide","modified":"20231019152158896","modifier":"ulaulaman"},
2023-10-26 14:12:56 +02:00
{"created":"20200815145444032","creator":"ulaulaman","title":"$:/config/SideBar/Visibility/$:/core/ui/SideBar/Recent","text":"hide","modified":"20231026121200096","modifier":"ulaulaman"},
2021-10-23 16:35:28 +02:00
{"created":"20200815145446088","creator":"ulaulaman","title":"$:/config/SideBar/Visibility/$:/core/ui/SideBar/Tools","text":"hide","modified":"20211023143223983","modifier":"ulaulaman"},
{"title":"$:/config/SideBar/Visibility/Menu","text":"show","created":"20200815145319810","creator":"ulaulaman","modified":"20200815145609325","modifier":"ulaulaman"},
2021-10-23 15:52:28 +02:00
{"created":"20211023134717060","creator":"ulaulaman","title":"$:/config/SideBar/Visibility/ulaulaman","text":"show","modified":"20211023134718236","modifier":"ulaulaman"},
2021-10-26 01:12:48 +02:00
{"created":"20200904194810599","creator":"ulaulaman","title":"$:/config/Whitespace/search","text":"no","modified":"20211025230930077","modifier":"ulaulaman"},
{"title":"$:/config/Whitespace/sidebar","text":"left","created":"20200728190149332","creator":"ulaulaman","modified":"20200728190152217","modifier":"ulaulaman"},
{"title":"$:/core","name":"Core","description":"TiddlyWiki5 core","author":"JeremyRuston","core-version":">=5.0.0","plugin-priority":"0","list":"readme","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/Acknowledgements\":{\"title\":\"$:/Acknowledgements\",\"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|https://jasmine.github.io/]]\\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 (c) 2004-2007, Jeremy Ruston\\nCopyright (c) 2007-2023, UnaMesa Association\\nAll rights reserved.\\n\\nRedistribution and use in source and binary forms, with or without\\nmodification, are permitted provided that the following conditions are met:\\n\\n* Redistributions of source code must retain the above copyright notice, this\\n list of conditions and the following disclaimer.\\n\\n* Redistributions in binary form must reproduce the above copyright notice,\\n this list of conditions and the following disclaimer in the documentation\\n and/or other materials provided with the distribution.\\n\\n* Neither the name of the copyright holder nor the names of its\\n contributors may be used to endorse or promote products derived from\\n this software without specific prior written permission.\\n\\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\"},\"$:/core/icon\":{\"title\":\"$:/core/icon\",\"tags\":\"$:/tags/Image\",\"text\":\"\\\\parameters (size:\\\"22pt\\\")\\n\u003Csvg width=\u003C\u003Csize>> height=\u003C\u003Csize>> viewBox=\\\"0 0 128 128\\\">\u003Cpath 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 1
{"title":"$:/core/macros/ulaulaman/TagTable","text":"\\define TagTable(tag)\n\u003Cdiv class=\"divTable blueTable\">\u003Cdiv class=\"divTableHeading\">\u003Cdiv class=\"divTableRow\">\u003C$list filter=\"[tag[$tag$]sort[title]]\">\u003Cdiv class=\"divTableHead\"> \u003C\u003CcurrentTiddler>> \u003C/div>\u003C/$list>\u003Cdiv class=\"divTableRow\">\u003C/div>\u003C/div>\n\\end\n\n\u003C$macrocall $name=\"TagTable\" tag={{!!title}}/>","created":"20200816130933001","creator":"ulaulaman","modified":"20200816150238870","modifier":"ulaulaman","tags":"Macros"},
{"title":"$:/core/Stylesheet/blue-table","type":"text/css","text":"div.blueTable {\n border: 1px solid #1C6EA4;\n background-color: #EEEEEE;\n width: 100%;\n text-align: left;\n border-collapse: collapse;\n}\n.divTable.blueTable .divTableCell, .divTable.blueTable .divTableHead {\n border: 1px solid #AAAAAA;\n padding: 3px 2px;\n}\n.divTable.blueTable .divTableBody .divTableCell {\n font-size: 13px;\n}\n.divTable.blueTable .divTableRow:nth-child(even) {\n background: #D0E4F5;\n}\n.divTable.blueTable .divTableHeading {\n background: #1C6EA4;\n background: -moz-linear-gradient(top, #5592bb 0%, #327cad 66%, #1C6EA4 100%);\n background: -webkit-linear-gradient(top, #5592bb 0%, #327cad 66%, #1C6EA4 100%);\n background: linear-gradient(to bottom, #5592bb 0%, #327cad 66%, #1C6EA4 100%);\n border-bottom: 2px solid #444444;\n}\n.divTable.blueTable .divTableHeading .divTableHead {\n font-size: 15px;\n font-weight: bold;\n color: #FFFFFF;\n border-left: 2px solid #D0E4F5;\n}\n.divTable.blueTable .divTableHeading .divTableHead:first-child {\n border-left: none;\n}\n\n.blueTable .tableFootStyle {\n font-size: 14px;\n}\n.blueTable .tableFootStyle .links {\n\t text-align: right;\n}\n.blueTable .tableFootStyle .links a{\n display: inline-block;\n background: #1C6EA4;\n color: #FFFFFF;\n padding: 2px 8px;\n border-radius: 5px;\n}\n.blueTable.outerTableFooter {\n border-top: none;\n}\n.blueTable.outerTableFooter .tableFootStyle {\n padding: 3px 5px; \n}\n\ndiv.blueTable a:link {\ncolor: white;\n}\n\ndiv.blueTable a:visited {\ncolor: white;\n}\n\n/* DivTable.com */\n.divTable{ display: table; }\n.divTableRow { display: table-row; }\n.divTableHeading { display: table-header-group;}\n.divTableCell, .divTableHead { display: table-cell;}\n.divTableHeading { display: table-header-group;}\n.divTableFoot { display: table-footer-group;}\n.divTableBody { display: table-row-group;}","created":"20200816145229864","creator":"ulaulaman","modified":"20200816150449932","modifier":"ulaulaman","tags":"$:/tags/Stylesheet template"},
{"title":"$:/custom-svg-style","type":"text/vnd.tiddlywiki","text":"[data-tags*=\"svg\"] .svg-icon {\n width: 100%;\n height: 100%;\n}\n\n[data-tags*=\"svg\"] .svg-icon path,\n.svg-icon polygon,\n.svg-icon rect {\n fill: #4691f6;\n}\n\n[data-tags*=\"svg\"] .svg-icon circle {\n stroke: #4691f6;\n stroke-width: 1;\n}\n\n[data-tags*=\"data-tags-styles\"] .tc-tiddler-body {\n display: block;\n padding: 14px;\n margin-top: 1em;\n margin-bottom: 1em;\n word-break: normal;\n word-wrap: break-word;\n white-space: pre-wrap;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n padding: 0 3px 2px;\n border-radius: 3px;\n font-family: Monaco, Consolas, \"Lucida Console\", \"DejaVu Sans Mono\", monospace;\n}","created":"20200815170308495","creator":"ulaulaman","modified":"20200815172437025","modifier":"ulaulaman","tags":"template $:/tags/Stylesheet data-tags-styles"},
{"title":"$:/custom-tag-styles","type":"text/vnd.tiddlywiki","text":"[data-tags*=\"$:/tags/Stylesheet\"] {\n border: 1px solid blue;\n}\n\n[data-tags*=\"Macros\"] {\n border: 1px solid red;\n}\n\n[data-tags*=\"javascript\"] {\n border: 1px solid black;\n}\n","created":"20200815171528811","creator":"ulaulaman","modified":"20200816151049213","modifier":"ulaulaman","tags":"template $:/tags/Stylesheet data-tags-styles"},
{"title":"$:/DefaultTiddlers","text":"[[Gianluigi Filippelli]]","created":"20200728100500119","creator":"ulaulaman","modified":"20200817000104620","modifier":"ulaulaman"},
{"title":"$:/favicon.ico","type":"image/png","text":"iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAgAElEQVR4nNS9+VeUaZrn3X/T/Dx9zvR09+merpypmqrpKiszq9NKTXdFRTNNJUUExQVFFEGQPdj3JdghIgiCNfaNCGIPYiOAOEAEO+pnfnj7vg/m6Zl531PdPfV6Th5ThDCeeK77Wr7L9fwFf8a/Pn36xMePH/nw4YP879OnT3z69Inj42MODw85Pj6WXxe/A/Lrh4eH8vuMRiMGg4HNzU35+sfHxxwcHHB0dMTR0RH7+/ukUilCoRBWq5XZ2VlCoRDpdBq3283U1BSpVIpPnz5xeHjIzs4ORqOR0tJS9Ho9yWSS2dlZJiYmmJqaYn5+ntbWVkZHR5mbm2NsbIz+/n5aW1uprKxkfHychYUFUqkU+/v7HBwcMDQ0RCwW4/DwkMHBQTweD4uLiwwODhKPx9nb20Ov17O0tIRer8fhcGCz2Ugmk0QiEUwmE4lEgg8fPrC7u0tvby8qlQq/38/s7CwbGxvs7e1ht9vZ2trC5XLR3t6OUqkkFothsVjY3Nzk8PCQmZkZhoeHicfjTE5O0tLSQjKZ5Pj4mI8fP7K7u0t/fz+dnZ1MT0/j9/uxWq38xf/NwPk//RJBIoLmZBB9/PiRjx8/fvb/R0dHnwXZ4eEhR0dHfPz4ka2tLUKhEIFAgIODA/n9nz594uDggP39fTweD263m5WVFZLJpLyB0WgUn89HY2Mj09PTpNNpGYzpdJqRkRFGRkbo6upiaGgIt9tNOp0mmUwyNjaGx+Nha2uLRCJBMpmkt7eXrq4uDAYDr1+/ZmRkhO3tbQ4PDzk4OGBtbY2+vj7C4TAqlQqdTkcoFCIWi5HJZAiFQqysrGAwGPD5fGxsbBAMBonFYqTTabRaLXq9nvX1dQ4ODojH41RVVWEwGIhGo+zv72O1WolGo7jdbux2O06nk6mpKebm5nC73aRSKQ4ODnA6nYRCIVKpFEqlEqvVSjqdlgcyEAhgtVppbGykra2NaDSKRqP58w4sgA8fPnyWtUSW+fDhAwAfP37k+PhYXuje3p4MFBFYBwcH2Gw2FhcXWV9f5/DwUAbjwcEBiUSCpaUlotEodrudpaUlvF4v4XAYpVKJw+FgYWGBqqoqrFYrfr8ft9vN2toaRqMRo9GIzWajr6+PtrY2/H4/Ozs7HB4eMj4+Lm/wx48fsVqt8jXb29tpaGhgenoaq9XK1tYWx8fHHB0d4XA40Gg02Gw2xsfHMRgMrK2tcXBwgM/nQ6/Xo9FoWF1d5ePHj2xvb+NyuUgkEqyurjI1NUU4HGZhYYFoNMrExAQqlYpEIkEoFCIYDGI0GllcXCQej3N4eMja2hpms5lQKITH42FjY4Pt7W1WV1dRqVRoNBqZSY+Pj4lEIlgsFpxOJ2azmebmZmpqanj37t2fd2CdzEYiuE6WwI8fP8pTHo/HCQQCBAIBgsEgXq8Xv99PKBQimUzicDhYXl5mb2/vs58NhUKEQiHcbjder5e1tTU2NzfJZDIkk0mcTifr6+uEw2H0ej2BQACLxYLFYsFgMFBXV4fL5cJoNLKyssLKygpGoxG/38/6+jpDQ0PE43EZ/C6Xi5WVFba3txkZGcFms6HX63E6nSwvL7O1tSWvqbe3l8XFRRYXF6mtrcXv9xMIBFheXmZubo5wOMz+/j6fPn1if3+feDzO0NCQDAydTofD4WBqaorJyUnKy8sJBoNEo1H0ej39/f2EQiF5CDKZDIuLi2i1WoxGI1tbW+zv76NUKikoKMDj8bCyskIqlSIej+NwOIhGo6RSKebn5ykrK6O4uBiz2fznHVjAZ4F1MjsdHx/L8uZ2u0kmk2xsbLC5uUk6nSadTrOzs8PGxgZutxu1Wo1erycSibC3t8f+/j7r6+tEIhFZ+lZXVzk6OpKvv7e3x9bWFru7u8zPzxOJRNja2iKdTrO+vk5rays9PT00NDQwMzPD9vY2+/v7JJNJfD4fTqcTjUZDIpHg+PiYRCLB4uIia2trzM/Ps7y8zOHhIclkkoWFBQKBgCxt+/v7jI6O0traislkYnl5GZfLhcFgQKPR4HK52N3dlRlcZPFAIMDU1BSRSITGxkampqbweDz4/X46OzsZHh7G6XTS3d2Nw+Fgf39fXrPIWiaTiUgkQiwWIxaL0dXVhU6nI5lMyuzs9XpZXV0lGo3S2trK0NAQZrOZmpqa/38Elrho0U8dHx+zv79PIBDA7/ezurrK5uYme3t77O7usr+/L8vi/v4+mUwGu93O2NiYzEgejwen04nNZmN5eZlkMsn29rYsQ6KJFkEVDofp6ekhEAiws7PDwcEBOzs79Pf3MzExgVKpxOl0srS0RDqd5ujoiFQqhdPpZGFhQZbCubk5NBoN8Xic8fFx/H6/vLHpdBqTyYTdbmd+fp5UKoXP56O/v5/S0lKCwSAWi4WlpSW0Wi2hUIjd3V0+fPjA/v4+Hz58kNl4aWmJUCiE2Wymurqa4eFhGRQ9PT3U19djsVhktjvZjx4dHWE0GpmenmZ8fJyenh7sdjuZTIZUKoVarWZmZoZkMonX62VwcBCj0UgymWR/f59IJMLQ0NCff2CdzFQHBwccHBwQiURIpVJkMhk59fl8PlwuFz6fj0gkQjQaZWVlhWAwSGdnJyqVSv59LBbDZDKh0WjQarXyQzk4OGB3d5dYLIbBYKCvr4/p6WlsNhvv37+nra2NqakpZmdnGR0dxWg0Mjk5KTONKI+pVIrj42PMZjN6vZ54PM729jbz8/OEw2Hi8TjRaJTd3V15bSJbWK1WzGYzCwsLbG1tyd7FbrczMjJCRUUFZrNZZlufz4ff7/9sqkylUlRUVGA0GhkYGECv17O5uUkgEODFixeMjIzIfu3w8FD+nBhkxHvt7u6WB8NsNtPV1cXk5CTBYJBgMCizn7iOT58+sbe3x+Dg4J9XYIkp8OSfP3z4IC96f38fn8/H2toa+/v77O/vEwwG5Qe7ubnJ9vY26XSa3d1ddnZ22NzcZGZmhkgkws7ODtvb23i9XsbGxhgYGMDlchEIBPB4PASDQebm5tBqtdhsNtxuN9FolEQiwdTUFEtLS0QiETweDy9evKC2tpbZ2VlWV1fZ3t4mlUphs9kwm81sb2+zuLiI1+vFZrPJYE4kEgwODhKLxTg+PpZZVgwe6+vraLVaqqqq8Pl8bG9vE41G6e/vZ35+noaGBpntxL+bTCbx+/04nU7ZCqhUKlmqlUolOp0Oo9HIy5cv6erqQq1WMzAwwNzcnAxK0bseHR2hUqlQKBTMzc2xtrbG0NAQ7969w+Fw4HK5mJ2dJRgMcnBwICuKOPzz8/N/XoH1837qZPk7ODggFosRj8fZ2dnh+PgYn89HPB6XTaY4+Xt7e+zt7cmyFovF2NnZkROix+ORo7bRaMTlchEMBmltbUWhUOD3+yVcILCqxcVFEokEBwcHZDIZBgYGePPmDSMjIyiVSgkxZDIZ2RN1dXWRTCZZW1tDqVSiVCqJRCLy1AcCATQaDSqVCq1Wi1arZXl5mWg0Snl5OQ8fPmRwcJCtrS2GhoaoqKigra2N/v5+FhYWmJ+fZ3JyEp1Oh8ViYWVlBafTic/nY3Nzk5qaGtRqNX19fRgMBkpKSnjw4AGlpaXYbDYSiQQmk4mOjg5GR0fZ2NiQ5VCpVFJdXU13d7ccFhYWFnA6nbS2tuJ2uz/D/05ijul0+s8jsAToKaCFn0+B4s263W42Nzc5ODiQN0Ckc4FLra+vy0nP7/djNpvRaDS43W58Ph8+n4/R0VF0Oh2JRIKdnR3W19fp6uqiuroas9mM3+9nc3OT5eVlMpkMm5ubslkWY3Y8HsftdpNIJPD7/XJ6SyQSpFIp/H4/5eXlBAIBdnd3mZiYoKWlhaWlJYLBIJOTk0xPTzM7O4vRaESv12MymRgfH6e3t5eBgQEeP37Mo0ePMJvNTE9P8/z5c9ra2mhtbUWj0eD1ekkmk6ysrGC1WpmamkKn06FUKhkZGaGvr4/FxUWam5u5c+eO7K2qqqpYXl7mw4cPbG
{"title":"$:/Import","text":"The following tiddlers were imported:\n\n# [[$:/build]]\n# [[$:/config/KookmaPluginLibrary]]\n# [[$:/config/Manager/System]]\n# [[$:/config/RelinkOnRename]]\n# [[$:/config/SideBar/Visibility/$:/core/ui/SideBar/More]]\n# [[$:/config/SideBar/Visibility/$:/core/ui/SideBar/Open]]\n# [[$:/config/SideBar/Visibility/$:/core/ui/SideBar/Recent]]\n# [[$:/config/SideBar/Visibility/$:/core/ui/SideBar/Tools]]\n# [[$:/config/SideBar/Visibility/Menu]]\n# [[$:/config/SideBar/Visibility/ulaulaman]]\n# [[$:/config/Whitespace/search]]\n# [[$:/config/Whitespace/sidebar]]\n# [[$:/core/macros/ulaulaman/TagTable]]\n# [[$:/core/Stylesheet/blue-table]]\n# [[$:/custom-svg-style]]\n# [[$:/custom-tag-styles]]\n# [[$:/DefaultTiddlers]]\n# [[$:/favicon.ico]]\n# [[$:/isEncrypted]]\n# [[$:/macros/ulaulaman/TagTable.js]]\n# [[$:/plugins/kookma/pinboard]]\n# [[$:/plugins/kookma/shiraz]]\n# [[$:/plugins/tiddlywiki/katex]]\n# [[$:/plugins/tiddlywiki/markdown]]\n# [[$:/SiteSubtitle]]\n# [[$:/SiteTitle]]\n# [[$:/status/RequireReloadDueToPluginChange]]\n# [[$:/status/UserName]]\n# [[$:/theme]]\n# [[$:/themes/jd/Whitespace]]\n# [[$:/themes/tiddlywiki/snowwhite]]\n# [[$:/themes/tiddlywiki/vanilla]]\n# [[$:/view]]\n# [[Articoli per Lo Spazio Bianco]]\n# [[Astronomy]]\n# [[Blog]]\n# [[BookTemplate]]\n# [[CitationsTools]]\n# [[CoAuthorsWidget]]\n# [[code]]\n# [[ebook]]\n# [[EduINAF]]\n# [[EduINAFAjaxFilter]]\n# [[EduINAFChangelog]]\n# [[EduINAFChangelog2018]]\n# [[EduINAFChangelog2020]]\n# [[EduINAFChangelogPre]]\n# [[EduINAFDescrizione]]\n# [[English]]\n# [[GettingStarted]]\n# [[Gianluigi Filippelli]]\n# [[GitHubRepository]]\n# [[Graphics]]\n# [[How to show macros code]]\n# [[icon style]]\n# [[Infographics]]\n# [[Italiano]]\n# [[Lavoro]]\n# [[Macros]]\n# [[Mathematics]]\n# [[Menu]]\n# [[Physics]]\n# [[png icons]]\n# [[Presentazioni]]\n# [[svg]]\n# [[svgStylesheet]]\n# [[Table-of-Contents Macros]]\n# [[TagTable]]\n# [[TikzDraw]]\n# [[twitter.svg]]\n# [[twitterFollowButton]]\n# [[twitterFollowButtonExample]]\n# [[ulaulaman]]\n# [[WordpressPlugin]]","status":"complete"},
{"title":"$:/isEncrypted","text":"no"},
{"title":"$:/macros/ulaulaman/TagTable.js","type":"application/javascript","text":"/*\\\ntitle: $:/macros/ulaulaman/TagTable.js\ntype: application/javascript\nmodule-type: macro\n\n\u003C\u003CTagTable tag>>\n\nExample:\n\u003C\u003CTagTable>>\n\u003C\u003CTagTable \"tag\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\nCreate a styled table in order to show tiddlers from a specific tag as a menu.\n*/\n\nexports.name = \"TagTable\";\n\nexports.params = [\n\t{ name: \"tag\" }\n];\n\n/*\nRun the macro\n*/\nexports.run = function(tag) {\n\tif( !tag) tag = \"menu\";\n\tvar output = \"{{\" + tag + \"||$:/core/macros/ulaulaman/TagTable}}\";\n\treturn output;\n};\n\n})();","created":"20200816102454592","creator":"ulaulaman","modified":"20200816133351372","modifier":"ulaulaman","module-type":"macro","tags":"javascript"},
{"title":"$:/plugins/kookma/pinboard","type":"application/json","text":"{\n \"tiddlers\": {\n \"$:/plugins/kookma/pinboard/history\": {\n \"title\": \"$:/plugins/kookma/pinboard/history\",\n \"created\": \"20191113142629999\",\n \"modified\": \"20191121201438297\",\n \"tags\": \"\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"!! Release 0.9.0\\n* Date: 2019.11.21\\n* [FIXED] Minor issues in corkboard tiddler name\\n\\n!! Release 0.8.0\\n* Date: 2019.11.18\\n* improved documentation\\n* cleanup css and classes\\n* more examples\\n* [NEW] settings tab\\n\\n!! Release 0.5.0\\n* Date: 2019.11.14\\n* sticky notes renamed into Pinbaord\\n* flexgrid removed\\n* pin can be toggled to remove the note (make it done)\\n* folding edditor is added\\n\\n!! Release 0.1.0\\n* Date: 2019.11.13\\n* proof of concept\\n\"\n },\n \"$:/plugins/kookma/pinboard/images/cork.jpg\": {\n \"title\": \"$:/plugins/kookma/pinboard/images/cork.jpg\",\n \"created\": \"20191114144911706\",\n \"modified\": \"20191115045110946\",\n \"type\": \"image/jpeg\",\n \"text\": \"/9j/4AAQSkZJRgABAQEAkACQAAD/4QBYRXhpZgAATU0AKgAAAAgABAExAAIAAAARAAAAPlEQAAEAAAABAQAAAFERAAQAAAABAAABuVESAAQAAAABAAABuQAAAAB3d3cuaW5rc2NhcGUub3JnAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAGQAZADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD13T7/AFLxT8P7/TbW6ksb6GQzxXdxDErTeYJI5IxwP3YLBlxySpBHIzvv4Xkg0nTbyO+t1sY9sRur0+YtxKzIpdtuSAqoGIAAY4wV4AseKZV0LwPPbSWdvarCsbq9sjxyIf8AVFFDNvKozRsc5BGfvCsnxNq+qXWlafIdqaXcXAuLiQhpB5Ea7Cr9NrApEVKnHGD8rHH4Qftm5ta58Pbrw3cWskMirPG6XdpcW1s0hgiOVLgY3RhlLIG7KRnGTmWy8V2NjrMzalZtJbyWlve25mG6RY3VotzK2NpADqduX2t3HA1rm71TS9PtZW8QJHJGjzJbsoDO6wuhi2sS2ApVxggFl4OWqhqUUfinwZpLXMK6tMsiNFJFKFhuGAZypUc4UjAJ4JPUVO+4J33M2+1S8sdQt9PtYdNtWNo05uATLcWweWLztvOSXYINwyAWPfIqh4xs5NX8R2y2t5bWunWiGBQLRfLhYkuJnKgBiXJwxAOfX5cz+FrdtI1u3njeOeSOaOOGaeIKLePymKrFIrKhcsm/I4JI4JxVH/hENN8XeNtWheSaLVlsVnjkhjZigWVQ24ldpXcy8ZxkBjnBFMo1vHGpXmp+Pw2n3K2raj5Kz+XE0cxuArqGUFTncRtZegXLfKCam1r4eWtl4t1a3tLidtU1A/Y5VYFEutwyI1k2joZCvBLEhhkbRjcha01/T7qzsYp9P1vRYXkFzJmRZ4iGZcsQcS79ox93Hfjjix4p0WXxFDa6hBeW8ziGdrhpS4kudu4AgkbXUMDuOC5GcnGQlfYlX6HSf2zfad4YjvNPsp9Xt4bYwvNPchfMUgwk4Zvm2AAkMDwwIGcYsG0kebTbq10vUFlm+0vcTKUK3KIrK5gCkBAu9WBzgY6ZOQ159Q+H9nZWupL/AGnqkm/UktLh3t7TypN4BDklNwi2sxY9WzwSpOXL4uuE8Sw6hbw/6DpsTNcSK5kaFPLIKBiDkE46Y6A8CkG+pX1jU9W8OfFKxg8QW9r/AGHd2sQd42bfI28EMoGV3B1UZHzDcByKdr3hK38T6joWbyRNNiX7RPCJTLHO5EwjOzcuc7ANrA7Tk5zkVDb3P/CXaTZzCNfEHiCG7R3jkbEtuHaSRjtCj5SgUjAxuIyCRkaVtY3SaeL+6t0kbTNTk063iiKs91CrJh1zgs4IYnPGQ3UGmM0m8Qw6dNcW8c1tr2lywIkFsg3Ri4bzBKjFhh18sIwYNgb+NuOcHwLplkngW8na6k/eaoq6hZT35mXTnkAUREf3BtzggL97OTyaOn69Y6C91JFqMMdh5s07DzN8dvKrbQjsU2qWJKoMA7hj3F3QvCNvqkcsFu0en332sTyyRMokmjV8yBtq88SkKBg4wBjklgYlx4rh0zU/D7QxyQ6Xpd0XgdA0y3DK/wB1duRsZnIByBgnrgV03j/wla+MtMQRyXOkx/ZALe7iVre3tJFjPBYMP42zjoysRxnIhPgeHRNKazuftMNmxEEctrjEaxyAiTy42LLyUULyGKkcjOcxvG+sSap4k0WfQprrS7ux823umtwwGB86SlHYnLAMoCZHI4yDR6D9Bnhbwvr2k/CKC11y3XWdaTUGkjMFvHboLd/LJUMh+6uOMf3/AGIrpvh94bmt5vPumttRvGtmaSSVHSKSJFULsHOWAMIHzchnwD1pEMmm6dpDXENpZ3UxaG5b7VGhg8vYY/3Q+QpnacEDkH5hznlGul8SfEy4vLWTWbNNJBjnv4wiwgAKJjkjocjKDgBc5OaNw3Ot1Owt9Mgjk85pEmk+0eTLGsLx7RshVkLFgp4GQOOCAScHJ+JOj3Wo+D7MX0H2O3t280lJvKBw+1AeSWGCCF5BzncOzNVDaG2pX2kxTWcepBpTqLJHujUKiszy9WZI4416qFwCAATV7UrGz06aP7TevqN3cIqQi2l81YbkchMY
{"title":"$:/plugins/kookma/shiraz","type":"application/json","text":"{\n \"tiddlers\": {\n \"$:/plugins/kookma/shiraz/history\": {\n \"title\": \"$:/plugins/kookma/shiraz/history\",\n \"created\": \"20200323092614036\",\n \"modified\": \"20200325085725882\",\n \"tags\": \"\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"Full change log: [[https://kookma.github.io/TW-Shiraz/#ChangeLog]]\\n\\n* ''2.1.1'' -- 2020.03.25 -- slider macro with initial status\\n* ''2.1.0'' -- 2020.03.23 -- stable release on TW-5.1.22pre\\n* ''1.0.0'' -- 2018.10.05 -- first public release\\n\"\n },\n \"$:/plugins/kookma/shiraz/license\": {\n \"title\": \"$:/plugins/kookma/shiraz/license\",\n \"created\": \"20200323092614037\",\n \"modified\": \"20200323092631048\",\n \"tags\": \"\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"Distributed under an MIT license.\\n\\nCopyright (c) 2018-2020 [[Mohammad Rahmani|https://github.com/kookma]]\\n\\n\u003C\u003C\u003C\\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \\\"Software\\\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\\n\\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\\n\u003C\u003C\u003C\"\n },\n \"$:/plugins/kookma/shiraz/macros/alerts\": {\n \"title\": \"$:/plugins/kookma/shiraz/macros/alerts\",\n \"created\": \"20180821095049685\",\n \"modified\": \"20200323093719256\",\n \"tags\": \"$:/tags/Macro\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\\\\define alert(type:\\\"primary\\\" src:\\\"\\\", width:\\\"100%\\\", class:\\\"\\\")\\n\u003Cdiv class=\\\"alert alert-$type$ $class$\\\" style=\\\"width:$width$;\\\">\\n$src$\\n\u003C/div>\\n\\\\end\\n\\n\\\\define alert-leftbar(type:\\\"primary\\\" src:\\\"\\\", width:\\\"100%\\\", class:\\\"\\\")\\n\u003Cdiv class=\\\"alert alert-$type$ bg-transparent leftbar border-$type$ $class$\\\" style=\\\"width:$width$;\\\">\\n$src$\\n\u003C/div>\\n\\\\end\\n\"\n },\n \"$:/plugins/kookma/shiraz/macros/badge\": {\n \"title\": \"$:/plugins/kookma/shiraz/macros/badge\",\n \"created\": \"20181124042103310\",\n \"modified\": \"20200323093719649\",\n \"tags\": \"$:/tags/Macro\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\\\\define badge(type:\\\"primary\\\" src:\\\"\\\")\\n\u003Cspan class=\\\"badge badge-$type$\\\">$src$\u003C/span>\\n\\\\end\\n\\n\\\\define badge-pill(type:\\\"primary\\\" src:\\\"\\\")\\n\u003Cspan class=\\\"badge badge-pill badge-$type$\\\">$src$\u003C/span>\\n\\\\end\\n\"\n },\n \"$:/plugins/kookma/shiraz/macros/card\": {\n \"title\": \"$:/plugins/kookma/shiraz/macros/card\",\n \"created\": \"20181124111624466\",\n \"modified\": \"20200323093719684\",\n \"tags\": \"$:/tags/Macro\",\n \"type\": \"text/vnd.tiddlywiki\",\n \"text\": \"\\\\define card(header:\\\"Empty\\\", title:\\\"Empty\\\" subtitle:\\\"Empty\\\" text:\\\"Empty\\\",footer:\\\"Empty\\\", width:\\
{"title":"$:/plugins/tiddlywiki/katex","name":"KaTeX","description":"KaTeX library for mathematical typography","list":"readme usage config","library-version":"v0.15.3","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/tiddlywiki/katex/ImplementationNotes\":{\"title\":\"$:/plugins/tiddlywiki/katex/ImplementationNotes\",\"text\":\"! CSS Handling\\n\\nThe ''original CSS from KaTeX'' includes a number of font definitions in this format:\\n\\n```\\n@font-face {\\n font-family: 'KaTeX_AMS';\\n src: url('fonts/KaTeX_AMS-Regular.eot');\\n src: url('fonts/KaTeX_AMS-Regular.eot?#iefix') format('embedded-opentype'),\\n url('fonts/KaTeX_AMS-Regular.woff') format('woff'),\\n url('fonts/KaTeX_AMS-Regular.ttf') format('truetype');\\n font-weight: normal;\\n font-style: normal;\\n}\\n```\\n\\nThese definitions are currently ''removed manually'' from [[$:/plugins/tiddlywiki/katex/katex.min.css]] so that they can be redefined as data URIs using TiddlyWiki's macro notation in $:/plugins/tiddlywiki/katex/styles\\n\\n```\\n@font-face {\\n font-family: 'KaTeX_AMS';\\n src: url(\u003C\u003Cdatauri '$:/plugins/tiddlywiki/katex/fonts/KaTeX_AMS-Regular.woff'>>) format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n```\\n\\nNote that the plugin currently only embeds the WOFF format fonts, which seems to be sufficient for most browsers.\\n\"},\"$:/plugins/tiddlywiki/katex/config\":{\"title\":\"$:/plugins/tiddlywiki/katex/config\",\"text\":\"\u003Cdiv class=\\\"tc-control-panel\\\">\\n\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/KaTeX/Config]!has[draft.of]]\\\">\\n\\n\u003Cdiv>\\n\\n!! \u003C$link>\u003C$transclude field=\\\"caption\\\"/>\u003C/$link>\\n\\n\u003C$transclude>\\n\\n\u003C/div>\\n\\n\u003C/$list>\\n\\n\u003C/div>\\n\"},\"$:/plugins/tiddlywiki/katex/developer\":{\"title\":\"$:/plugins/tiddlywiki/katex/developer\",\"text\":\"!! How to upgrade\\n\\n# Download latest release zip file from [[Github release|https://github.com/KaTeX/KaTeX/releases]]\\n# Backup existing files\\n#* `plugins/tiddlywiki/katex/files/tiddlywiki.files` file and \\n#* `katex.without-font-face.min.css` file\\n#* Learn more at: $:/plugins/tiddlywiki/katex/ImplementationNotes\\n# Rename extracted folder to \\\"files\\\" and \\n#* copy it to `plugins/tiddlywiki/katex/files`\\n#* (maybe delete the old folder first, to make a full overwrite)\\n#* delete unused files in it, like `*.mjs` files and `*.md` files\\n# Create `plugins/tiddlywiki/katex/files/tiddlywiki.files`\\n#* (or use the old one) and \\n#* register all needed files\\n# Register in `files/tiddlywiki.files`\\n#* `katex.without-font-face.min.css` ''as'' \\n#* `$:/plugins/tiddlywiki/katex/katex.min.css`\\n#* so fonts are loaded properly in tw environment\\n\\n\\n!! How to test\\n\\nTo create a new \\\"test edition\\\" type the following command in a console window:\\n\\n\u003C\u003C\u003C\\n```\\nnode tiddlywiki test-katex --init katexdemo\\n```\\n\u003C\u003C\u003C\\n\\n>It will create a new directory //test-katex// and clones the //katexdemo// edition.\u003Cbr>The output should be:\\n\\n\u003C\u003C\u003C\\n`Copied edition 'katexdemo' to test-katex`\\n\u003C\u003C\u003C\\n\\nType:\\n\\n\u003C\u003C\u003C\\n```\\nnode tiddlywiki test-katex --listen\\n```\\n\u003C\u003C\u003C\\n\\n>It should output\\n\\n\u003C\u003C\u003C\\n`syncer-server-filesystem: Dispatching 'save' task: $:/StoryList\\nServing on http://127.0.0.1:8080\\n(press ctrl-C to exit)\\n`\\n\u003C\u003C\u003C\\n\\nTest the new version in the browser at: [[http://127.0.0.1:8080]]\\n\\nMake sure all equations of math and chemistry are rendered properly.\\n\"},\"$:/plugins/tiddlywiki/katex/katex.min.css\":{\"text\":\".katex{text-rendering:auto;font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:\\\"0.15.3\\\"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1p
{"title":"$:/plugins/tiddlywiki/markdown","name":"Markdown","description":"Markdown parser based on markdown-it","list":"readme config syntax license","version":"5.3.1","plugin-type":"plugin","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/plugins/tiddlywiki/markdown/EditorToolbar/bold\":{\"title\":\"$:/plugins/tiddlywiki/markdown/EditorToolbar/bold\",\"list-after\":\"$:/core/ui/EditorToolbar/bold\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/bold\",\"caption\":\"{{$:/language/Buttons/Bold/Caption}} (Markdown)\",\"description\":\"{{$:/language/Buttons/Bold/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[text/x-markdown]] [\u003CtargetTiddler>type[text/markdown]]\",\"shortcuts\":\"((bold))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"wrap-selection\\\"\\n\\tprefix=\\\"**\\\"\\n\\tsuffix=\\\"**\\\"\\n/>\\n\"},\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1\":{\"title\":\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-1\",\"list-after\":\"$:/core/ui/EditorToolbar/heading-1\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-1\",\"caption\":\"{{$:/language/Buttons/Heading1/Caption}} (Markdown)\",\"description\":\"{{$:/language/Buttons/Heading1/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[text/x-markdown]] [\u003CtargetTiddler>type[text/markdown]]\",\"shortcuts\":\"((heading-1))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"#\\\"\\n\\tcount=\\\"1\\\"\\n/>\\n\"},\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2\":{\"title\":\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-2\",\"list-after\":\"$:/core/ui/EditorToolbar/heading-2\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-2\",\"caption\":\"{{$:/language/Buttons/Heading2/Caption}} (Markdown)\",\"description\":\"{{$:/language/Buttons/Heading2/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[text/x-markdown]] [\u003CtargetTiddler>type[text/markdown]]\",\"shortcuts\":\"((heading-2))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"#\\\"\\n\\tcount=\\\"2\\\"\\n/>\\n\"},\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3\":{\"title\":\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-3\",\"list-after\":\"$:/core/ui/EditorToolbar/heading-3\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-3\",\"caption\":\"{{$:/language/Buttons/Heading3/Caption}} (Markdown)\",\"description\":\"{{$:/language/Buttons/Heading3/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[text/x-markdown]] [\u003CtargetTiddler>type[text/markdown]]\",\"shortcuts\":\"((heading-3))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"#\\\"\\n\\tcount=\\\"3\\\"\\n/>\\n\"},\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4\":{\"title\":\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-4\",\"list-after\":\"$:/core/ui/EditorToolbar/heading-4\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-4\",\"caption\":\"{{$:/language/Buttons/Heading4/Caption}} (Markdown)\",\"description\":\"{{$:/language/Buttons/Heading4/Hint}}\",\"condition\":\"[\u003CtargetTiddler>type[text/x-markdown]] [\u003CtargetTiddler>type[text/markdown]]\",\"shortcuts\":\"((heading-4))\",\"text\":\"\u003C$action-sendmessage\\n\\t$message=\\\"tm-edit-text-operation\\\"\\n\\t$param=\\\"prefix-lines\\\"\\n\\tcharacter=\\\"#\\\"\\n\\tcount=\\\"4\\\"\\n/>\\n\"},\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5\":{\"title\":\"$:/plugins/tiddlywiki/markdown/EditorToolbar/heading-5\",\"list-after\":\"$:/core/ui/EditorToolbar/heading-5\",\"tags\":\"$:/tags/EditorToolbar\",\"icon\":\"$:/core/images/heading-5\",\"caption\":\"{{$:/language/Buttons/Heading5/Caption}} (Markdown)\",\"description\":\"{{$:/language/Buttons/Heading5/Hint}}\",\"condition\":\"[\u003CtargetTiddler>
{"title":"$:/SiteSubtitle","text":"un ~TiddlyWiki di presentazione","created":"20200728124241487","modified":"20200728124245873"},
{"title":"$:/SiteTitle","text":"Gianluigi Filippelli","created":"20200728124225862","modified":"20200728124238345"},
{"title":"$:/state/http-requests","text":"0"},
{"created":"20231019152829979","creator":"ulaulaman","title":"$:/state/tab-1593268138","text":"EduINAFDescrizione","modified":"20231019152834241","modifier":"ulaulaman"},
2021-10-23 15:52:28 +02:00
{"title":"$:/status/RequireReloadDueToPluginChange","text":"no"},
{"title":"$:/status/UserName","text":"ulaulaman","created":"20200728124256197","creator":"u","modified":"20200728124300028","modifier":"ulaulama"},
2023-10-26 14:12:56 +02:00
{"title":"$:/StoryList","created":"20231026121105140","creator":"ulaulaman","text":"","list":"[[Gianluigi Filippelli]]","modified":"20231026121139281","modifier":"ulaulaman"},
2021-10-23 15:52:28 +02:00
{"created":"20180826061648522","creator":"jd","title":"$:/theme","text":"$:/themes/jd/Whitespace","modified":"20211023134348889","modifier":"ulaulaman"},
{"title":"$:/themes/jd/Whitespace","type":"application/json","text":"{\n \"tiddlers\": {\n \"$:/themes/jd/Whitespace/template/sidebar\": {\n \"text\": \"\\\\define wsconfig(name) $:/config/Whitespace/$name$\\n\\\\define config-title()\\n$:/config/PageControlButtons/Visibility/$(listItem)$\\n\\\\end\\n\\\\define config-title-sidebar()\\n$:/config/SideBar/Visibility/$(currentTiddler)$\\n\\\\end\\n\\\\define drop-actions()\\n\u003C$action-listops $tiddler=\\\"$:/tags/SideBar\\\" $subfilter=\\\"+[insertbefore:currentTiddler\u003CactionTiddler>]\\\"/>\\n\u003C$fieldmangler tiddler=\u003C\u003CactionTiddler>>>\\n\u003C$action-sendmessage $message=\\\"tm-add-tag\\\" $param=\\\"$:/tags/SideBar\\\"/>\\n\u003C/$fieldmangler>\\n\\\\end\\n\\\\define drop-actions-PageControls-buttons()\\n\u003C$action-listops $tiddler=\\\"$:/tags/PageControls\\\" $subfilter=\\\"+[insertbefore:listItem\u003CactionTiddler>]\\\"/>\\n\\\\end\\n\\\\define sidebar-title()\\n\u003C$list filter=\\\"[all[shadows+tiddlers]!has[draft.of]is[current]has[caption]]\\\">{{!!caption}}\u003C/$list>\\n\u003C$list filter=\\\"[all[shadows+tiddlers]!has[draft.of]is[current]!has[caption]]\\\">{{!!title}}\u003C/$list>\\n\\\\end\\n\\\\define control-panel-button(class)\\n\u003C$button to=\\\"$:/AdvancedSearch\\\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\\\"\\\"\\\"$(tv-config-toolbar-class)$ $class$\\\"\\\"\\\">\\n\u003C$action-setfield $tiddler=\u003C\u003Cwsconfig search>> text=\\\"no\\\"/>\\n\u003C$action-setfield $tiddler=\\\"$:/temp/advancedsearch\\\" text={{$:/temp/search}}/>\\n\u003C$action-setfield $tiddler=\\\"$:/temp/search\\\" text=\\\"\\\"/>\\n{{$:/core/images/advanced-search-button}}\\n\u003C/$button>\\n\\\\end\\n\\\\define NewTidActions()\\n\u003C$action-setfield $tiddler=\u003C\u003Cwsconfig search>> text=\\\"no\\\"/>\\n\u003C$action-createtiddler $basetitle={{$:/temp/search}} $savetitle=\\\"$:/temp/NewTidTitle\\\"/>\\n\u003C$action-sendmessage $message=\\\"tm-edit-tiddler\\\" $param={{$:/temp/NewTidTitle}}/>\\n\u003C$action-deletetiddler $tiddler=\\\"$:/temp/NewTidTitle\\\"/>\\n\u003C$action-setfield $tiddler=\\\"$:/temp/search\\\" text=\\\"\\\"/>\\n\\\\end\\n\\\\define ws-page-controls()\\n\u003C$list filter=\\\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\\\" variable=\\\"listItem\\\">\\n\u003C$droppable actions=\u003C\u003Cdrop-actions-PageControls-buttons>>>\\n\u003Cdiv class=\\\"tc-droppable-placeholder\\\">\\n&nbsp;\\n\u003C/div>\\n\u003C$list filter=\\\"[\u003Cconfig-title>!text[hide]]\\\" variable=\\\"checker\\\">\\n\u003C$set name=\\\"tv-config-toolbar-class\\\" filter=\\\"[\u003Ctv-config-toolbar-class>] [\u003ClistItem>encodeuricomponent[]addprefix[tc-btn-]]\\\">\\n\u003C$draggable tiddler=\u003C\u003ClistItem>> tag=\\\"span\\\">\u003C$transclude tiddler=\u003C\u003ClistItem>>/>\u003C/$draggable>\\n\u003C/$set>\\n\u003C/$list>\\n\u003C/$droppable>\\n\u003C/$list>\\n\\\\end\\n\\n\u003Cdiv class=\\\"vertical-controls\\\">\\n\u003C\u003Cws-page-controls>>\\n\u003C/div>\\n\\n\u003C$scrollable class='jd-sidebar'>\\n\u003Cdiv class=\\\"jd-header\\\">\\n\u003C$reveal state=\\\"$:/state/sidebar\\\" type=\\\"nomatch\\\" text=\\\"no\\\">\\n\u003C$button set=\\\"$:/state/sidebar\\\" setTo=\\\"no\\\" tooltip=\\\"Unfix sidebar\\\" class=\\\"tc-btn-invisible\\\">{{$:/core/images/menu-button}}\u003C/$button>\\n\u003C/$reveal>\\n\u003C$reveal state=\\\"$:/state/sidebar\\\" type=\\\"match\\\" text=\\\"no\\\">\\n\u003C$button set=\\\"$:/state/sidebar\\\" setTo=\\\"yes\\\" tooltip=\\\"Fix sidebar\\\" class=\\\"tc-btn-invisible\\\">{{$:/core/images/menu-button}}\u003C/$button>\\n\u003C/$reveal>\\n\u003Cspan class=\\\"header-buttons\\\">\\n\u003C\u003Cws-page-controls>>\\n\u003C/span>\\n\u003C/div>\\n\u003C$list filter=\\\"[[$:/config/Whitespace/show-sitetitle]!text[no]]\\\" variable=\\\"checker\\\">\\n\u003Cdiv class=\\\"jd-sitetitle-wrapper\\\">\\n\u003C$list filter=\\\"[[$:/SiteTitle]!text[]]\\\" variable=\\\"checker\\\">\\n\u003Cdiv class=\\\"jd-sitet
{"title":"$:/themes/tiddlywiki/snowwhite","name":"Snow White","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Emphasises individual tiddlers","dependents":"$:/themes/tiddlywiki/vanilla","plugin-priority":"0","version":"5.3.1","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/snowwhite/base\":{\"title\":\"$:/themes/tiddlywiki/snowwhite/base\",\"tags\":\"[[$:/tags/Stylesheet]]\",\"text\":\"\\\\define sidebarbreakpoint-minus-one()\\n\u003C$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\\n\\\\end\\n\\n\\\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\\n\\n.tc-sidebar-header {\\n\\ttext-shadow: 0 1px 0 \u003C\u003Ccolour sidebar-foreground-shadow>>;\\n}\\n\\n.tc-tiddler-info {\\n\\t\u003C\u003Cbox-shadow \\\"inset 1px 2px 3px rgba(0,0,0,0.1)\\\">>\\n}\\n\\n@media screen {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow \\\"1px 1px 5px rgba(0, 0, 0, 0.3)\\\">>\\n\\t}\\n}\\n\\n@media (max-width: \u003C\u003Csidebarbreakpoint-minus-one>>) {\\n\\t.tc-tiddler-frame {\\n\\t\\t\u003C\u003Cbox-shadow none>>\\n\\t}\\n}\\n\\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\\n\\t\u003C\u003Ctransition \\\"fill 150ms ease-in-out\\\">>\\n}\\n\\n.tc-tiddler-controls button.tc-selected,\\n.tc-page-controls button.tc-selected {\\n\\t\u003C\u003Cfilter \\\"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\\\">>\\n}\\n\\n.tc-tiddler-frame input.tc-edit-texteditor,\\n.tc-tiddler-frame select.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-edit-tags {\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 8px rgba(0, 0, 0, 0.15)\\\">>\\n}\\n\\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\\n\\t\u003C\u003Cbox-shadow \\\"none\\\">>\\n\\tborder: none;\\n\\toutline: none;\\n}\\n\\ntextarea.tc-edit-texteditor {\\n\\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\\n}\\n\\ncanvas.tc-edit-bitmapeditor {\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 5px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-drop-down {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-block-dropdown {\\n\\tborder-radius: 4px;\\n\\t\u003C\u003Cbox-shadow \\\"2px 2px 10px rgba(0, 0, 0, 0.5)\\\">>\\n}\\n\\n.tc-modal {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n}\\n\\n.tc-modal-footer {\\n\\tborder-radius: 0 0 6px 6px;\\n\\t\u003C\u003Cbox-shadow \\\"inset 0 1px 0 #fff\\\">>;\\n}\\n\\n\\n.tc-alert {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.6)\\\">>\\n}\\n\\n.tc-notification {\\n\\tborder-radius: 6px;\\n\\t\u003C\u003Cbox-shadow \\\"0 3px 7px rgba(0,0,0,0.3)\\\">>\\n\\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\\n}\\n\\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\\n\\tborder-top: none;\\n\\theight: 1px;\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\\\">>\\n}\\n\\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\\n\\t\u003C\u003Cbackground-linear-gradient \\\"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\\\">>\\n}\\n\\n.tc-message-box img {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\\n.tc-plugin-info {\\n\\t\u003C\u003Cbox-shadow \\\"1px 1px 3px rgba(0,0,0,0.5)\\\">>\\n}\\n\"}}}"},
{"title":"$:/themes/tiddlywiki/vanilla","name":"Vanilla","author":"JeremyRuston","core-version":">=5.0.0","plugin-type":"theme","description":"Basic theme","plugin-priority":"0","version":"5.3.1","dependents":"","type":"application/json","text":"{\"tiddlers\":{\"$:/themes/tiddlywiki/vanilla/themetweaks\":{\"title\":\"$:/themes/tiddlywiki/vanilla/themetweaks\",\"tags\":\"$:/tags/ControlPanel/Appearance\",\"caption\":\"{{$:/language/ThemeTweaks/ThemeTweaks}}\",\"text\":\"\\\\define lingo-base() $:/language/ThemeTweaks/\\n\\n\\\\define replacement-text()\\n[img[$(imageTitle)$]]\\n\\\\end\\n\\n\\\\define backgroundimage-dropdown()\\n\u003Cdiv class=\\\"tc-drop-down-wrapper\\\">\\n\u003C$set name=\\\"state\\\" value=\u003C\u003Cqualify \\\"$:/state/popup/themetweaks/backgroundimage\\\">>>\\n\u003C$button popup=\u003C\u003Cstate>> class=\\\"tc-btn-invisible tc-btn-dropdown\\\">{{$:/core/images/down-arrow}}\u003C/$button>\\n\u003C$reveal state=\u003C\u003Cstate>> type=\\\"popup\\\" position=\\\"belowleft\\\" text=\\\"\\\" default=\\\"\\\" class=\\\"tc-popup-keep\\\">\\n\u003Cdiv class=\\\"tc-drop-down\\\" style=\\\"text-align:center;\\\">\\n\u003C$macrocall $name=\\\"image-picker\\\" actions=\\\"\\\"\\\"\\n\\n\u003C$action-setfield\\n\\t$tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\\\"\\n\\t$value=\u003C\u003CimageTitle>>\\n/>\\n\\n\u003C$action-deletetiddler $tiddler=\u003C\u003Cstate>>/>\\n\\n\\\"\\\"\\\"/>\\n\u003C/div>\\n\u003C/$reveal>\\n\u003C/$set>\\n\u003C/div>\\n\\\\end\\n\\n\\\\define backgroundimageattachment-dropdown()\\n\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\\\" default=\\\"scroll\\\">\\n\u003Coption value=\\\"scroll\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment/Scroll>>\u003C/option>\\n\u003Coption value=\\\"fixed\\\">\u003C\u003Clingo Settings/BackgroundImageAttachment/Fixed>>\u003C/option>\\n\u003C/$select>\\n\\\\end\\n\\n\\\\define backgroundimagesize-dropdown()\\n\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\\\" default=\\\"scroll\\\">\\n\u003Coption value=\\\"auto\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Auto>>\u003C/option>\\n\u003Coption value=\\\"cover\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Cover>>\u003C/option>\\n\u003Coption value=\\\"contain\\\">\u003C\u003Clingo Settings/BackgroundImageSize/Contain>>\u003C/option>\\n\u003C/$select>\\n\\\\end\\n\\n\u003C\u003Clingo ThemeTweaks/Hint>>\\n\\n! \u003C\u003Clingo Options>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\">\u003C\u003Clingo Options/SidebarLayout>>\u003C/$link> |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\\\">\u003Coption value=\\\"fixed-fluid\\\">\u003C\u003Clingo Options/SidebarLayout/Fixed-Fluid>>\u003C/option>\u003Coption value=\\\"fluid-fixed\\\">\u003C\u003Clingo Options/SidebarLayout/Fluid-Fixed>>\u003C/option>\u003C/$select> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\">\u003C\u003Clingo Options/StickyTitles>>\u003C/$link>\u003Cbr>//\u003C\u003Clingo Options/StickyTitles/Hint>>// |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/stickytitles\\\">\u003Coption value=\\\"no\\\">{{$:/language/No}}\u003C/option>\u003Coption value=\\\"yes\\\">{{$:/language/Yes}}\u003C/option>\u003C/$select> |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/options/codewrapping\\\">\u003C\u003Clingo Options/CodeWrapping>>\u003C/$link> |\u003C$select tiddler=\\\"$:/themes/tiddlywiki/vanilla/options/codewrapping\\\">\u003Coption value=\\\"pre\\\">{{$:/language/No}}\u003C/option>\u003Coption value=\\\"pre-wrap\\\">{{$:/language/Yes}}\u003C/option>\u003C/$select> |\\n\\n! \u003C\u003Clingo Settings>>\\n\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\\\">\u003C\u003Clingo Settings/FontFamily>>\u003C/$link> |\u003C$edit-text tiddler=\\\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\\\" default=\\\"\\\" tag=\\\"input\\\"/> | |\\n|\u003C$link to=\\\"$:/themes/tiddlywiki/vanilla/settings/co
{"title":"$:/view","text":"classic","created":"20200728100805068","modified":"20200728124217307"},
{"created":"20211204173016262","creator":"ulaulaman","text":"# Elenco articoli LSB\n\n* [*Zio Paperone* #198](https://www.lospaziobianco.it/zio-paperone-200-countdown-amico-paperino/)\n* [*Zio Paperone* #199](https://www.lospaziobianco.it/zio-paperone-199/)\n* [*Krazy&Ignatz* vol.1, ed. FreeBooks](https://www.lospaziobianco.it/krazyignatz-vol1/)\n* [*Zio Paperone* #200](https://www.lospaziobianco.it/zio-paperone-200/)\n* [*Zio Paperone* #202](https://www.lospaziobianco.it/zio-paperone-202/)\n* [*Grandi Classici Disney* #207](https://www.lospaziobianco.it/grandi-classici-disney-237/)\n* [*Topo Goool* #3](https://www.lospaziobianco.it/topo-goool-3/)\n* [*Mega* #598](https://www.lospaziobianco.it/mega-598/)\n* [*Mega* #599](https://www.lospaziobianco.it/mega-599/)\n* [*Zio Paperone* #204-205](https://www.lospaziobianco.it/zio-paperone-204/)\n* [*La deriva u-cronica*](https://www.lospaziobianco.it/topolino-deriva-u-cronica-topolino-partire-dal-2674/)\n* [*Wizards of Mickey*](https://www.lospaziobianco.it/wizards-of-mickey/)\n* [*Luciano Bottaro: di funghi, gioviali ed altre storie*](https://www.lospaziobianco.it/luciano-bottaro-funghi-gioviali-storie/)\n* [*Lanterna Verde Speciale* #4](https://www.lospaziobianco.it/lanterna-verde-speciale-4/)\n* [*Simpson Comics* #98: sulle tracce di Zio Paperone](https://www.lospaziobianco.it/simpson-comics-98/)\n* [*Crisi Infinita*](https://www.lospaziobianco.it/crisi-infinita-1-2/)\n* [*Grandi Classici Disney* #247](https://www.lospaziobianco.it/grandi-classici-disney-247/)\n* [*Grandi CLassici Disney* #250](https://www.lospaziobianco.it/grandi-classici-disney-250/)\n* [*Storie da Altrove* #10](https://www.lospaziobianco.it/storie-10-terrore-venne-schermo/)\n* [*Grandi Classici Disney* #251](https://www.lospaziobianco.it/grandi-classici-disney-251/)\n* [Eta Beta: L'uomo del domani](https://www.lospaziobianco.it/eta-beta-uomo-domani/)\n* [*Il Giornalino* #43 - 2007](https://www.lospaziobianco.it/giornalino-43-2007/)\n* [*Grandi Classici Disney* #252](https://www.lospaziobianco.it/grandi-classici-disney-252/)\n* [*Superman* #5: La caduta di Camelot](https://www.lospaziobianco.it/superman-5/)\n* [*Superman* #6: L'angelo](https://www.lospaziobianco.it/superman-6/)\n* *Storia e gloria della città di Paperopoli*: [parte 1](https://www.lospaziobianco.it/storia-gloria-citta-paperopoli-parte-1-citta/), [parte 2](https://www.lospaziobianco.it/storia-gloria-citta-paperopoli-parte-2-giovani-marmotte/), [parte 3](https://www.lospaziobianco.it/storia-gloria-citta-paperopoli-parte-3-deposito-monete/)\n* [*Il giorno del giudizio*](https://www.lospaziobianco.it/giorno-giudizio/)\n* [*Spirit* vol.1: *Un detective creduto morto*](https://www.lospaziobianco.it/Spirit-vol-1-detective-creduto-morto/)\n* [*Parque Chas: gli orrori di Barreiro e Risso*](https://www.lospaziobianco.it/parque-chas-2/)\n* [*Batman* #14](https://www.lospaziobianco.it/Batman-14/)\n* [*La poesia uccide!*](https://www.lospaziobianco.it/poesia-uccide/)\n* [*Poema a fumetti: come Dino Buzzati anticipò i graphic novel*](https://www.lospaziobianco.it/poema-fumetti/)\n* [*Le vicende relative al caso della scomparsa di Miss Finch*](https://www.lospaziobianco.it/vicende-relative-caso-scomparsa-Miss-Finch/)\n* [*Joe R. Lansdale, lultimo scrittore pulp*](https://www.lospaziobianco.it/Joe-R-Lansdale-scrittore-pulp/)\n* [*Il Cabemucco* #1-2](https://www.lospaziobianco.it/canemucco-1-2/)\n* [*Logicomix: di barbieri, labirinti e altri paradossi*](https://www.lospaziobianco.it/logicomix-barbieri-labirinti-paradossi/)\n* [*Bruno Concina: il tempo, i bivi e una storia sullacqua*](https://www.lospaziobianco.it/bruno-concina-tempo-bivi-storia-sullacqua/)\n* [*Law, legal thriller a fumetti: intervista a Giorgio Salati*](https://www.lospaziobianco.it/law-legal-thriller-fumetti-intervista-giorgio-salati/)\n* [*Lattacco dei giganti: Isayama tra J.G. Ballard e Heinlein*](https://www.lospaziobianco.it/attacco-giganti-isayama-ballard-heinlein/)\n* [*Flash* #1](https://www.lospaziobianco.it/flash-1-aa-vv/)\n* [*Superman* #1](https://www.lospaziobianco
2021-12-31 16:54:25 +01:00
{"created":"20200803173012723","creator":"ulaulaman","text":"| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| Equinoxes and solstices | | |\n| english | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/equinox_solstice-en.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/equinox_solstice-en.pdf) |\n| italian | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/equinox_solstice-it.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/equinox_solstice-it.pdf) |\n| Spacetime deformation by a black hole | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/spacetime_deformation.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/spacetime_deformation.pdf) |\n| Percorso del Sole nel cielo | | |\n| dall'equatore | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/crepuscolo_equatore.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/crepuscolo_equatore.pdf) |\n| dal circolo artico | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/crepuscolo_circolo_artico.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/crepuscolo_circolo_artico.pdf) |\n| Diffusione della luce da parte dell'atmosfera | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/diffusione_luce.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/diffusione_luce.pdf) |\n| Sistema Solare | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/sistema_solare.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/sistema_solare.pdf) |\n| Fasi lunari | [tex source](astronomy/fasi_lunari.tex) | [pdf](astronomy/pdf/fasi_lunari.pdf) |\n\n### Eratosthenes method for determining the size of the Earth\n\n| Language | Source | Pdf |\n|:-------------|:------------------|:------|\n| english | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/eratosthenes-en.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/pdf/eratosthenes-en.pdf) |\n| italian | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/eratosthenes-it.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/pdf/eratosthenes-it.pdf) |\n\nWith title and background:\n\n| Language | Source | Pdf |\n|:-------------|:------------------|:------|\n| english | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/eratosthenes-infographic-en.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/pdf/eratosthenes-infographic-en.pdf) |\n| italian | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/eratosthenes-infographic-it.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eratosthenes/pdf/eratosthenes-infographic-it.pdf) |\n\n### The Sun and its neighbours\n\n| Language | Source | Pdf |\n|:-------------|:------------------|:------|\n| english | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/sun_neighbours_en.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/sun_neighbours_en.pdf) |\n| italian | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/sun_neighbours_it.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/pdf/sun_neighbours_it.pdf) |\n\n### Earth-Moon system\n\n| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| Apogeo e perigeo | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/sistema_terra-luna/sistema_terra-luna.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/sistema_terra-luna/pdf/sistema_terra-luna.pdf) |\n| Maree | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/astronomy/sistema_terra-luna/maree.tex) | [pdf](https
{"created":"20200817000906526","creator":"ulaulaman","text":"!! Blog e collaborazioni\n\n[[DropSea|https://dropseaofulaula.blogspot.com/]] | [[Al Caffè del Cappellaio Matto|https://www.lospaziobianco.it/alcaffedelcappellaiomatto/]] | [[Science Backstage|http://sciencebackstage.blogspot.com/]] | [[Stipaturi|https://stipaturi.blogspot.com/]]\n\nIn inglese: [[Doc Madhattan|http://docmadhattan.fieldofscience.com/]] | [[for Mathematics in Europe|http://mathematics-in-europe.eu/?cat=154]]\n\n!!! Lo Spazio Bianco\n\n[[Lista articoli|Articoli per Lo Spazio Bianco]]","title":"Blog","modified":"20211204173316453","modifier":"ulaulaman","tags":"about"},
{"title":"BookTemplate","type":"text/x-markdown","text":"\u003C\u003Cdbadge \"Book Template\" \"2021.1021\" \"info\">> \u003Ca href=\"https://github.com/ulaulaman/book-template\" class=\"badge badge-dark\" target=\"github\">Repository ~GitHub\u003C/a>\n\n*Plugin* che aggiunge uno *shortcode* per la creazione di un box con i dati editoriali di un libro o di un fumetto.\n\n## Descrizione\n\nOltre allo *shortcode*, il *plugin* aggiunge un *metabox* di istruzioni ai *post*.\n\n### Esempi\n\nEsempio generico\n\n[bookdata title=\"Titolo\" author=\"Autore/i\" publisher=\"Editore\" date=\"Data\" pages =\"numero pagine\" type=\"Borssurato,Cartonato,Digitale/on-line\" price=\"prezzo/gratuito\"]\n\nIn caso di fumetto o libro illustrato, inserire il colore\n\n[bookdata ... col=\"colore,b/n\"]\n\nPossono essere inseriti opzionalmente ISBN [bookdata ... isbn=\"codice\"] o ISSN [bookdata ... issn=\"codice\"], il traduttore [bookdata ... translator=\"Traduttore\"], l'età consigliata [bookdata ... age=\"età consigliata\"] ed eventuali note aggiuntive [dati_editoriali ... notes=\"Note aggiuntive\"]\u003Cbr/>\nInoltre è possibile personalizzare il messaggio di apertura della scheda con il parametro intro e inserire un link relativo al libro con il parametro url.\u003Cbr/>\nI dati possono essere inseriti anche in maniera disordinata: ci penserà il plugin a riordinarli!\n\n## Screenshot\n\u003Cdiv align=\"center\">\u003Cimg src=\"https://github.com/ulaulaman/book-template/blob/master/assets/screenshot-1.jpg?raw=true\" />\u003Cbr/>\u003Cem>Metabox con le istruzioni per l'uso dello shortcode\u003C/em>\u003C/div>\n\n## Installazione\n1. Installa il [GitHub Updater](https://github.com/afragen/github-updater)\n2. Vai nelle impostazioni del GitHub Updater, quindi nella scheda *Install Plugin*\n3. Qui incolla il *permalink* del [*repository* su GitHub](https://github.com/ulaulaman/book-template)\n4. Una volta installato, attiva\n5. In alternativa scarica il [*file* .zip](https://github.com/ulaulaman/book-template/releases/download/2020.0813/book-template.2020.0813.zip) in allegato alla [release 2020.0813](https://github.com/ulaulaman/book-template/releases/tag/2020.0813), quindi scompattalo all'interno della cartella dei *plugin* della tua installazione wordpress\n\n## Changelog\n* 2021.1021 Corretto errore nell'*html* della scheda\n* 2021.1016 Aggiunti due nuovi parametri: intro, per personalizzare la prima righa, e url per inserire in corrispondenza del titolo una possibile scheda dello stesso\n* 2020.0813 Aggiunto allo *shortcode* il campo dell'età consigliata\n* 2020.0718.1 Corretti errori codice\n* 2020.0718 Aggiunti file delle lingue: italiano di *default*, inglese come traduzione\n* 2018.0326 Corretto errore che raddoppia la parola \"pagine\" nella scheda dei dati editoriali\n* 2018.0213.1 Aggiornamento estetico\n * Sostituito il trattino prima del prezzo. Sistemate alcunie parti nel *metabox* delle istruzioni\n* 2018.0213 modificato il codice per permettere le traduzioni in preparazione dello spostamento in [Citations tools](https://wordpress.org/plugins/citations-tools/)\n* 0.5.2 integrazione per l'aggiornamento tramite il [GitHub Updater](https://github.com/afragen/github-updater)\n* 0.5.1 corretto errore di battitura e negli if di controllo\n* 0.5 spostamento del metabox di messaggio sulla colonna destra\n* 0.4 aggiunta box con messaggio per l'uso dello shortcode in cima al post\n* 0.3 ottimizzazione codice shortcode\n* 0.2.2 nomi attributi: dall'italiano all'inglese\n* 0.2.1 aggiunta altri dati editoriali\n* 0.2 aggiunta attributi: titolo\n* 0.1 creazione shortcode con testo di base","created":"20200812150738415","creator":"ulaulaman","modified":"20211022010615263","modifier":"ulaulaman","tags":"github"},
{"title":"CitationsTools","type":"text/x-markdown","text":"\u003C\u003Cdbadge \"Citations tools\" \"0.3.2\" \"info\">> \u003Ca href=\"https://wordpress.org/plugins/citations-tools/\" class=\"badge badge-dark\" target=\"wp\">Wordpress Plugin\u003C/a> \u003Ca href=\"https://github.com/ulaulaman/citations-tools\" class=\"badge badge-dark\" target=\"github\">Repository ~GitHub\u003C/a> \u003Ca href=\"https://github.com/ulaulaman/citations-tools-dev\" class=\"badge badge-dark\" target=\"github\">Developing version\u003C/a>\n\n\u003Cdiv align=\"center\">\u003Cimg src=\"https://github.com/ulaulaman/citations-tools/blob/master/assets/banner-772x250.jpg?raw=true\" />\u003C/div>\n\nSome tools for scientific and editorial bloggers.\n\n# Description\nThe plugin add a shortcode in order to link a paper using its doi code. You can also use an other shortcode to resolve doi code and publish a full citation apa formatted. It is also a shortcode for manual citations.\n\n## Link doi\n\nUsing the standard for doi link, the plugin introduce a shortcode in order to create a link to a paper provided by doi.\n**How to use the shortcode**:\n\n[ctdoi code=\"...\"]Title of the paper[/doi]\n\n## Doi resolver\n\nThe plugin send the doi code to [Crossref Metadata Search](https://search.crossref.org/), get the information and publish a full citation in apa standard with the shortcode [ctdoiresolve ...].\n**How to use the shortcode**:\n\n[ctdoiresolve code=\"...\"]\n\nThere are also three optional parameters:\n\n[ctdoiresolve code=\"...\" arxiv=\"...\"]\n\nif the paper has an arXiv version\n\n[ctdoiresolve code=\"...\" pdfurl=\"...\"]\n\nif the paper has a free pdf version\n\n[ctdoiresolve code=\"...\" archiveurl=\"...\"]\n\nif the paper has a free version on [archive.org](https://archive.org/)\n\n## Manual citations\n\nThere's also a shortcode for manual citations, [paperdata ...]. You can use it with the following syntax:\n\n[paperdata auth=\"author/s name/s\" year=\"...\" title=\"...\" journal=\"...\" vol=\"...\" issue=\"...\" pages=\"...\" code=\"...\"]\n\nYou can also use the arxiv, pdfurl, archiveurl parameters.\n\n## Styling\n\nYou can style citations adding in your css theme the class \"paperdata\".\n\n## External service\n\n**Digital Object Identifier**, or *DOI*, is a persistent identifier used to uniquely identify objects, standardized by the **International Organization for Standardization** (*ISO*). DOIs are mainly used to identify academic, professional, and government information, such as journal articles, research reports and data sets, official publications.\n\n***Citations tools*** uses the [CrossRef Metadata API](http://search.crossref.org/help/api) to retrieve complete publication information using the doi code as a search query. CrossRef is a part of the [doi system](https://dx.doi.org/).\n\n## Screenshot\n\u003Cdiv align=\"center\">\u003Cimg src=\"https://github.com/ulaulaman/citations-tools/blob/master/assets/screenshot-1.jpg?raw=true\" />\u003Cbr/>\u003Cem>The doi resolver: the shortcode (up) and the results (down)\u003C/em>\u003C/div>\n\n# Installation\n1. Extract the citations-tools.zip file and upload its contents to the /wp-content/plugins/ directory. Alternately, you can install directly from the Plugin directory within your WordPress Install.\n2. Activate the plugin through the \"Plugins\" menu in WordPress.\n3. Use the shortcode into your posts or pages.\n\n# Changelog\n* 0.3.2 add compatibility with Wordpress 4.9.5\n* 0.3.1 fix error in html script in [ctdoi] shortcode\n* 0.3 add shortcode for manual citations\n* 0.2.6.1 update readme.txt\n* 0.2.6 add archive.org link in doi resolver as shortcode's parameter\n* 0.2.5 fix error code\n* 0.2.4 changed functions names\n* 0.2.3 add pdf link in doi resolver as ahortcode's parameter\n* 0.2.2 add arXiv link in doi resolver as shortcode's parameter\n* 0.2.1 add doi link in doi resolver\n* 0.2 add shortcode to resolve doi using code\n* 0.1 shortcode for doi link","created":"20200812150724377","creator":"ulaulaman","modified":"20200904194517242","modifier":"ulaulaman","tags":"gi
{"title":"CoAuthorsWidget","type":"text/x-markdown","text":"\u003C\u003Cdbadge \"Co-Authors Widget\" \"0.6\" \"info\">> \u003Ca href=\"https://wordpress.org/plugins/widget-for-co-authors/\" class=\"badge badge-dark\" target=\"wp\">Wordpress Plugin\u003C/a> \u003Ca href=\"https://github.com/ulaulaman/widget-for-co-authors\" class=\"badge badge-dark\" target=\"github\">Repository ~GitHub\u003C/a>\n\nThe plugin add a widget and a shortcode in order to show authors of an article. It is compatible with Co-Authors Plus.\n\n# Description\n[Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/) is one of the most useful plugin for multiple authors blogs. This plugin add a widget to add users' avatars to post also for guest authors and for posts with multiple authors.\nYou can also add avatars with a shordcode [blog-post-coauthors].\nThe plugin add also a slider in order to show user's profile. If you want change the style, you can modify blog-spoiler.css file in the plugin folder.\n\n# Installation\n1. Make sure that Co-Authors Plus is installed and active.\n2. Extract the widget-for-coauthors.zip file and upload its contents to the /wp-content/plugins/ directory. Alternately, you can install directly from the Plugin directory within your WordPress Install.\n3. Activate the plugin through the \\\"Plugins\\\" menu in WordPress.\n4. Add the widget to your sidebar or the shortcode to your posts or pages.\n\n# Changelog\n* **0.6 extended html class also in case Co-Authors Plus is not installed**\n* 0.5.3 add the correct lang files\n* 0.5.2 fix error code in domain name in widget\n* 0.5.1 fix error code in domain name for messages\n* 0.5 support for translations\n* 0.4 translation italian messages in english\n* 0.3.1 test with wp 4.9.2\n* 0.3 add profile link and css\n* 0.2 creation of the widget to show authors' avatars\n* 0.1 creation of the shortcode to add post's authors\n\n# Screenshot\n\u003Cdiv align=\"center\">\u003Cimg src=\"https://github.com/ulaulaman/widget-for-co-authors/blob/master/assets/screenshot-1.jpg?raw=true\" />\u003C/div>\n\u003Cem>The result of the widget in a multiple authors post\u003C/em>","created":"20200812150749260","creator":"ulaulaman","modified":"20211013111014030","modifier":"ulaulaman","tags":"github [[plugin wordpress]] Wordpress"},
{"title":"code","text":"\u003Cpre>\u003C$view field=\"text\"/>\u003C/pre>","created":"20131223104948433","creator":"Stephan Hradek","description":"Will display a tiddler's code.","modified":"20200815141208429","modifier":"ulaulaman","tags":"template"},
{"title":"ebook","text":"!! E-Book\n\n* //Galileo Galilei. Riflessioni su un fisico// con ''Marco Fulvio Barozzi'': [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/ebook/galileo_galilei.pdf]]\n* //Night in Cosmo Brain//: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/ebook/night_cosmobrain.pdf]]\n* //Notizie pi greche//: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/ebook/piday.pdf]]","created":"20211022230936650","creator":"ulaulaman","modified":"20211022232020836","modifier":"ulaulaman","tags":""},
2023-10-26 14:12:56 +02:00
{"created":"20200728191228347","creator":"ulaulaman","text":"\u003C\u003Cdbadge \"~EduINAF\" \"2023.1026\" \"info\">> \u003Ca href=\"https://github.com/ulaulaman/eduinaf\" class=\"badge badge-dark\" target=\"github\">Repository ~GitHub\u003C/a>\n\nPlugin wordpress che aggiunge varie funzionalità al sito [Edu INAF](https://edu.inaf.it/) senza modificare direttamente il codice php del tema.\n\n\u003C\u003Ctabs tabsList:\"[tag[eduinaf]!tag[advanced]]\" default:\"EduINAFDescrizione\" class:\"tc-vertical\">>","title":"EduINAF","type":"text/x-markdown","modified":"20231026121150210","modifier":"ulaulaman","tags":"[[plugin wordpress]] Menu github"},
{"title":"EduINAFAjaxFilter","type":"text/x-markdown","text":"\u003C\u003Cdbadge \"Edu INAF Ajax Filter Posts\" \"0.2.5\" \"info\">> \u003Ca href=\"https://github.com/ulaulaman/eduinaf-ajax-filter-posts\" class=\"badge badge-dark\" target=\"github\">Repository ~GitHub\u003C/a>\n\n## Descrizione\n\nPlugin per realizzare un filtro di ricerca per *post* e *custom post type*. Personalizzazione dell'originale, [*Ajax Filter Posts*](https://github.com/Robbertdk/wordpress-ajax-filter-posts) di [**Robbert de Kuiper**](http://www.robbertdekuiper.com).\n\nIl plugin funziona tramite uno *shortcode*:\n\n```\n[ajax_filter_posts post_type=\"recipe\" tax=\"meal_type, food_type, diet_type\" posts_per_page=\"12\"]\n```\n\nLa personalizzazione ha implicato traduzione delle parti in inglese senza aggiungere un vocabolario.\n\n## Parametri\n\n- **post_type**\n Il tipo di post da mostrare. Di *default* filtra sugli articoli normali.\n\n- **tax**\n Una lista, separata da virgole, delle tassonomie da utilizzare per filtrare i post. *Default* post_term.\n\n- **post_per_page**\n Numero massimo di post da mostrare per ogni istanza. *Default* 12.\n\n## Installazione\n\nSi consiglia di clonare il [*repository* originale](https://github.com/Robbertdk/wordpress-ajax-filter-posts) e seguire le istruzioni, in particolare se avete necessità di personalizzare parte del *frontend* del *plugin*.\n\n## Changelog\n* 0.2.5 Modificate le voci \"Mostra\"/\"Nascondi\"; tolto il *permalink* alla descrizione, che resta come solo testo: lasciato solo su *thumbnail* e titolo; aggiunto colore al bottone \"Carica altro\".\n* 0.2.4 Imposta apertura dei *link* in una nuova finestra\n* 0.2.3 Aumento delle dimensioni del titolo del post dentro il *loop* e correzione codice css.\n* 0.2.2 Sistemata la ricerca in modo tale da non far comparire i *post* con *status* personalizzato.\n* 0.2.1 Traduzione in italiano dei messaggi senza l'uso dei *file* multilingua. Modifiche nel *css* per migliorare leggibilità di parte della spalla dei filtri. Aggiunta del riassunto nel *loop* dei *post*.","created":"20200728192218195","creator":"ulaulaman","modified":"20201218183559809","modifier":"ulaulaman","tags":"[[plugin wordpress]] eduinaf"},
2023-10-26 14:12:56 +02:00
{"created":"20200728191710511","creator":"ulaulaman","text":"* 2023.1026 Aggiornati link documenti concorso Rodari\n* 2023.1019 Modificati link e aggiunti documenti per Rodari 2023 e archiviato il menu di Rodari 2022\n* 2023.0113 Aggiuntinuovi loghi in collaborazioni\n* 2022.1020 Correzione errori versione precedente e nuovo bando concorso Rodari 2022\n* 2022.1012 Nuovi allegati per il concorso Rodari 2022\n* 2022.0610\n * Modifica *link* della barra laterale del concorso Rodari\n * Eliminazione delle griglie eduinaf e libri e semplificazione della grigliata\n * Accorpamento di speciali e grid in quest'ultimo\n* 2021.1129\n * Tolta riga che generava ripetizione del menu in *costellazioni* e rinominate variabili interne\n * Sostituito il logo Europlanet per le schede didattiche\n* 2021.1116\n * Modificato il colore della striscia dell'ultimo aggiornamento\n * Inserito il menu *costellazioni* alla fine della *sidebar* corrispondente\n * Elimintati i *widget* delle singole *sidebar*\n* 2021.1026\n * Modifche minori in rodari.php\n * Aggiornamento *file css*\n * Aggiunto *widget* per l'inserimento degli *shortcode* nelle *sidebar*\n* 2021.1022\n * Corretti errori di sintassi nello *shortcode* per astroedu\n * Cambiato colore dei link ad astroedu introducendo una nuova classe apposita e usando il *file css* generale\n * Aggiunto il supporto per le diverse versioni al *file css*\n * Aggiunto il codice per la striscietta sull'ultimo aggiornamento\n * Modificata parte che aggiunge l'autore nel *feed rss* nel caso in cui *Co-Authors Plus* non sia installato\n* 2021.1019\n * Accorpati pezzi di codice in per ridurre il numeri dei *file* .php richiamati in quello principale\n * Modifiche minori agli *shortcode* del concorso Rodari 2021\n * Eliminata la pagina di descrizione nella bacheca\n* 2021.1018 Aggiornati gli shortcode del concorso Rodari per l'anno 2021\n* 2021.1007\n * Aggiornato lo *shortcode* dei *loop* personalizzati con la distinzione tra 3 stili differenti\n * Aggiunti gli shortcode e i documenti relativi al concorso Via Lattea Quaraquarinci dedicato a Gianni Rodari\n* 2021.0628\n * Modifiche al codice di costellazioni.php per risolvere le [*issue* segnalate](https://github.com/ulaulaman/eduinaf/issues/5)\n * Sistemazioni varie nella pagina di descrizione del *plugin*\n * Modifiche minori in link.php\n* 2021.0626\n * Conclusione delle modifiche ad astrodidattica.php per risolvere le [*issue* segnalate](https://github.com/ulaulaman/eduinaf/issues/5)\n* 2021.0624\n * Nuove modifiche al codice di astrodidattica.php per risolvere le [*issue* segnalate](https://github.com/ulaulaman/eduinaf/issues/5)\n* 2021.0513\n * Nuove modifiche al codice di astrodidattica.php per risolvere le [*issue* segnalate](https://github.com/ulaulaman/eduinaf/issues/5)\n * Aggiunto nuovo logo per le collaborazioni\n* 2021.0508\n * Disabilitata tabella.php in attesa di risolvere il problema nell'[*issue* segnalato](https://github.com/ulaulaman/eduinaf/issues/4)\n * Modifiche al codice di astrodidattica.php per risolvere le [*issue* segnalate](https://github.com/ulaulaman/eduinaf/issues/5)\n* 2021.0410\n * Corretto errore in [grigliaspeciali] dovuto a *query* senza risultato\n * Aggiunte tipologie di post differenti in [grigliaspeciali]\n* 2021.0409\n * Aggiunto il logo di Roma3\n * Sistemata la parte degli argomenti del *curriculum* scolastico nella *sidebar* di astrodidattica\n\nEduINAFChangelog2020\nEduINAFChangelog2018\nEduINAFChangelogPre","title":"EduINAFChangelog","type":"text/x-markdown","modified":"20231026121135352","modifier":"ulaulaman","tags":"changelog eduinaf"},
{"title":"EduINAFChangelog2018","text":"EduINAFChangelog\n\n* 2018.0625\n * aggiunto il permalink sull'immagine in evidenza\n * tolta la classe del titolo\n * aggiunta la data con la classe del tema\n * modifiche minori di ordine grafico\n* 2018.0622\n * creazione di una griglia per la home per mostrare gli articoli in evidenza con una tassonomia personalizzata creata con plugin esterno\n * creazione del css della griglia della home\n* 2018.0503 modifica minore per sistemare la tabella degli articoli di uno Speciale nella spalla\n* 2018.0328 varie modifiche agli *shortcode* per la gestione degli Speciali\n * sostituito lo *shortcode* per la creazione della talebba degli articoli di uno speciale con uno con un controllo interno, utilizzabile direttamente in un *widget* di testo\n * modifiche minori alla griglia\n* 2018.0327 corretto errore nel *path* di speciali.css\n* 2018.0323 aggiunte funzionalità per gli Speciali\n * aggiunta una tassonomia specifica per includere gli articoli in un dato speciale\n * aggiunti due *shortcode* per la pubblicazione di un box all'interno degli articoli e di una griglia nella pagina di un dato speciale\n * aggiunto un css per la personalizzazione del box da utilizzare in futuro anche per le tabelle degli eventi\n* 2018.0228 incluso il file shortcode.php\n * aggiunge una serie di *shortcode* compatibili con i campi creati con [Custom Field Suite](https://wordpress.org/plugins/custom-field-suite/) e associati con le attività didattiche, tipologia di post creata con [Custom Post Type UI](https://wordpress.org/plugins/custom-post-type-ui/)\n* 2018.0219 modifiche nei *loop* e nelle griglie e aggiunta di campi personalizzati:\n * cancellazione della griglia precedente\n * creazione di una griglia per un *loop* generico\n * creazione della griglia per i libri\n * creazione degli *shortcode* corrispondenti\n * creazione di un *metabox* per l'aggiunta del titolo di un libro e dell'url della sua copertina\n * aggiunta in grid.php del codice per sostituire, se presente, il titolo del libro con il titolo del post nel caso della griglia di libri\n* 2018.0217 aggiunto un *loop* personalizzato:\n * aggiunto uno *shortcode* che mostra tutti i post dati una categoria e un'etichetta: di default sono rispettivamente 'libri' e 'libri-per-bambini-e-ragazzi'\n * incluso il css per la griglia\n* 2018.0214 aggiunti colori ai *link*\n* 2018.0212 aggiunto *shortcode* per articoli tratti da Sapere\n* 2018.0211 semplificazioni del codice e nuova numerazione:\n * crezione di *file php* indipendenti con i codici relativi alla pagina di descrizione, al contacaratteri, alla manipolazione del *feed rss*, per gli *shortcode* dei *link*","created":"20211008150040728","creator":"ulaulaman","modified":"20211008150223559","modifier":"ulaulaman"},
{"title":"EduINAFChangelog2020","text":"EduINAFChangelog\n\n* 2020.1124\n * Inserita la lingua italiana di *default* nei *permalink* di astroedu e spacescoop\n * Aggiunto il curatore della scheda nella *sidebar* costellazioni\n * Aggiunto il *widget* per la *sidebar* delle astrofoto\n* 2020.1119\n * Piccola modifica di codice nella mappa delle sedi INAF\n * Reso automatico il menu delle costellazioni\n * Aggiunto lo *shortcode* e il *widget* per la *sidebar* del corso base di astronomia\n * Modifiche alla pagina di descrizione del *plugin* nella *dashboard* di wordpress\n* 2020.1111\n * Aggiunta opzione per intro nello *shortcode* postlooptab\n * Incorporato menucostellazioni nella *sidebar* delle costellazioni\n * Aggiornata documentazione interna\n* 2020.1025\n * Sistemazione cartella immagini\n * Cambio percorso bottoni\n * Aggiunto *shortcode* mappa IRNET\n* 2020.1023\n * Aggiunto codice che corregge errore generato dallo *shortcode* tabspeciali quando usato in un *widget* di testo, se questo risulta ultimo della *sidebar*\n * Aggiunto *shortcode* (in grid.php) per la creazione di *loop* di articoli con categoria e *tag* come variabili\n * Aggiunto *widget* per la *sidebar* delle costellazioni\n * Pulizia css\n* 2020.1022\n * Corretto errore in codice html menu costellazioni\n * Corretti errori nella *sidebar* didattica e sistemazioni varie del codice\n * Aggiunto supporto per l'ordine personalizzato degli autori usando i *custom fields*\n * Aggiunto nella tabspeciali codice che previene un errore che occorre con i *custom post type* e nasconde la tabella\n* 2020.1021\n * Modificato css dei menu (correzione malfunzionamento con *tag* ul)\n * Corretto errore nella *sidebar* didattica che produce doppio logo *Europlanet*\n * Aggiunto css per bottoni per menu orizzontale\n* 2020.1020\n * Eliminato css per twitter e facebook\n * Aggiunto css per menu a bottoni\n * Aggiunto css per menu con lista\n * Aggiunto *shortcode* per la *sidebar* delle costellazioni\n * Aggiunto *widget* per la *sidebar* didattica\n* 2020.1001\n * Aggiunto *shortcode* per la *sidebar* didattica\n * Aggiunto *shortcode* per la *sidebar* astrofoto\n * Aggiunti in css personalizzazioni per *headline* e per incorporazioni da twitter e facebook\n* 2020.0922\n * Corretto errore nella personalizzazione del *feed* che genera errore in caso di mancata installazione di Co-Authors Plus\n * Nuova modifica nello *shortcode tabspeciali* che ora funziona usando lo *slug* dello speciale. Aspetto integrato con il nuovo tema e corretto errore che impedisce di pescare tutti gli articoli di uno speciale con nome costituito da più parole\n* 2020.0919\n * Pulizia codice speciali\n * Eliminato il campo sull'url della copertina nel metabox dei dati aggiuntivi per i libri\n * Pulizia codice griglia dei libri in funzione della cancellazione del campo del'url della copertina\n * Accorpato tutto il css in un unico *file*, incluso il css delle mappe INAF\n * Disabilitata la griglia di evidenza\n * Aggiunta griglia generica per categoria, etichetta, tassonomia e suo valore\n * Aggiunto shortcode per la mappa delle sedi INAF\n* 2020.0908\n * Aggiunto bollino livello trasversale nella cartella delle immagini per sezione astrodidattica\n * aggiunto lo *shortcode tabspeciali* che sostituirà lo *shortcode specialishort* che continua a produrre errore nella barra laterale in caso di inserimento di più speciali\n* 2020.0907\n * Correzione errore nel codice della tabella degli speciali (*shortcode specialishort*) che va nella spalla degli articoli\n * Nella griglia degli speciali (*shortcode grigliaspeciali*), specificato di raccogliere solo gli articoli\n * Cancellate righe di codice che si riferivano alla vecchia griglia\n* 2020.0824\n * Modifca alla griglia degli speciali: adottata la tabella personalizzata\n* 2020.0728\n * aggiunte immagini per i livelli didattici nella cartella \"images\"\n * aggiunte costellazioni e astrofoto al *feed*, tolte attività didattiche\n * tolte le videolezioni dagli speciali\n* 2020.0709\n * este
{"title":"EduINAFChangelogPre","text":"EduINAFChangelog\n\n* 0.9.6 test per wp 4.9.4\n* 0.9.5 test per wp 4.9.3\n* 0.9.4 aggiunto il Plugin URI\n* 0.9.3 aggiunto il ~GitHub Plugin URI per l'installazione e l'aggiornamento tramite il ~GitHub Updater\n* 0.9.2 modifiche alla pagina di documentazione; pulizia nella cartella principale\n* 0.9.1 aggiunta *shortcode* per i *link* a spacescoop usando codice e lingua della news\n* 0.9 aggiunta *shortcode* per i *link* ad astroEdu usando codice e lingua dell'attività\n* 0.8.1 cancellazione di *shortcode* e *widget* integrati con Co-Authors Plus a seguito della creazione di plugin apposito\n* 0.8 aggiunte le attività didattiche al feed rss\n* 0.7.2 aggiunto contacaratteri per gli articoli\n* 0.7.1 aggiunto contacaratteri per il riassunto con limite a 500\n* 0.6.2 correzione codice che mostrava articoli completi sostituendolo con il sommario\n* 0.6.1 correzione baco che impediva di mostrare i profili tranne il primo\n* 0.6 aggiunto metodo per mostrare/nascondere profilo nel *widget* con css\n* 0.5 manipolazione del footer admin della dashboard; manipolazione del feed rss: aggiunta immagine in evidenza e autori articolo; aggiunto il logo e modificati descrizione e *link*\n* 0.4 aggiunta della voce del menu e della pagina di presentazione del plugin\n* 0.3 aggiunta dei *link* ai profili nel *widget*\n* 0.2 *widget* per gli *avatar* degli autori compatibile con Co-Authors Plus\n* 0.1 *shortcode* per aggiunta autori compatibile con Co-Authors Plus","created":"20211008145928789","creator":"ulaulaman","modified":"20211008150210272","modifier":"ulaulaman"},
{"created":"20200824105149284","creator":"ulaulaman","text":"Il *plugin*, in italiano, aggiunge varie funzionalità al sito EduINAF senza modificare direttamente il codice php del tema.\n\n## Descrizione\n\nIl *plugin* aggiunge un'icona per il *login*, personalizza il messaggio nell'*admin footer*, manipola il *feed rss* per accreditare l'articolo all'autore/i, inclusi *guest author*, aggiunge una serie di *shortcode* e di *widget*.\nIn particolare definisce una serie di *shortcode* per la costruzione delle *sidebar* di alcuni *custom post type*:\n\n* **Didattica**: [sbdidattica] (con *widget*)\n* **Astrofoto**: [sbastrofoto] (con *widget*)\n* **Costellazioni**: [sbcostellazioni] (con *widget*)\n* **Menu costellazioni**: [menucostellazioni]\n* **Corso base di astronomia**: [sbcorsobase] (con *widget*)\n\nPer la didattica è consigliato utilizzare anche il *widget* apposito.\nDefinisce anche gli *shortcode* per inserire le attività didattiche da astroedu o gli articoli da spacesoop a partire dal codice del contenuto e dalla lingua:\n\n[astroedu code=\"...\" lang=\"...\"]\n\n[spacescoop code=\"...\" lang=\"...\"]\n\nEntrambi i parametri sono obbligatori per il corretto funzionamento degli *shortcode*.\n\n### Griglie per i *loop*\n\nIl *plugin* aggiunge degli *shortcode* per generare delle griglia di *post*. Si può utilizzare uno *shortcode* generico:\n\n[grigliata categoria=\"...\" etichetta=\"...\" tassonomia=\"...\" valore=\"...\"]\n\nin cui almeno uno dei due parametri deve essere specificato. Nel caso di *tassonomia*, a questo sarebbe buona norma abbinare anche il *valore* che può assumere la tassonomia personalizzata.\n\nPer realizzare dei *loop* personalizzati si può utilizzare lo *shortcode*\n\n[postlooptab intro=\"Ultimi articoli\" pag=\"5\" categoria=\"...\" tag=\"...\" stile=\"1\"]\n\nNell'esempio sono inseriti, laddove presenti, i valori di *default*.\nPer gli stili, è possibile indicare 1 per un elenco in linea con quello del tema, 2 per un elenco con nome dell'autore e data di pubblicazione, 3 per una griglia di quadrati.\n\n### Speciali\n\nAggiunti una tassonomia e due *shortcode* per la gestione degli Speciali. In particolare i due *shortcode* hanno la seguente sintassi:\n\n* Griglia da inserire nella pagina dello Speciale: [grigliaspeciali speciale=\"slug speciale\" tipo=\"slug tipologia post\"]\n\n### Storia\n\nIl *plugin* è stato originariamente sviluppato per integrarsi con [Co-Authors Plus](https://wordpress.org/plugins/co-authors-plus/). I codici di integrazione con questo *plugin* sono stati cancellati dalla versione attuale e spostati in [Co-Authors Widget](https://wordpress.org/plugins/widget-for-co-authors/) (vedi anche la [pagina del *plugin*](https://ulaulaman.github.io/#CoAuthorsWidget)).","title":"EduINAFDescrizione","type":"text/x-markdown","modified":"20231019152746482","modifier":"ulaulaman","tags":"eduinaf"},
{"created":"20200816233336056","creator":"ulaulaman","text":"Wikipedians, blogger and pop science teller. I also develop Wordpress' plugins and sites. I realize infographics and draws with LaTeX and by hand free.\n\nI also read books and comics and I collaborate with a comics' webzine.","title":"English","language":"english","modified":"20231019152318809","modifier":"ulaulaman","tags":"gf"},
{"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 vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n\u003Cdiv class=\"tc-control-panel\">\n\n|\u003C$link to=\"$:/SiteTitle\">\u003C\u003Clingo Title/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|\u003C$link to=\"$:/SiteSubtitle\">\u003C\u003Clingo Subtitle/Prompt>>\u003C/$link> |\u003C$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|\u003C$link to=\"$:/DefaultTiddlers\">\u003C\u003Clingo DefaultTiddlers/Prompt>>\u003C/$link> |\u003C\u003Clingo DefaultTiddlers/TopHint>>\u003Cbr> \u003C$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/>\u003Cbr>//\u003C\u003Clingo DefaultTiddlers/BottomHint>>// |\n\u003C/div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n","created":"20200728100615868","modified":"20200728100615868"},
{"title":"Gianluigi Filippelli","text":"\u003C\u003Ctabs tabsList:\"[tag[gf]!tag[advanced]]\" default:\"Italiano\" class:\"tc-vertical\">>\n\n{{Lavoro}}\n\n{{Blog}}\n\n{{ebook}}\n\n{{Presentazioni}}\n\n{{WordpressPlugin}}\n\n{{GitHubRepository}}\n","created":"20200816230529282","creator":"ulaulaman","modified":"20211022231122958","modifier":"ulaulaman"},
{"title":"GitHubRepository","text":"!! Repository ~GitHub\n\n\u003C\u003CTagTable \"github\">>","created":"20200817000643565","creator":"ulaulaman","modified":"20201203000630210","modifier":"ulaulaman"},
2022-01-20 09:46:31 +01:00
{"created":"20200803172817931","creator":"ulaulaman","text":"| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| A rocket | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/rocket.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/rocket.pdf) |\n| Saturn V | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/saturnV.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/saturnV.pdf) |\n| Captain Marvel | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/carol_danvers.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/carol_danvers.pdf) |\n| Quadrati che si dimezzano | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/squares01.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/squares01.pdf) |\n| Quadrati che raddoppiano | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/squares02.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/squares02.pdf) |\n| David' Star | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/david_star.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/david_star.pdf) |\n| Sistema Solare | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/sistema_solare.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/sistema_solare.pdf) |\n| Banner per il gruppo *flickr* dedicato alla cometa Leonard | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/comet_banner.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/comet_banner.pdf) |\n| La struttura del Sole | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/struttura_sole.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/struttura_sole.pdf) |\n\n### Planets and satellites\n\n| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| Mars | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/mars.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/mars.pdf) |\n| Mercury | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/mercury.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/mercury.pdf) |\n| Moon | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/moon.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/moon.pdf) |\n| Europa | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/europa.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/europa.pdf) |\n| Io | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/io.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/io.pdf) |\n| Earth | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/earth.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/earth.pdf) |\n| Earth (no face) | tex source | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/earth-noface.pdf) |\n| Earth in black, white and grey | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/earth-bw.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/earth-bw.pdf) |\n| Hot Earth | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/earth-hot.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/earth-hot.pdf) |\n| Earth as a globe | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/globe.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/globe.pdf) |\n| SuperMoon | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/supermoon.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/graphics/pdf/supermoon.pdf) |\n| Asteroid | [tex source](https://github.com/ulaulaman/ti
{"title":"How to show macros code","text":"I imported in my TiddlyWiki the [[code tiddler|http://tw5magick.tiddlyspot.com/#code]] by [[Stephan Hradek|http://tw5magick.tiddlyspot.com/]] in order to show code of macros and other tiddlers.\n\nFor example the show twitterFollowButton's code use `{{twitterFollowButton||code}}`:\n\n{{twitterFollowButton||code}}","created":"20200815123417078","creator":"ulaulaman","modified":"20200815143733819","modifier":"ulaulaman","tags":"[[how to]]"},
2021-10-23 16:58:27 +02:00
{"created":"20211023143406486","creator":"ulaulaman","text":"a.github:hover::after {\ncontent: url('../img/icons8-github-24.png');\n}\n\na.wiki:hover::after {\ncontent: url('../img/icons8-wikipedia-24.png');\n}","tags":"$:/tags/Stylesheet","title":"icon style","modified":"20211023145626901","modifier":"ulaulaman"},
2022-01-20 09:46:31 +01:00
{"created":"20200731233656204","creator":"ulaulaman","text":"| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| *Come scoprire nuovi pianeti* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/esopianeti/esopianeti.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/esopianeti/pdf/esopianeti.pdf) |\n| *Caccia al pianeta* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/esopianeti/transito-mini_guida.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/esopianeti/pdf/transito-mini_guida.pdf) |\n| *Il messaggio di Arecibo* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/messaggio_arecibo.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/pdf/messaggio_arecibo.pdf) |\n| *Meteore* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/meteore.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/pdf/meteore.pdf) |\n| *Programma Apollo* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/luna/luna-programma_apollo.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/luna/pdf/luna-programma_apollo.pdf) |\n| *Un flyby con Bepi-Colombo* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/mercurio/bepicolombo_flyby.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/mercurio/pdf/bepicolombo_flyby.pdf) |\n| *Le Perseidi* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/perseidi.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/pdf/perseidi.pdf) |\n| *Eclissi di Sole* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eclissi_sole.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/pdf/eclissi_sole.pdf) |\n| *Manovra di trasferimento di Hohmann* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/marte/hohmann.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/marte/pdf/hohmann.pdf) |\n| *Un fatto curioso sui semicerchi* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/math/semicerchi.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/math/pdf/semicerchi.pdf) |\n| *I moti lunari* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/luna/moti_lunari.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/luna/pdf/moti_lunari.pdf) |\n| *L'eclissi di Eddington* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/eclissi_eddington.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/pdf/eclissi_eddington.pdf) |\n| *Come funzionano i radiotelescopi* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/radiotelescopi.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/pdf/radiotelescopi.pdf) |\n| *Motore a curvatura* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/star_trek/motore_curvatura.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/star_trek/pdf/motore_curvatura.pdf) |\n| *Esopianeti fantastici e dove trovarli* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/esopianeti/esopianeti_fantastici.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/esopianeti/pdf/esopianeti_fantastici.pdf) |\n| *Vita di un asteroide* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/vita_asteroide.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/pdf/vita_asteroide.pdf) |\n| *Viaggio verso la nube di Oort* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/sistema_solare/nube_oort.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/infographics/sistema_solare/pdf/nube_oort.pdf) |\n| *Il p
{"created":"20200816233156646","creator":"ulaulaman","text":"Wikipediano, blogger e divulgatore scientifico. Sviluppo anche plugin e siti in wordpress. Realizzo infografiche e disegni in LaTeX e a mano libera.\n\nLeggo libri e fumetti e collaboro con una webzine di settore.","title":"Italiano","language":"italiano","modified":"20231019152255951","modifier":"ulaulaman","tags":"gf"},
{"created":"20200817000524328","creator":"ulaulaman","text":"!! Lavoro\n\nCaporedattore centrale/vicedirettore di [[Edu INAF|https://edu.inaf.it/]]. Vedi tutti i [[miei articoli|https://edu.inaf.it/author/filippelli/]].","title":"Lavoro","modified":"20231019152345473","modifier":"ulaulaman","tags":"about"},
{"title":"Macros","text":"I try to use original Macros' system, whitout any results. After a brief research, I find [[TW5 Magick|http://tw5magick.tiddlyspot.com/]], a collections of various tricks. Here i find a useful and [[very simple way to define macros|http://tw5magick.tiddlyspot.com/#A%20global%20Macro%20-%20with%20limitations]].\n\nFollowing the //how to//, I define the twitterFollowButton, using the [[twitter icon in svg|twitter.svg]]\n\n{{twitterFollowButton||code}}\n\nTo call this macro I use the code `{{twitterFollowButton|username}}`.\n\nIt is also possible define a macro whitout any parameter, like the [[stylesheet for svg|svgStylesheet]] (read also the [[standard way|https://tiddlywiki.com/#Custom%20styles%20by%20data-tags]] to include stylesheet in TiddlyWiki)\n\n{{svgStylesheet||code}}\n\nIn this case I simple call the macro using the code\n\n`\u003Cstyle>{{svgStylesheet}}\u003C/style>`\n\nas first row in [[twitter.svg]].\n","created":"20200815141511591","creator":"ulaulaman","modified":"20200815171212803","modifier":"ulaulaman","tags":"[[how to]] Macros"},
{"title":"Mathematics","type":"text/x-markdown","text":"| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| Hutton's formula | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/hutton_formula.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/hutton_formula.pdf) |\n| Strassnitzky's formula | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/strassnitzky_formula.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/strassnitzky_formula.pdf) |\n| Rolling circle squares itself | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/rolling_circle.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/rolling_circle.pdf) |\n| The Witch of Agnesi | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/agnesi_witch.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/agnesi_witch.pdf) |\n| The Butterfly curve | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/butterfly.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/butterfly.pdf) |\n| Ostomachion | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/ostomachion.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/ostomachion.pdf) |\n| Hexagon's construction | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/hexagon.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/hexagon.pdf) |\n\n### Math without words\n\n| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| Square roots | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/square_roots.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/square_roots.pdf) |\n| Square of *n* | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/squares.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/squares.pdf) |\n| Trisecare un foglio di carta | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/trisecare_pagina.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/trisecare_pagina.pdf) |\n| Difference of two squares | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/differenze_quadrati.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/differenze_quadrati.pdf) |\n| Arctan 1/2 + Arctan 1/3 = pi/4 | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/arctan-pi4.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/arctan-pi4.pdf) |\n| Arctan 1/8 + pi/4 + Arctan 1/7 + Arctan 4/7 = pi/2 | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/math/arctan-pi2.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/math/pdf/arctan-pi2.pdf) |\n","created":"20200803172912753","creator":"ulaulaman","modified":"20210201210659677","modifier":"ulaulaman","tags":"tikzdraw"},
{"title":"Menu","type":"text/x-markdown","text":"{{{ [tag[Menu]] }}}","caption":"Menu","created":"20200728100348001","creator":"ulaulaman","list-before":"$:/core/ui/SideBar/Open","modified":"20200815120931060","modifier":"ulaulaman","tags":"$:/tags/SideBar"},
{"title":"Physics","type":"text/x-markdown","text":"| Title | Source | Pdf |\n|:-------------|:------------------|:------|\n| Risposta relativa dei coni dell'occhio | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/risposta_coni.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/risposta_coni.pdf) |\n| Riflessione e rifrazione | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/riflessione-rifrazione.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/riflessione-rifrazione.pdf) |\n| Convection in a glass of water | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/convezione.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/convezione.pdf) |\n| Spin | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/spin.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/spin.pdf) |\n| Radiazione elettromagnetica | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/radiazione_em.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/radiazione_em.pdf) |\n| Effetto Doppler | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/effetto_doppler.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/effetto_doppler.pdf) |\n| Schema di formazione della radiazione cosmica secondaria | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/radiazione_cosmica_secondaria.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/radiazione_cosmica_secondaria.pdf)\n\n### Michelson and Morley's experiment\n\n| Language | Source | Pdf |\n|:-------------|:------------------|:------|\n| english | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/michelson_morley.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/michelson_morley.pdf) |\n| italian | [tex source](https://github.com/ulaulaman/tikzdraw/blob/master/physics/michelson_morley_it.tex) | [pdf](https://github.com/ulaulaman/tikzdraw/blob/master/physics/pdf/michelson_morley_it.pdf) |","created":"20200803172939939","creator":"ulaulaman","modified":"20211011150316905","modifier":"ulaulaman","tags":"tikzdraw"},
2021-10-23 16:58:27 +02:00
{"created":"20211023143326958","creator":"ulaulaman","text":"[img[img/icons8-github-24.png]]\n[img[img/icons8-wikipedia-24.png]]\n\nvia [[icons8|https://icons8.com/]]","tags":"","title":"png icons","modified":"20211023145720781","modifier":"ulaulaman"},
2021-10-23 16:38:39 +02:00
{"created":"20211022230934036","creator":"ulaulaman","text":"!! Presentazioni\n\nRaccolta delle presentazioni che ho realizzato nel corso degli anni. Sono per lo più realizzate con //Beamer//, pacchetto di //LaTeX// costruito allo scopo. Per alcune di esse propongo oltre al //file// .pdf, anche il sorgente .tex. Per poter consultare tutti i //file//, inclusi i sorgenti, \u003Ca class=\"github\" href=\"https://gitea.it/ulaulaman/ebook_presentazioni\">rimando al repository su gitea.it\u003C/a>.\n\n!!!! Liceo Cavalleri di Parabiago\n\nPresentazioni realizzate per una serie di incontri con gli insegnanti al Liceo *Cavalleri* di Parabiago (Milano)\n\n* //L'universo ottico//: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/parabiago/pdf/universo_ottico.pdf]]\n* //Astronomia planetaria: transiti ed esopianeti in classe//: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/parabiago/pdf/transito.pdf]]\n* //Il meraviglioso mondo quantistico//: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/parabiago/pdf/mondo_quantistico.pdf]]\n* //Vincere un Nobel per la fisica con i disegni//: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/parabiago/pdf/feynman.pdf]]\n* //Una storia di paradossi, disuguaglianze e baffi//: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/parabiago/pdf/paradossi_disuguaglianze.pdf]]\n\n//Come scrivere un articolo divulgativo sulla scienza//: intervento in una classe quarta\n\n* Presentazione: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/parabiago/pdf/parabiago_IFS.pdf]]\n* Testo intervento: [[pdf|https://gitea.it/ulaulaman/ebook_presentazioni/src/branch/master/parabiago/pdf/parabiago_IFS-articolo.pdf]]","title":"Presentazioni","modified":"20211023143807480","modifier":"ulaulaman"},
{"title":"svg","text":"[[Source for svg icons|http://svgicons.sparkk.fr/]]","created":"20200815145229557","creator":"ulaulaman","modified":"20200815145300982","modifier":"ulaulaman","tags":"[[how to]] svg"},
2021-10-23 16:58:27 +02:00
{"created":"20200815135325021","creator":"ulaulaman","text":"\u003Cstyle>.svg-icon {\n width: $dim$;\n height: $dim$;\n}\n\n.svg-icon path,\n.svg-icon polygon,\n.svg-icon rect {\n fill: #4691f6;\n}\n\n.svg-icon circle {\n stroke: #4691f6;\n stroke-width: 1;\n}\u003C/style>\n\n\u003C$macrocall $name=\"svgStylesheet\" dim={{!!title}}/>","title":"svgStylesheet","type":"text/vnd.tiddlywiki","modified":"20211023145752833","modifier":"ulaulaman","tags":"Macros template"},
{"title":"Table-of-Contents Macros","type":"text/vnd.tiddlywiki","text":"~TiddlyWiki provides several macros for generating a tree of tiddler links by analysing [[tags|Tagging]]:\n\n;\u003C\u003C.var toc>>\n: A simple tree\n;\u003C\u003C.var toc-expandable>>\n: A tree in which all the branches can be expanded and collapsed\n;\u003C\u003C.var toc-selective-expandable>>\n: A tree in which the non-empty branches can be expanded and collapsed\n;\u003C\u003C.var toc-tabbed-internal-nav>> and \u003C\u003C.var toc-tabbed-external-nav>>\n: A two-panel browser:\n:* on the left, a selectively expandable tree that behaves like a set of vertical tabs\n:* on the right, the content of whichever tiddler the user selects in the tree\n\nThe difference between the last two has to do with what happens when the user clicks a link in the right-hand panel:\n\n;\u003C\u003C.var toc-tabbed-internal-nav>>\n: The target tiddler appears in the right-hand panel, replacing the tiddler that contained the link\n;\u003C\u003C.var toc-tabbed-external-nav>>\n: The target tiddler appears in the normal way (which depends on the user's configured storyview)\n\n!! Structure\n\nThe top level of the tree consists of the tiddlers that carry a particular tag, known as the \u003C\u003C.def \"root tag\">>. Tiddlers tagged with any of those make up the next level down, and so on.\n\nAt each level, the tiddlers can be [[ordered|Order of Tagged Tiddlers]] by means of the \u003C\u003C.field list>> field of the parent tag tiddler. They can also be ordered by the macro's \u003C\u003C.param sort>> parameter.\n\nThe tree displays the \u003C\u003C.field caption>> field of a tiddler if it has one, or the tiddler's title otherwise.\n\nEach tiddler in the tree is normally displayed as a link. To suppress this, give the tiddler a \u003C\u003C.field toc-link>> field with the the value \u003C\u003C.value no>>. In the [[examples|Table-of-Contents Macros (Examples)]], the SecondThree tiddler is set up like this. Clicking such a tiddler in the tree causes its branch to expand or collapse.\n\nThe table of contents is generated as an HTML ordered list. The `\u003Col>` elements always have the class `tc-toc`. Expandable trees have the additional class `tc-toc-expandable`. Selectively expandable trees (including those in the two-panel browser) have `tc-toc-selective-expandable`.\n\nTo make a table of contents appear in the sidebar, see [[How to add a new tab to the sidebar]].\n\n!! Parameters\n\n;tag\n: The root tag that identifies the top level of the tree\n;sort\n: An optional extra [[filter step|Filter Step]], e.g. `sort[title]`\n\nThese two parameters are combined into a single [[filter expression|Filter Expression]] like this:\n\n> `[tag[$tag$]$sort$]`\n\n\u003C\u003C.var toc-tabbed-internal-nav>> and \u003C\u003C.var toc-tabbed-external-nav>> take additional parameters:\n\n;selectedTiddler\n: The title of the [[state tiddler|StateMechanism]] for noting the currently selected tiddler, defaulting to `$:/temp/toc/selectedTiddler`. It is recommended that this be a [[system tiddler|SystemTiddlers]]\n;unselectedText\n: The text to display when no tiddler is selected in the tree\n;missingText\n: The text to display if the selected tiddler doesn't exist\n;template\n: Optionally, the title of a tiddler to use as a [[template|TemplateTiddlers]] for transcluding the selected tiddler into the right-hand panel\n\n[[Examples|Table-of-Contents Macros (Examples)]]\n","created":"20140919155729620","modified":"20150221224034000","tags":"Macros [[Core Macros]]"},
{"title":"TagTable","text":"Following the tricks pubblished by [[Stephan Hradek on TW5 Magick|http://tw5magick.tiddlyspot.com/]] I create a macro that shows tiddlers from a specific tag in a styled table. Because the syntax is a bit difficult to remember (`{{menu||$:/core/macros/ulaulaman/TagTable}}`), I also create a javascript in order to simplify the syntax in this way: `\u003C\u003CTagTable \"Menu\">>`:\n\n\u003C\u003CTagTable \"Menu\">>\n\nIf you want use the macro, drag the following link in your TiddlyWiki, and don't forget to save and refresh:\n\n* $:/core/macros/ulaulaman/TagTable\n* $:/macros/ulaulaman/TagTable.js\n\nThe stylesheet is here:\n\n* $:/core/Stylesheet/blue-table","created":"20200816122927690","creator":"ulaulaman","modified":"20200816230503661","modifier":"ulaulaman","tags":"Macros"},
2021-10-26 01:12:48 +02:00
{"created":"20200803183532401","creator":"ulaulaman","text":"\u003Ca href=\"https://github.com/ulaulaman/tikzdraw\" class=\"badge badge-dark\" target=\"github\">Repository ~GitHub\u003C/a>\n\nUn //repository// di grafiche e infografiche realizzate con il pacchetto //tikzdraw// di LaTeX.\n\n\u003C\u003Ctabs tabsList:\"[tag[tikzdraw]!tag[advanced]]\" default:\"Infographics\" class:\"tc-vertical\">>","title":"TikzDraw","modified":"20211025230951690","modifier":"ulaulaman","tags":"latex Menu github"},
{"title":"twitter.svg","type":"text/vnd.tiddlywiki","text":"\u003Csvg class=\"svg-icon\" viewBox=\"0 0 20 20\">\n\t\t\t\t\t\t\t\u003Cpath fill=\"none\" d=\"M14.467,6.707c-0.34,0.198-0.715,0.342-1.115,0.419c-0.318-0.335-0.775-0.545-1.279-0.545c-0.969,0-1.754,0.773-1.754,1.727c0,0.135,0.015,0.267,0.045,0.394C8.905,8.628,7.612,7.94,6.747,6.896C6.596,7.151,6.509,7.448,6.509,7.764c0,0.599,0.31,1.128,0.78,1.438C7.002,9.192,6.732,9.115,6.495,8.985c0,0.007,0,0.014,0,0.021c0,0.837,0.605,1.535,1.408,1.694c-0.147,0.04-0.302,0.06-0.462,0.06c-0.113,0-0.223-0.011-0.33-0.031c0.223,0.687,0.871,1.186,1.638,1.199c-0.6,0.464-1.356,0.739-2.179,0.739c-0.142,0-0.281-0.007-0.418-0.023c0.777,0.489,1.699,0.775,2.689,0.775c3.228,0,4.991-2.63,4.991-4.913c0-0.075-0.002-0.149-0.004-0.223c0.342-0.244,0.639-0.547,0.875-0.894c-0.316,0.137-0.652,0.23-1.008,0.272C14.057,7.448,14.336,7.11,14.467,6.707 M10,0.594c-5.195,0-9.406,4.211-9.406,9.406c0,5.195,4.211,9.406,9.406,9.406c5.196,0,9.407-4.211,9.407-9.406C19.406,4.805,15.195,0.594,10,0.594 M10,18.552c-4.723,0-8.551-3.829-8.551-8.552S5.277,1.449,10,1.449c4.723,0,8.551,3.829,8.551,8.551S14.723,18.552,10,18.552\">\u003C/path>\n\t\t\t\t\t\t\u003C/svg>","created":"20200815134926535","creator":"ulaulaman","modified":"20200815170853450","modifier":"ulaulaman","tags":"svg"},
2021-10-23 15:52:28 +02:00
{"created":"20200815121123949","creator":"ulaulaman","text":"\\define twitterFollowButton(username)\n\u003Ca href=\"https://twitter.com/$username$\">{{twitter.svg}}\u003C/a>\n\\end\n\n\u003C$macrocall $name=\"twitterFollowButton\" username={{!!title}}/>","title":"twitterFollowButton","modified":"20211023135041791","modifier":"ulaulaman","tags":"Macros"},
{"created":"20200815123143434","creator":"ulaulaman","text":"\u003Ctr>\u003Ctd width=\"50%;\">{{ulaulaman||twitterFollowButton}}\u003C/td>\u003Ctd width=\"50%;\">{{edu_inaf||twitterFollowButton}}\u003C/td>\u003C/tr>","title":"twitterFollowButtonExample","modified":"20211023134941939","modifier":"ulaulaman","tags":"example"},
2021-10-23 16:35:28 +02:00
{"created":"20200728124602616","creator":"ulaulaman","text":"\u003C\u003Cimage-pretty img:\"$:/favicon.ico\" width:\"50px\" align:\"left\" tooltip:\"icon and user avatar\">> [[twitter|https://twitter.com/ulaulaman]] | [[mastodon|https://mastodon.social/web/@ulaulaman]] | [[github|https://github.com/ulaulaman]] | [[instagram|https://www.instagram.com/ulaulaman]] | [[deviantart|https://www.deviantart.com/ulaulaman]]\n\n\u003Csmall>Powered by [[whitespace theme|http://j.d.whitespace.tiddlyspot.com/]]\u003C/small>","title":"ulaulaman","caption":"ulaulaman","list-before":"Menu","modified":"20211023134225538","modifier":"ulaulaman","tags":"$:/tags/SideBar"},
{"title":"WordpressPlugin","text":"!! Wordpress Plugin\n\n\u003C\u003CTagTable \"Wordpress\">>","created":"20200829173457215","creator":"ulaulaman","modified":"20200829173737366","modifier":"ulaulaman","tags":"Menu"}
]</script><div id="storeArea" style="display:none;"></div>
2020-07-28 12:10:58 +02:00
<!--~~ Library modules ~~-->
<div id="libraryModules" style="display:none;">
<script data-tiddler-library="yes" data-tiddler-title="$:/library/sjcl.js" data-tiddler-type="application/javascript" type="text/javascript">"use strict";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a},notReady:function(a){this.toString=function(){return"NOT READY: "+this.message};this.message=a}}};
sjcl.cipher.aes=function(a){this.s[0][0][0]||this.O();var b,c,d,e,f=this.s[0][4],g=this.s[1];b=a.length;var h=1;if(4!==b&&6!==b&&8!==b)throw new sjcl.exception.invalid("invalid aes key size");this.b=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(0===a%b||8===b&&4===a%b)c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255],0===a%b&&(c=c<<8^c>>>24^h<<24,h=h<<1^283*(h>>7));d[a]=d[a-b]^c}for(b=0;a;b++,a--)c=d[b&3?a:a-4],e[b]=4>=a||4>b?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^g[3][f[c&
255]]};
sjcl.cipher.aes.prototype={encrypt:function(a){return t(this,a,0)},decrypt:function(a){return t(this,a,1)},s:[[[],[],[],[],[]],[[],[],[],[],[]]],O:function(){var a=this.s[0],b=this.s[1],c=a[4],d=b[4],e,f,g,h=[],k=[],l,n,m,p;for(e=0;0x100>e;e++)k[(h[e]=e<<1^283*(e>>7))^e]=e;for(f=g=0;!c[f];f^=l||1,g=k[g]||1)for(m=g^g<<1^g<<2^g<<3^g<<4,m=m>>8^m&255^99,c[f]=m,d[m]=f,n=h[e=h[l=h[f]]],p=0x1010101*n^0x10001*e^0x101*l^0x1010100*f,n=0x101*h[m]^0x1010100*m,e=0;4>e;e++)a[e][f]=n=n<<24^n>>>8,b[e][m]=p=p<<24^p>>>8;for(e=
0;5>e;e++)a[e]=a[e].slice(0),b[e]=b[e].slice(0)}};
function t(a,b,c){if(4!==b.length)throw new sjcl.exception.invalid("invalid aes block size");var d=a.b[c],e=b[0]^d[0],f=b[c?3:1]^d[1],g=b[2]^d[2];b=b[c?1:3]^d[3];var h,k,l,n=d.length/4-2,m,p=4,r=[0,0,0,0];h=a.s[c];a=h[0];var q=h[1],v=h[2],w=h[3],x=h[4];for(m=0;m<n;m++)h=a[e>>>24]^q[f>>16&255]^v[g>>8&255]^w[b&255]^d[p],k=a[f>>>24]^q[g>>16&255]^v[b>>8&255]^w[e&255]^d[p+1],l=a[g>>>24]^q[b>>16&255]^v[e>>8&255]^w[f&255]^d[p+2],b=a[b>>>24]^q[e>>16&255]^v[f>>8&255]^w[g&255]^d[p+3],p+=4,e=h,f=k,g=l;for(m=
0;4>m;m++)r[c?3&-m:m]=x[e>>>24]<<24^x[f>>16&255]<<16^x[g>>8&255]<<8^x[b&255]^d[p++],h=e,e=f,f=g,g=b,b=h;return r}
sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<<c)-1},concat:function(a,b){if(0===a.length||0===b.length)return a.concat(b);var c=a[a.length-1],d=sjcl.bitArray.getPartial(c);return 32===d?a.concat(b):sjcl.bitArray.$(b,d,c|0,a.slice(0,a.length-1))},bitLength:function(a){var b=a.length;return 0===
b?0:32*(b-1)+sjcl.bitArray.getPartial(a[b-1])},clamp:function(a,b){if(32*a.length<b)return a;a=a.slice(0,Math.ceil(b/32));var c=a.length;b=b&31;0<c&&b&&(a[c-1]=sjcl.bitArray.partial(b,a[c-1]&2147483648>>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d<a.length;d++)c|=a[d]^b[d];return 0===
c},$:function(a,b,c,d){var e;e=0;for(void 0===d&&(d=[]);32<=b;b-=32)d.push(c),c=0;if(0===b)return d.concat(a);for(e=0;e<a.length;e++)d.push(c|a[e]>>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32<b+a?c:d.pop(),1));return d},i:function(a,b){return[a[0]^b[0],a[1]^b[1],a[2]^b[2],a[3]^b[3]]},byteswapM:function(a){var b,c;for(b=0;b<a.length;++b)c=a[b],a[b]=c>>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}};
sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d<c/8;d++)0===(d&3)&&(e=a[d/4]),b+=String.fromCharCode(e>>>8>>>8>>>8),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c<a.length;c++)d=d<<8|a.charCodeAt(c),3===(c&3)&&(b.push(d),d=0);c&3&&b.push(sjcl.bitArray.partial(8*(c&3),d));return b}};
sjcl.codec.hex={fromBits:function(a){var b="",c;for(c=0;c<a.length;c++)b+=((a[c]|0)+0xf00000000000).toString(16).substr(4);return b.substr(0,sjcl.bitArray.bitLength(a)/4)},toBits:function(a){var b,c=[],d;a=a.replace(/\s|0x/g,"");d=a.length;a=a+"00000000";for(b=0;b<a.length;b+=8)c.push(parseInt(a.substr(b,8),16)^0);return sjcl.bitArray.clamp(c,4*d)}};
sjcl.codec.base32={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",X:"0123456789ABCDEFGHIJKLMNOPQRSTUV",BITS:32,BASE:5,REMAINING:27,fromBits:function(a,b,c){var d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f="",g=0,h=sjcl.codec.base32.B,k=0,l=sjcl.bitArray.bitLength(a);c&&(h=sjcl.codec.base32.X);for(c=0;f.length*d<l;)f+=h.charAt((k^a[c]>>>g)>>>e),g<d?(k=a[c]<<d-g,g+=e,c++):(k<<=d,g-=d);for(;f.length&7&&!b;)f+="=";return f},toBits:function(a,b){a=a.replace(/\s|=/g,"").toUpperCase();var c=sjcl.codec.base32.BITS,
d=sjcl.codec.base32.BASE,e=sjcl.codec.base32.REMAINING,f=[],g,h=0,k=sjcl.codec.base32.B,l=0,n,m="base32";b&&(k=sjcl.codec.base32.X,m="base32hex");for(g=0;g<a.length;g++){n=k.indexOf(a.charAt(g));if(0>n){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid("this isn't "+m+"!");}h>e?(h-=e,f.push(l^n>>>h),l=n<<c-h):(h+=d,l^=n<<c-h)}h&56&&f.push(sjcl.bitArray.partial(h&56,l,1));return f}};
sjcl.codec.base32hex={fromBits:function(a,b){return sjcl.codec.base32.fromBits(a,b,1)},toBits:function(a){return sjcl.codec.base32.toBits(a,1)}};
sjcl.codec.base64={B:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",fromBits:function(a,b,c){var d="",e=0,f=sjcl.codec.base64.B,g=0,h=sjcl.bitArray.bitLength(a);c&&(f=f.substr(0,62)+"-_");for(c=0;6*d.length<h;)d+=f.charAt((g^a[c]>>>e)>>>26),6>e?(g=a[c]<<6-e,e+=26,c++):(g<<=6,e-=6);for(;d.length&3&&!b;)d+="=";return d},toBits:function(a,b){a=a.replace(/\s|=/g,"");var c=[],d,e=0,f=sjcl.codec.base64.B,g=0,h;b&&(f=f.substr(0,62)+"-_");for(d=0;d<a.length;d++){h=f.indexOf(a.charAt(d));
if(0>h)throw new sjcl.exception.invalid("this isn't base64!");26<e?(e-=26,c.push(g^h>>>e),g=h<<32-e):(e+=6,g^=h<<32-e)}e&56&&c.push(sjcl.bitArray.partial(e&56,g,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.b[0]||this.O();a?(this.F=a.F.slice(0),this.A=a.A.slice(0),this.l=a.l):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()};
sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.F=this.Y.slice(0);this.A=[];this.l=0;return this},update:function(a){"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.A=sjcl.bitArray.concat(this.A,a);b=this.l;a=this.l=b+sjcl.bitArray.bitLength(a);if(0x1fffffffffffff<a)throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits");if("undefined"!==typeof Uint32Array){var d=new Uint32Array(c),e=0;for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,d.subarray(16*e,
16*(e+1))),e+=1;c.splice(0,16*e)}else for(b=512+b-(512+b&0x1ff);b<=a;b+=512)u(this,c.splice(0,16));return this},finalize:function(){var a,b=this.A,c=this.F,b=sjcl.bitArray.concat(b,[sjcl.bitArray.partial(1,1)]);for(a=b.length+2;a&15;a++)b.push(0);b.push(Math.floor(this.l/0x100000000));for(b.push(this.l|0);b.length;)u(this,b.splice(0,16));this.reset();return c},Y:[],b:[],O:function(){function a(a){return 0x100000000*(a-Math.floor(a))|0}for(var b=0,c=2,d,e;64>b;c++){e=!0;for(d=2;d*d<=c;d++)if(0===c%d){e=
!1;break}e&&(8>b&&(this.Y[b]=a(Math.pow(c,.5))),this.b[b]=a(Math.pow(c,1/3)),b++)}}};
function u(a,b){var c,d,e,f=a.F,g=a.b,h=f[0],k=f[1],l=f[2],n=f[3],m=f[4],p=f[5],r=f[6],q=f[7];for(c=0;64>c;c++)16>c?d=b[c]:(d=b[c+1&15],e=b[c+14&15],d=b[c&15]=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+b[c&15]+b[c+9&15]|0),d=d+q+(m>>>6^m>>>11^m>>>25^m<<26^m<<21^m<<7)+(r^m&(p^r))+g[c],q=r,r=p,p=m,m=n+d|0,n=l,l=k,k=h,h=d+(k&l^n&(k^l))+(k>>>2^k>>>13^k>>>22^k<<30^k<<19^k<<10)|0;f[0]=f[0]+h|0;f[1]=f[1]+k|0;f[2]=f[2]+l|0;f[3]=f[3]+n|0;f[4]=f[4]+m|0;f[5]=f[5]+p|0;f[6]=f[6]+r|0;f[7]=
f[7]+q|0}
sjcl.mode.ccm={name:"ccm",G:[],listenProgress:function(a){sjcl.mode.ccm.G.push(a)},unListenProgress:function(a){a=sjcl.mode.ccm.G.indexOf(a);-1<a&&sjcl.mode.ccm.G.splice(a,1)},fa:function(a){var b=sjcl.mode.ccm.G.slice(),c;for(c=0;c<b.length;c+=1)b[c](a)},encrypt:function(a,b,c,d,e){var f,g=b.slice(0),h=sjcl.bitArray,k=h.bitLength(c)/8,l=h.bitLength(g)/8;e=e||64;d=d||[];if(7>k)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;4>f&&l>>>8*f;f++);f<15-k&&(f=15-k);c=h.clamp(c,
8*(15-f));b=sjcl.mode.ccm.V(a,b,c,d,e,f);g=sjcl.mode.ccm.C(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),k=f.clamp(b,h-e),l=f.bitSlice(b,h-e),h=(h-e)/8;if(7>g)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;4>b&&h>>>8*b;b++);b<15-g&&(b=15-g);c=f.clamp(c,8*(15-b));k=sjcl.mode.ccm.C(a,k,c,l,e,b);a=sjcl.mode.ccm.V(a,k.data,c,d,e,b);if(!f.equal(k.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match");
return k.data},na:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,k=h.i;d=[h.partial(8,(b.length?64:0)|d-2<<2|f-1)];d=h.concat(d,c);d[3]|=e;d=a.encrypt(d);if(b.length)for(c=h.bitLength(b)/8,65279>=c?g=[h.partial(16,c)]:0xffffffff>=c&&(g=h.concat([h.partial(16,65534)],[c])),g=h.concat(g,b),b=0;b<g.length;b+=4)d=a.encrypt(k(d,g.slice(b,b+4).concat([0,0,0])));return d},V:function(a,b,c,d,e,f){var g=sjcl.bitArray,h=g.i;e/=8;if(e%2||4>e||16<e)throw new sjcl.exception.invalid("ccm: invalid tag length");
if(0xffffffff<d.length||0xffffffff<b.length)throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data");c=sjcl.mode.ccm.na(a,d,c,e,g.bitLength(b)/8,f);for(d=0;d<b.length;d+=4)c=a.encrypt(h(c,b.slice(d,d+4).concat([0,0,0])));return g.clamp(c,8*e)},C:function(a,b,c,d,e,f){var g,h=sjcl.bitArray;g=h.i;var k=b.length,l=h.bitLength(b),n=k/50,m=n;c=h.concat([h.partial(8,f-1)],c).concat([0,0,0]).slice(0,4);d=h.bitSlice(g(d,a.encrypt(c)),0,e);if(!k)return{tag:d,data:[]};for(g=0;g<k;g+=4)g>n&&(sjcl.mode.ccm.fa(g/
k),n+=m),c[3]++,e=a.encrypt(c),b[g]^=e[0],b[g+1]^=e[1],b[g+2]^=e[2],b[g+3]^=e[3];return{tag:d,data:h.clamp(b,l)}}};
sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.S,k=sjcl.bitArray,l=k.i,n=[0,0,0,0];c=h(a.encrypt(c));var m,p=[];d=d||[];e=e||64;for(g=0;g+4<b.length;g+=4)m=b.slice(g,g+4),n=l(n,m),p=p.concat(l(c,a.encrypt(l(c,m)))),c=h(c);m=b.slice(g);b=k.bitLength(m);g=a.encrypt(l(c,[0,0,0,b]));m=k.clamp(l(m.concat([0,0,0]),g),b);n=l(n,l(m.concat([0,0,0]),g));n=a.encrypt(l(n,l(c,h(c))));
d.length&&(n=l(n,f?d:sjcl.mode.ocb2.pmac(a,d)));return p.concat(k.concat(m,k.clamp(n,e)))},decrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");e=e||64;var g=sjcl.mode.ocb2.S,h=sjcl.bitArray,k=h.i,l=[0,0,0,0],n=g(a.encrypt(c)),m,p,r=sjcl.bitArray.bitLength(b)-e,q=[];d=d||[];for(c=0;c+4<r/32;c+=4)m=k(n,a.decrypt(k(n,b.slice(c,c+4)))),l=k(l,m),q=q.concat(m),n=g(n);p=r-32*c;m=a.encrypt(k(n,[0,0,0,p]));m=k(m,h.clamp(b.slice(c),p).concat([0,
0,0]));l=k(l,m);l=a.encrypt(k(l,k(n,g(n))));d.length&&(l=k(l,f?d:sjcl.mode.ocb2.pmac(a,d)));if(!h.equal(h.clamp(l,e),h.bitSlice(b,r)))throw new sjcl.exception.corrupt("ocb: tag doesn't match");return q.concat(h.clamp(m,p))},pmac:function(a,b){var c,d=sjcl.mode.ocb2.S,e=sjcl.bitArray,f=e.i,g=[0,0,0,0],h=a.encrypt([0,0,0,0]),h=f(h,d(d(h)));for(c=0;c+4<b.length;c+=4)h=d(h),g=f(g,a.encrypt(f(h,b.slice(c,c+4))));c=b.slice(c);128>e.bitLength(c)&&(h=f(h,d(h)),c=e.concat(c,[-2147483648,0,0,0]));g=f(g,c);
return a.encrypt(f(d(f(h,d(h))),g))},S:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^135*(a[0]>>>31)]}};
sjcl.mode.gcm={name:"gcm",encrypt:function(a,b,c,d,e){var f=b.slice(0);b=sjcl.bitArray;d=d||[];a=sjcl.mode.gcm.C(!0,a,f,d,c,e||128);return b.concat(a.data,a.tag)},decrypt:function(a,b,c,d,e){var f=b.slice(0),g=sjcl.bitArray,h=g.bitLength(f);e=e||128;d=d||[];e<=h?(b=g.bitSlice(f,h-e),f=g.bitSlice(f,0,h-e)):(b=f,f=[]);a=sjcl.mode.gcm.C(!1,a,f,d,c,e);if(!g.equal(a.tag,b))throw new sjcl.exception.corrupt("gcm: tag doesn't match");return a.data},ka:function(a,b){var c,d,e,f,g,h=sjcl.bitArray.i;e=[0,0,
0,0];f=b.slice(0);for(c=0;128>c;c++){(d=0!==(a[Math.floor(c/32)]&1<<31-c%32))&&(e=h(e,f));g=0!==(f[3]&1);for(d=3;0<d;d--)f[d]=f[d]>>>1|(f[d-1]&1)<<31;f[0]>>>=1;g&&(f[0]^=-0x1f000000)}return e},j:function(a,b,c){var d,e=c.length;b=b.slice(0);for(d=0;d<e;d+=4)b[0]^=0xffffffff&c[d],b[1]^=0xffffffff&c[d+1],b[2]^=0xffffffff&c[d+2],b[3]^=0xffffffff&c[d+3],b=sjcl.mode.gcm.ka(b,a);return b},C:function(a,b,c,d,e,f){var g,h,k,l,n,m,p,r,q=sjcl.bitArray;m=c.length;p=q.bitLength(c);r=q.bitLength(d);h=q.bitLength(e);
g=b.encrypt([0,0,0,0]);96===h?(e=e.slice(0),e=q.concat(e,[1])):(e=sjcl.mode.gcm.j(g,[0,0,0,0],e),e=sjcl.mode.gcm.j(g,e,[0,0,Math.floor(h/0x100000000),h&0xffffffff]));h=sjcl.mode.gcm.j(g,[0,0,0,0],d);n=e.slice(0);d=h.slice(0);a||(d=sjcl.mode.gcm.j(g,h,c));for(l=0;l<m;l+=4)n[3]++,k=b.encrypt(n),c[l]^=k[0],c[l+1]^=k[1],c[l+2]^=k[2],c[l+3]^=k[3];c=q.clamp(c,p);a&&(d=sjcl.mode.gcm.j(g,h,c));a=[Math.floor(r/0x100000000),r&0xffffffff,Math.floor(p/0x100000000),p&0xffffffff];d=sjcl.mode.gcm.j(g,d,a);k=b.encrypt(e);
d[0]^=k[0];d[1]^=k[1];d[2]^=k[2];d[3]^=k[3];return{tag:q.bitSlice(d,0,f),data:c}}};sjcl.misc.hmac=function(a,b){this.W=b=b||sjcl.hash.sha256;var c=[[],[]],d,e=b.prototype.blockSize/32;this.w=[new b,new b];a.length>e&&(a=b.hash(a));for(d=0;d<e;d++)c[0][d]=a[d]^909522486,c[1][d]=a[d]^1549556828;this.w[0].update(c[0]);this.w[1].update(c[1]);this.R=new b(this.w[0])};
sjcl.misc.hmac.prototype.encrypt=sjcl.misc.hmac.prototype.mac=function(a){if(this.aa)throw new sjcl.exception.invalid("encrypt on already updated hmac called!");this.update(a);return this.digest(a)};sjcl.misc.hmac.prototype.reset=function(){this.R=new this.W(this.w[0]);this.aa=!1};sjcl.misc.hmac.prototype.update=function(a){this.aa=!0;this.R.update(a)};sjcl.misc.hmac.prototype.digest=function(){var a=this.R.finalize(),a=(new this.W(this.w[1])).update(a).finalize();this.reset();return a};
sjcl.misc.pbkdf2=function(a,b,c,d,e){c=c||1E4;if(0>d||0>c)throw new sjcl.exception.invalid("invalid params to pbkdf2");"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,k,l=[],n=sjcl.bitArray;for(k=1;32*l.length<(d||1);k++){e=f=a.encrypt(n.concat(b,[k]));for(g=1;g<c;g++)for(f=a.encrypt(f),h=0;h<f.length;h++)e[h]^=f[h];l=l.concat(e)}d&&(l=n.clamp(l,d));return l};
sjcl.prng=function(a){this.c=[new sjcl.hash.sha256];this.m=[0];this.P=0;this.H={};this.N=0;this.U={};this.Z=this.f=this.o=this.ha=0;this.b=[0,0,0,0,0,0,0,0];this.h=[0,0,0,0];this.L=void 0;this.M=a;this.D=!1;this.K={progress:{},seeded:{}};this.u=this.ga=0;this.I=1;this.J=2;this.ca=0x10000;this.T=[0,48,64,96,128,192,0x100,384,512,768,1024];this.da=3E4;this.ba=80};
sjcl.prng.prototype={randomWords:function(a,b){var c=[],d;d=this.isReady(b);var e;if(d===this.u)throw new sjcl.exception.notReady("generator isn't seeded");if(d&this.J){d=!(d&this.I);e=[];var f=0,g;this.Z=e[0]=(new Date).valueOf()+this.da;for(g=0;16>g;g++)e.push(0x100000000*Math.random()|0);for(g=0;g<this.c.length&&(e=e.concat(this.c[g].finalize()),f+=this.m[g],this.m[g]=0,d||!(this.P&1<<g));g++);this.P>=1<<this.c.length&&(this.c.push(new sjcl.hash.sha256),this.m.push(0));this.f-=f;f>this.o&&(this.o=
f);this.P++;this.b=sjcl.hash.sha256.hash(this.b.concat(e));this.L=new sjcl.cipher.aes(this.b);for(d=0;4>d&&(this.h[d]=this.h[d]+1|0,!this.h[d]);d++);}for(d=0;d<a;d+=4)0===(d+1)%this.ca&&y(this),e=z(this),c.push(e[0],e[1],e[2],e[3]);y(this);return c.slice(0,a)},setDefaultParanoia:function(a,b){if(0===a&&"Setting paranoia=0 will ruin your security; use it only for testing"!==b)throw new sjcl.exception.invalid("Setting paranoia=0 will ruin your security; use it only for testing");this.M=a},addEntropy:function(a,
b,c){c=c||"user";var d,e,f=(new Date).valueOf(),g=this.H[c],h=this.isReady(),k=0;d=this.U[c];void 0===d&&(d=this.U[c]=this.ha++);void 0===g&&(g=this.H[c]=0);this.H[c]=(this.H[c]+1)%this.c.length;switch(typeof a){case "number":void 0===b&&(b=1);this.c[g].update([d,this.N++,1,b,f,1,a|0]);break;case "object":c=Object.prototype.toString.call(a);if("[object Uint32Array]"===c){e=[];for(c=0;c<a.length;c++)e.push(a[c]);a=e}else for("[object Array]"!==c&&(k=1),c=0;c<a.length&&!k;c++)"number"!==typeof a[c]&&
(k=1);if(!k){if(void 0===b)for(c=b=0;c<a.length;c++)for(e=a[c];0<e;)b++,e=e>>>1;this.c[g].update([d,this.N++,2,b,f,a.length].concat(a))}break;case "string":void 0===b&&(b=a.length);this.c[g].update([d,this.N++,3,b,f,a.length]);this.c[g].update(a);break;default:k=1}if(k)throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string");this.m[g]+=b;this.f+=b;h===this.u&&(this.isReady()!==this.u&&A("seeded",Math.max(this.o,this.f)),A("progress",this.getProgress()))},
isReady:function(a){a=this.T[void 0!==a?a:this.M];return this.o&&this.o>=a?this.m[0]>this.ba&&(new Date).valueOf()>this.Z?this.J|this.I:this.I:this.f>=a?this.J|this.u:this.u},getProgress:function(a){a=this.T[a?a:this.M];return this.o>=a?1:this.f>a?1:this.f/a},startCollectors:function(){if(!this.D){this.a={loadTimeCollector:B(this,this.ma),mouseCollector:B(this,this.oa),keyboardCollector:B(this,this.la),accelerometerCollector:B(this,this.ea),touchCollector:B(this,this.qa)};if(window.addEventListener)window.addEventListener("load",
this.a.loadTimeCollector,!1),window.addEventListener("mousemove",this.a.mouseCollector,!1),window.addEventListener("keypress",this.a.keyboardCollector,!1),window.addEventListener("devicemotion",this.a.accelerometerCollector,!1),window.addEventListener("touchmove",this.a.touchCollector,!1);else if(document.attachEvent)document.attachEvent("onload",this.a.loadTimeCollector),document.attachEvent("onmousemove",this.a.mouseCollector),document.attachEvent("keypress",this.a.keyboardCollector);else throw new sjcl.exception.bug("can't attach event");
this.D=!0}},stopCollectors:function(){this.D&&(window.removeEventListener?(window.removeEventListener("load",this.a.loadTimeCollector,!1),window.removeEventListener("mousemove",this.a.mouseCollector,!1),window.removeEventListener("keypress",this.a.keyboardCollector,!1),window.removeEventListener("devicemotion",this.a.accelerometerCollector,!1),window.removeEventListener("touchmove",this.a.touchCollector,!1)):document.detachEvent&&(document.detachEvent("onload",this.a.loadTimeCollector),document.detachEvent("onmousemove",
this.a.mouseCollector),document.detachEvent("keypress",this.a.keyboardCollector)),this.D=!1)},addEventListener:function(a,b){this.K[a][this.ga++]=b},removeEventListener:function(a,b){var c,d,e=this.K[a],f=[];for(d in e)e.hasOwnProperty(d)&&e[d]===b&&f.push(d);for(c=0;c<f.length;c++)d=f[c],delete e[d]},la:function(){C(this,1)},oa:function(a){var b,c;try{b=a.x||a.clientX||a.offsetX||0,c=a.y||a.clientY||a.offsetY||0}catch(d){c=b=0}0!=b&&0!=c&&this.addEntropy([b,c],2,"mouse");C(this,0)},qa:function(a){a=
a.touches[0]||a.changedTouches[0];this.addEntropy([a.pageX||a.clientX,a.pageY||a.clientY],1,"touch");C(this,0)},ma:function(){C(this,2)},ea:function(a){a=a.accelerationIncludingGravity.x||a.accelerationIncludingGravity.y||a.accelerationIncludingGravity.z;if(window.orientation){var b=window.orientation;"number"===typeof b&&this.addEntropy(b,1,"accelerometer")}a&&this.addEntropy(a,2,"accelerometer");C(this,0)}};
function A(a,b){var c,d=sjcl.random.K[a],e=[];for(c in d)d.hasOwnProperty(c)&&e.push(d[c]);for(c=0;c<e.length;c++)e[c](b)}function C(a,b){"undefined"!==typeof window&&window.performance&&"function"===typeof window.performance.now?a.addEntropy(window.performance.now(),b,"loadtime"):a.addEntropy((new Date).valueOf(),b,"loadtime")}function y(a){a.b=z(a).concat(z(a));a.L=new sjcl.cipher.aes(a.b)}function z(a){for(var b=0;4>b&&(a.h[b]=a.h[b]+1|0,!a.h[b]);b++);return a.L.encrypt(a.h)}
function B(a,b){return function(){b.apply(a,arguments)}}sjcl.random=new sjcl.prng(6);
a:try{var D,E,F,G;if(G="undefined"!==typeof module&&module.exports){var H;try{H=require("crypto")}catch(a){H=null}G=E=H}if(G&&E.randomBytes)D=E.randomBytes(128),D=new Uint32Array((new Uint8Array(D)).buffer),sjcl.random.addEntropy(D,1024,"crypto['randomBytes']");else if("undefined"!==typeof window&&"undefined"!==typeof Uint32Array){F=new Uint32Array(32);if(window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(F);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(F);
else break a;sjcl.random.addEntropy(F,1024,"crypto['getRandomValues']")}}catch(a){"undefined"!==typeof window&&window.console&&(console.log("There was an error collecting entropy from the browser:"),console.log(a))}
sjcl.json={defaults:{v:1,iter:1E4,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},ja:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.g({iv:sjcl.random.randomWords(4,0)},e.defaults),g;e.g(f,c);c=f.adata;"string"===typeof f.salt&&(f.salt=sjcl.codec.base64.toBits(f.salt));"string"===typeof f.iv&&(f.iv=sjcl.codec.base64.toBits(f.iv));if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||"string"===typeof a&&100>=f.iter||64!==f.ts&&96!==f.ts&&128!==f.ts||128!==f.ks&&192!==f.ks&&0x100!==f.ks||2>f.iv.length||
4<f.iv.length)throw new sjcl.exception.invalid("json encrypt: invalid parameters");"string"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,f),a=g.key.slice(0,f.ks/32),f.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.publicKey&&(g=a.kem(),f.kemtag=g.tag,a=g.key.slice(0,f.ks/32));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));"string"===typeof c&&(f.adata=c=sjcl.codec.utf8String.toBits(c));g=new sjcl.cipher[f.cipher](a);e.g(d,f);d.key=a;f.ct="ccm"===f.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&
b instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.encrypt(g,b,f.iv,c,f.ts):sjcl.mode[f.mode].encrypt(g,b,f.iv,c,f.ts);return f},encrypt:function(a,b,c,d){var e=sjcl.json,f=e.ja.apply(e,arguments);return e.encode(f)},ia:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json;b=e.g(e.g(e.g({},e.defaults),b),c,!0);var f,g;f=b.adata;"string"===typeof b.salt&&(b.salt=sjcl.codec.base64.toBits(b.salt));"string"===typeof b.iv&&(b.iv=sjcl.codec.base64.toBits(b.iv));if(!sjcl.mode[b.mode]||!sjcl.cipher[b.cipher]||"string"===
typeof a&&100>=b.iter||64!==b.ts&&96!==b.ts&&128!==b.ts||128!==b.ks&&192!==b.ks&&0x100!==b.ks||!b.iv||2>b.iv.length||4<b.iv.length)throw new sjcl.exception.invalid("json decrypt: invalid parameters");"string"===typeof a?(g=sjcl.misc.cachedPbkdf2(a,b),a=g.key.slice(0,b.ks/32),b.salt=g.salt):sjcl.ecc&&a instanceof sjcl.ecc.elGamal.secretKey&&(a=a.unkem(sjcl.codec.base64.toBits(b.kemtag)).slice(0,b.ks/32));"string"===typeof f&&(f=sjcl.codec.utf8String.toBits(f));g=new sjcl.cipher[b.cipher](a);f="ccm"===
b.mode&&sjcl.arrayBuffer&&sjcl.arrayBuffer.ccm&&b.ct instanceof ArrayBuffer?sjcl.arrayBuffer.ccm.decrypt(g,b.ct,b.iv,b.tag,f,b.ts):sjcl.mode[b.mode].decrypt(g,b.ct,b.iv,f,b.ts);e.g(d,b);d.key=a;return 1===c.raw?f:sjcl.codec.utf8String.fromBits(f)},decrypt:function(a,b,c,d){var e=sjcl.json;return e.ia(a,e.decode(b),c,d)},encode:function(a){var b,c="{",d="";for(b in a)if(a.hasOwnProperty(b)){if(!b.match(/^[a-z0-9]+$/i))throw new sjcl.exception.invalid("json encode: invalid property name");c+=d+'"'+
b+'":';d=",";switch(typeof a[b]){case "number":case "boolean":c+=a[b];break;case "string":c+='"'+escape(a[b])+'"';break;case "object":c+='"'+sjcl.codec.base64.fromBits(a[b],0)+'"';break;default:throw new sjcl.exception.bug("json encode: unsupported type");}}return c+"}"},decode:function(a){a=a.replace(/\s/g,"");if(!a.match(/^\{.*\}$/))throw new sjcl.exception.invalid("json decode: this isn't json!");a=a.replace(/^\{|\}$/g,"").split(/,/);var b={},c,d;for(c=0;c<a.length;c++){if(!(d=a[c].match(/^\s*(?:(["']?)([a-z][a-z0-9]*)\1)\s*:\s*(?:(-?\d+)|"([a-z0-9+\/%*_.@=\-]*)"|(true|false))$/i)))throw new sjcl.exception.invalid("json decode: this isn't json!");
null!=d[3]?b[d[2]]=parseInt(d[3],10):null!=d[4]?b[d[2]]=d[2].match(/^(ct|adata|salt|iv)$/)?sjcl.codec.base64.toBits(d[4]):unescape(d[4]):null!=d[5]&&(b[d[2]]="true"===d[5])}return b},g:function(a,b,c){void 0===a&&(a={});if(void 0===b)return a;for(var d in b)if(b.hasOwnProperty(d)){if(c&&void 0!==a[d]&&a[d]!==b[d])throw new sjcl.exception.invalid("required parameter overridden");a[d]=b[d]}return a},sa:function(a,b){var c={},d;for(d in a)a.hasOwnProperty(d)&&a[d]!==b[d]&&(c[d]=a[d]);return c},ra:function(a,
b){var c={},d;for(d=0;d<b.length;d++)void 0!==a[b[d]]&&(c[b[d]]=a[b[d]]);return c}};sjcl.encrypt=sjcl.json.encrypt;sjcl.decrypt=sjcl.json.decrypt;sjcl.misc.pa={};sjcl.misc.cachedPbkdf2=function(a,b){var c=sjcl.misc.pa,d;b=b||{};d=b.iter||1E3;c=c[a]=c[a]||{};d=c[d]=c[d]||{firstSalt:b.salt&&b.salt.length?b.salt.slice(0):sjcl.random.randomWords(2,0)};c=void 0===b.salt?d.firstSalt:b.salt;d[c]=d[c]||sjcl.misc.pbkdf2(a,c,b.iter);return{key:d[c].slice(0),salt:c.slice(0)}};
"undefined"!==typeof module&&module.exports&&(module.exports=sjcl);"function"===typeof define&&define([],function(){return sjcl});
</script>
</div>
<!--~~ Boot kernel prologue ~~-->
<div id="bootKernelPrefix" style="display:none;">
<script data-tiddler-title="$:/boot/bootprefix.js" data-tiddler-type="application/javascript" type="text/javascript">/*\
title: $:/boot/bootprefix.js
type: application/javascript
This file sets up the globals that need to be available when JavaScript modules are executed in the browser. The overall sequence is:
# BootPrefix.js
# <module definitions>
# Boot.js
See Boot.js for further details of the boot process.
\*/
var _bootprefix = (function($tw) {
"use strict";
$tw = $tw || Object.create(null);
$tw.boot = $tw.boot || Object.create(null);
// Detect platforms
if(!("browser" in $tw)) {
$tw.browser = typeof(window) !== "undefined" ? {} : null;
}
if(!("node" in $tw)) {
$tw.node = typeof(process) === "object" ? {} : null;
}
if(!("nodeWebKit" in $tw)) {
$tw.nodeWebKit = $tw.node && global.window && global.window.nwDispatcher ? {} : null;
}
// Set default boot tasks
$tw.boot.tasks = {
trapErrors: !!($tw.browser && !$tw.node),
readBrowserTiddlers: !!($tw.browser && !$tw.node)
};
/*
Information about each module is kept in an object with these members:
moduleType: type of module
definition: object, function or string defining the module; see below
exports: exports of the module, filled in after execution
The `definition` can be of several types:
* An object can be used to directly specify the exports of the module
* A function with the arguments `module,require,exports` that returns `exports`
* A string function body with the same arguments
Each moduleInfo object is stored in two hashmaps: $tw.modules.titles and $tw.modules.types. The first is indexed by title and the second is indexed by type and then title
*/
$tw.modules = {
titles: {}, // hashmap by module name of moduleInfo
types: {} // hashmap by module type and then name of moduleInfo
};
/*
Define a JavaScript tiddler module for later execution
moduleName: name of module being defined
moduleType: type of module
definition: module definition; see discussion above
*/
$tw.modules.define = function(moduleName,moduleType,definition) {
// Create the moduleInfo
var moduleInfo = {
moduleType: moduleType,
definition: definition,
exports: undefined
};
// If the definition is already an object we can use it as the exports
if(typeof moduleInfo.definition === "object") {
moduleInfo.exports = definition;
}
// Store the module in the titles hashmap
if(Object.prototype.hasOwnProperty.call($tw.modules.titles,moduleName)) {
console.log("Warning: Redefined module - " + moduleName);
}
$tw.modules.titles[moduleName] = moduleInfo;
// Store the module in the types hashmap
if(!Object.prototype.hasOwnProperty.call($tw.modules.types,moduleType)) {
$tw.modules.types[moduleType] = {};
}
if(Object.prototype.hasOwnProperty.call($tw.modules.types[moduleType],moduleName)) {
console.log("Warning: Redefined module - " + moduleName);
}
$tw.modules.types[moduleType][moduleName] = moduleInfo;
};
/*
External JavaScript can populate this array before calling boot.js in order to preload tiddlers
*/
$tw.preloadTiddlers = $tw.preloadTiddlers || [];
/*
Convenience function for pushing a tiddler onto the preloading array
*/
$tw.preloadTiddler = function(fields) {
$tw.preloadTiddlers.push(fields);
};
/*
Convenience function for pushing an array of tiddlers onto the preloading array
*/
$tw.preloadTiddlerArray = function(fieldsArray) {
$tw.preloadTiddlers.push.apply($tw.preloadTiddlers,fieldsArray);
};
return $tw;
});
if(typeof(exports) === "undefined") {
// Set up $tw global for the browser
window.$tw = _bootprefix(window.$tw);
} else {
// Export functionality as a module
exports.bootprefix = _bootprefix;
}
//# sourceURL=$:/boot/bootprefix.js
2020-07-28 12:10:58 +02:00
</script>
</div>
<!--~~ Boot kernel ~~-->
<div id="bootKernel" style="display:none;">
<script data-tiddler-title="$:/boot/boot.js" data-tiddler-type="application/javascript" type="text/javascript">/*\
title: $:/boot/boot.js
type: application/javascript
The main boot kernel for TiddlyWiki. This single file creates a barebones TW environment that is just sufficient to bootstrap the modules containing the main logic of the application.
On the server this file is executed directly to boot TiddlyWiki. In the browser, this file is packed into a single HTML file.
\*/
var _boot = (function($tw) {
/*jslint node: true, browser: true */
/*global modules: false, $tw: false */
"use strict";
// Include bootprefix if we're not given module data
if(!$tw) {
$tw = require("./bootprefix.js").bootprefix();
}
$tw.utils = $tw.utils || Object.create(null);
/////////////////////////// Standard node.js libraries
var fs, path, vm;
if($tw.node) {
fs = require("fs");
path = require("path");
vm = require("vm");
}
/////////////////////////// Utility functions
$tw.boot.log = function(str) {
$tw.boot.logMessages = $tw.boot.logMessages || [];
$tw.boot.logMessages.push(str);
}
/*
Check if an object has a property
*/
$tw.utils.hop = function(object,property) {
return object ? Object.prototype.hasOwnProperty.call(object,property) : false;
};
/*
Determine if a value is an array
*/
$tw.utils.isArray = function(value) {
return Object.prototype.toString.call(value) == "[object Array]";
};
/*
Check if an array is equal by value and by reference.
*/
$tw.utils.isArrayEqual = function(array1,array2) {
if(array1 === array2) {
return true;
}
array1 = array1 || [];
array2 = array2 || [];
if(array1.length !== array2.length) {
return false;
}
return array1.every(function(value,index) {
return value === array2[index];
});
};
/*
Add an entry to a sorted array if it doesn't already exist, while maintaining the sort order
*/
$tw.utils.insertSortedArray = function(array,value) {
var low = 0, high = array.length - 1, mid, cmp;
while(low <= high) {
mid = (low + high) >> 1;
cmp = value.localeCompare(array[mid]);
if(cmp > 0) {
low = mid + 1;
} else if(cmp < 0) {
high = mid - 1;
} else {
return array;
}
}
array.splice(low,0,value);
return array;
};
2020-07-28 12:10:58 +02:00
/*
Push entries onto an array, removing them first if they already exist in the array
array: array to modify (assumed to be free of duplicates)
value: a single value to push or an array of values to push
*/
$tw.utils.pushTop = function(array,value) {
var t,p;
if($tw.utils.isArray(value)) {
// Remove any array entries that are duplicated in the new values
if(value.length !== 0) {
if(array.length !== 0) {
if(value.length < array.length) {
for(t=0; t<value.length; t++) {
p = array.indexOf(value[t]);
if(p !== -1) {
array.splice(p,1);
}
}
} else {
for(t=array.length-1; t>=0; t--) {
p = value.indexOf(array[t]);
if(p !== -1) {
array.splice(t,1);
}
}
}
}
// Push the values on top of the main array
array.push.apply(array,value);
}
} else {
p = array.indexOf(value);
if(p !== -1) {
array.splice(p,1);
}
array.push(value);
}
return array;
};
/*
Determine if a value is a date
*/
$tw.utils.isDate = function(value) {
return Object.prototype.toString.call(value) === "[object Date]";
};
/*
Iterate through all the own properties of an object or array. Callback is invoked with (element,title,object)
*/
$tw.utils.each = function(object,callback) {
var next,f,length;
if(object) {
if(Object.prototype.toString.call(object) == "[object Array]") {
for (f=0, length=object.length; f<length; f++) {
next = callback(object[f],f,object);
if(next === false) {
break;
}
}
} else {
var keys = Object.keys(object);
for (f=0, length=keys.length; f<length; f++) {
var key = keys[f];
next = callback(object[key],key,object);
if(next === false) {
break;
}
}
}
}
};
/*
Helper for making DOM elements
tag: tag name
options: see below
Options include:
namespace: defaults to http://www.w3.org/1999/xhtml
attributes: hashmap of attribute values
style: hashmap of styles
text: text to add as a child node
children: array of further child nodes
innerHTML: optional HTML for element
class: class name(s)
document: defaults to current document
eventListeners: array of event listeners (this option won't work until $tw.utils.addEventListeners() has been loaded)
*/
$tw.utils.domMaker = function(tag,options) {
var doc = options.document || document;
var element = doc.createElementNS(options.namespace || "http://www.w3.org/1999/xhtml",tag);
if(options["class"]) {
element.className = options["class"];
}
if(options.text) {
element.appendChild(doc.createTextNode(options.text));
}
$tw.utils.each(options.children,function(child) {
element.appendChild(child);
});
if(options.innerHTML) {
element.innerHTML = options.innerHTML;
}
$tw.utils.each(options.attributes,function(attribute,name) {
element.setAttribute(name,attribute);
});
$tw.utils.each(options.style,function(value,name) {
element.style[name] = value;
});
if(options.eventListeners) {
$tw.utils.addEventListeners(element,options.eventListeners);
}
return element;
};
/*
Display an error and exit
*/
$tw.utils.error = function(err) {
// Prepare the error message
var errHeading = ( $tw.language == undefined ? "Internal JavaScript Error" : $tw.language.getString("InternalJavaScriptError/Title") ),
promptMsg = ( $tw.language == undefined ? "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser" : $tw.language.getString("InternalJavaScriptError/Hint") );
// Log the error to the console
console.error($tw.node ? "\x1b[1;31m" + err + "\x1b[0m" : err);
if($tw.browser && !$tw.node) {
// Display an error message to the user
var dm = $tw.utils.domMaker,
heading = dm("h1",{text: errHeading}),
prompt = dm("div",{text: promptMsg, "class": "tc-error-prompt"}),
message = dm("div",{text: err, "class":"tc-error-message"}),
button = dm("div",{children: [dm("button",{text: ( $tw.language == undefined ? "close" : $tw.language.getString("Buttons/Close/Caption") )})], "class": "tc-error-prompt"}),
form = dm("form",{children: [heading,prompt,message,button], "class": "tc-error-form"});
document.body.insertBefore(form,document.body.firstChild);
form.addEventListener("submit",function(event) {
document.body.removeChild(form);
event.preventDefault();
return false;
},true);
return null;
} else if(!$tw.browser) {
// Exit if we're under node.js
process.exit(1);
}
};
/*
Use our custom error handler if we're in the browser
*/
if($tw.boot.tasks.trapErrors) {
window.onerror = function(errorMsg,url,lineNumber) {
$tw.utils.error(errorMsg);
return false;
};
}
/*
Extend an object with the properties from a list of source objects
*/
$tw.utils.extend = function(object /*, sourceObjectList */) {
$tw.utils.each(Array.prototype.slice.call(arguments,1),function(source) {
if(source) {
for (var p in source) {
object[p] = source[p];
}
}
});
return object;
};
/*
Fill in any null or undefined properties of an object with the properties from a list of source objects. Each property that is an object is called recursively
*/
$tw.utils.deepDefaults = function(object /*, sourceObjectList */) {
$tw.utils.each(Array.prototype.slice.call(arguments,1),function(source) {
if(source) {
for (var p in source) {
if(object[p] === null || object[p] === undefined) {
object[p] = source[p];
}
if(typeof object[p] === "object" && typeof source[p] === "object") {
$tw.utils.deepDefaults(object[p],source[p]);
}
}
}
});
return object;
};
/*
Convert a URIComponent encoded string to a string safely
*/
$tw.utils.decodeURIComponentSafe = function(s) {
var v = s;
try {
v = decodeURIComponent(s);
} catch(e) {}
return v;
};
/*
Convert a URI encoded string to a string safely
*/
$tw.utils.decodeURISafe = function(s) {
var v = s;
try {
v = decodeURI(s);
} catch(e) {}
return v;
};
2020-07-28 12:10:58 +02:00
/*
Convert "&amp;" to &, "&nbsp;" to nbsp, "&lt;" to <, "&gt;" to > and "&quot;" to "
*/
$tw.utils.htmlDecode = function(s) {
return s.toString().replace(/&lt;/mg,"<").replace(/&nbsp;/mg,"\xA0").replace(/&gt;/mg,">").replace(/&quot;/mg,"\"").replace(/&amp;/mg,"&");
};
/*
Get the browser location.hash. We don't use location.hash because of the way that Firefox auto-urldecodes it (see http://stackoverflow.com/questions/1703552/encoding-of-window-location-hash)
*/
$tw.utils.getLocationHash = function() {
var href = window.location.href;
var idx = href.indexOf('#');
if(idx === -1) {
return "#";
} else if(href.substr(idx + 1,1) === "#" || href.substr(idx + 1,3) === "%23") {
// Special case: ignore location hash if it itself starts with a #
return "#";
} else {
return href.substring(idx);
}
2020-07-28 12:10:58 +02:00
};
/*
Pad a string to a given length with "0"s. Length defaults to 2
*/
$tw.utils.pad = function(value,length) {
length = length || 2;
var s = value.toString();
if(s.length < length) {
s = "000000000000000000000000000".substr(0,length - s.length) + s;
}
return s;
};
// Convert a date into UTC YYYYMMDDHHMMSSmmm format
$tw.utils.stringifyDate = function(value) {
return value.getUTCFullYear() +
$tw.utils.pad(value.getUTCMonth() + 1) +
$tw.utils.pad(value.getUTCDate()) +
$tw.utils.pad(value.getUTCHours()) +
$tw.utils.pad(value.getUTCMinutes()) +
$tw.utils.pad(value.getUTCSeconds()) +
$tw.utils.pad(value.getUTCMilliseconds(),3);
};
// Parse a date from a UTC YYYYMMDDHHMMSSmmm format string
$tw.utils.parseDate = function(value) {
if(typeof value === "string") {
var negative = 1;
if(value.charAt(0) === "-") {
negative = -1;
value = value.substr(1);
}
var year = parseInt(value.substr(0,4),10) * negative,
d = new Date(Date.UTC(year,
2020-07-28 12:10:58 +02:00
parseInt(value.substr(4,2),10)-1,
parseInt(value.substr(6,2),10),
parseInt(value.substr(8,2)||"00",10),
parseInt(value.substr(10,2)||"00",10),
parseInt(value.substr(12,2)||"00",10),
parseInt(value.substr(14,3)||"000",10)));
d.setUTCFullYear(year); // See https://stackoverflow.com/a/5870822
return d;
2020-07-28 12:10:58 +02:00
} else if($tw.utils.isDate(value)) {
return value;
} else {
return null;
}
};
// Stringify an array of tiddler titles into a list string
$tw.utils.stringifyList = function(value) {
if($tw.utils.isArray(value)) {
var result = new Array(value.length);
for(var t=0, l=value.length; t<l; t++) {
var entry = value[t] || "";
if(entry.match(/[^\S\xA0]/mg)) {
2020-07-28 12:10:58 +02:00
result[t] = "[[" + entry + "]]";
} else {
result[t] = entry;
}
}
return result.join(" ");
} else {
return value || "";
}
};
// Parse a string array from a bracketted list. For example "OneTiddler [[Another Tiddler]] LastOne"
$tw.utils.parseStringArray = function(value, allowDuplicate) {
if(typeof value === "string") {
var memberRegExp = /(?:^|[^\S\xA0])(?:\[\[(.*?)\]\])(?=[^\S\xA0]|$)|([\S\xA0]+)/mg,
results = [], names = {},
match;
do {
match = memberRegExp.exec(value);
if(match) {
var item = match[1] || match[2];
if(item !== undefined && (!$tw.utils.hop(names,item) || allowDuplicate)) {
results.push(item);
names[item] = true;
}
}
} while(match);
return results;
} else if($tw.utils.isArray(value)) {
return value;
} else {
return null;
}
};
// Parse a block of name:value fields. The `fields` object is used as the basis for the return value
$tw.utils.parseFields = function(text,fields) {
fields = fields || Object.create(null);
text.split(/\r?\n/mg).forEach(function(line) {
if(line.charAt(0) !== "#") {
var p = line.indexOf(":");
if(p !== -1) {
var field = line.substr(0, p).trim(),
value = line.substr(p+1).trim();
if(field) {
fields[field] = value;
}
}
}
});
return fields;
};
// Safely parse a string as JSON
$tw.utils.parseJSONSafe = function(text,defaultJSON) {
try {
return JSON.parse(text);
} catch(e) {
if(typeof defaultJSON === "function") {
return defaultJSON(e);
} else {
return defaultJSON || {};
}
}
};
2020-07-28 12:10:58 +02:00
/*
Resolves a source filepath delimited with `/` relative to a specified absolute root filepath.
In relative paths, the special folder name `..` refers to immediate parent directory, and the
name `.` refers to the current directory
*/
$tw.utils.resolvePath = function(sourcepath,rootpath) {
// If the source path starts with ./ or ../ then it is relative to the root
if(sourcepath.substr(0,2) === "./" || sourcepath.substr(0,3) === "../" ) {
var src = sourcepath.split("/"),
root = rootpath.split("/");
// Remove the filename part of the root
root.splice(root.length-1,1);
// Process the source path bit by bit onto the end of the root path
while(src.length > 0) {
var c = src.shift();
if(c === "..") { // Slice off the last root entry for a double dot
if(root.length > 0) {
root.splice(root.length-1,1);
}
} else if(c !== ".") { // Ignore dots
root.push(c); // Copy other elements across
}
}
return root.join("/");
} else {
// If it isn't relative, just return the path
if(rootpath) {
var root = rootpath.split("/");
// Remove the filename part of the root
root.splice(root.length - 1, 1);
return root.join("/") + "/" + sourcepath;
} else {
return sourcepath;
}
}
};
/*
Parse a semantic version string into its constituent parts -- see https://semver.org
*/
$tw.utils.parseVersion = function(version) {
var match = /^v?((\d+)\.(\d+)\.(\d+))(?:-([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?(?:\+([\dA-Za-z\-]+(?:\.[\dA-Za-z\-]+)*))?$/.exec(version);
if(match) {
return {
version: match[1],
major: parseInt(match[2],10),
minor: parseInt(match[3],10),
patch: parseInt(match[4],10),
prerelease: match[5],
build: match[6]
};
} else {
return null;
}
};
/*
Returns +1 if the version string A is greater than the version string B, 0 if they are the same, and +1 if B is greater than A.
Missing or malformed version strings are parsed as 0.0.0
*/
$tw.utils.compareVersions = function(versionStringA,versionStringB) {
var defaultVersion = {
major: 0,
minor: 0,
patch: 0
},
versionA = $tw.utils.parseVersion(versionStringA) || defaultVersion,
versionB = $tw.utils.parseVersion(versionStringB) || defaultVersion,
diff = [
versionA.major - versionB.major,
versionA.minor - versionB.minor,
versionA.patch - versionB.patch
];
if((diff[0] > 0) || (diff[0] === 0 && diff[1] > 0) || (diff[0] === 0 & diff[1] === 0 & diff[2] > 0)) {
return +1;
} else if((diff[0] < 0) || (diff[0] === 0 && diff[1] < 0) || (diff[0] === 0 & diff[1] === 0 & diff[2] < 0)) {
return -1;
} else {
return 0;
}
};
/*
Returns true if the version string A is greater than the version string B. Returns true if the versions are the same
*/
$tw.utils.checkVersions = function(versionStringA,versionStringB) {
return $tw.utils.compareVersions(versionStringA,versionStringB) !== -1;
};
/*
Register file type information
options: {flags: flags,deserializerType: deserializerType}
flags:"image" for image types
deserializerType: defaults to type if not specified
*/
$tw.utils.registerFileType = function(type,encoding,extension,options) {
options = options || {};
if($tw.utils.isArray(extension)) {
$tw.utils.each(extension,function(extension) {
$tw.config.fileExtensionInfo[extension] = {type: type};
});
extension = extension[0];
} else {
$tw.config.fileExtensionInfo[extension] = {type: type};
}
$tw.config.contentTypeInfo[type] = {encoding: encoding, extension: extension, flags: options.flags || [], deserializerType: options.deserializerType || type};
};
/*
Given an extension, always access the $tw.config.fileExtensionInfo
using a lowercase extension only.
*/
$tw.utils.getFileExtensionInfo = function(ext) {
return ext ? $tw.config.fileExtensionInfo[ext.toLowerCase()] : null;
}
/*
Given an extension, get the correct encoding for that file.
defaults to utf8
*/
$tw.utils.getTypeEncoding = function(ext) {
var extensionInfo = $tw.utils.getFileExtensionInfo(ext),
type = extensionInfo ? extensionInfo.type : null,
typeInfo = type ? $tw.config.contentTypeInfo[type] : null;
return typeInfo ? typeInfo.encoding : "utf8";
};
var globalCheck =[
" Object.defineProperty(Object.prototype, '__temp__', {",
" get: function () { return this; },",
" configurable: true",
" });",
" if(Object.keys(__temp__).length){",
" console.log(\"Warning: Global assignment detected\",Object.keys(__temp__));",
" delete Object.prototype.__temp__;",
" }",
" delete Object.prototype.__temp__;",
].join('\n');
2020-07-28 12:10:58 +02:00
/*
Run code globally with specified context variables in scope
*/
$tw.utils.evalGlobal = function(code,context,filename,sandbox,allowGlobals) {
2020-07-28 12:10:58 +02:00
var contextCopy = $tw.utils.extend(Object.create(null),context);
// Get the context variables as a pair of arrays of names and values
var contextNames = [], contextValues = [];
$tw.utils.each(contextCopy,function(value,name) {
contextNames.push(name);
contextValues.push(value);
});
// Add the code prologue and epilogue
code = [
"(function(" + contextNames.join(",") + ") {",
" (function(){" + code + "\n;})();\n",
(!$tw.browser && sandbox && !allowGlobals) ? globalCheck : "",
"\nreturn exports;\n",
"})"
].join("");
2020-07-28 12:10:58 +02:00
// Compile the code into a function
var fn;
if($tw.browser) {
fn = window["eval"](code + "\n\n//# sourceURL=" + filename);
} else {
if(sandbox){
fn = vm.runInContext(code,sandbox,filename)
} else {
fn = vm.runInThisContext(code,filename);
}
2020-07-28 12:10:58 +02:00
}
// Call the function and return the exports
return fn.apply(null,contextValues);
};
$tw.utils.sandbox = !$tw.browser ? vm.createContext({}) : undefined;
2020-07-28 12:10:58 +02:00
/*
Run code in a sandbox with only the specified context variables in scope
*/
$tw.utils.evalSandboxed = $tw.browser ? $tw.utils.evalGlobal : function(code,context,filename,allowGlobals) {
return $tw.utils.evalGlobal(
code,context,filename,
allowGlobals ? vm.createContext({}) : $tw.utils.sandbox,
allowGlobals
);
2020-07-28 12:10:58 +02:00
};
/*
Creates a PasswordPrompt object
*/
$tw.utils.PasswordPrompt = function() {
// Store of pending password prompts
this.passwordPrompts = [];
// Create the wrapper
this.promptWrapper = $tw.utils.domMaker("div",{"class":"tc-password-wrapper"});
document.body.appendChild(this.promptWrapper);
// Hide the empty wrapper
this.setWrapperDisplay();
};
/*
Hides or shows the wrapper depending on whether there are any outstanding prompts
*/
$tw.utils.PasswordPrompt.prototype.setWrapperDisplay = function() {
if(this.passwordPrompts.length) {
this.promptWrapper.style.display = "block";
} else {
this.promptWrapper.style.display = "none";
}
};
/*
Adds a new password prompt. Options are:
submitText: text to use for submit button (defaults to "Login")
serviceName: text of the human readable service name
noUserName: set true to disable username prompt
canCancel: set true to enable a cancel button (callback called with null)
repeatPassword: set true to prompt for the password twice
callback: function to be called on submission with parameter of object {username:,password:}. Callback must return `true` to remove the password prompt
*/
$tw.utils.PasswordPrompt.prototype.createPrompt = function(options) {
// Create and add the prompt to the DOM
var self = this,
submitText = options.submitText || "Login",
dm = $tw.utils.domMaker,
children = [dm("h1",{text: options.serviceName})];
if(!options.noUserName) {
children.push(dm("input",{
attributes: {type: "text", name: "username", placeholder: $tw.language.getString("Encryption/Username")}
}));
}
children.push(dm("input",{
attributes: {
type: "password",
name: "password",
placeholder: ( $tw.language == undefined ? "Password" : $tw.language.getString("Encryption/Password") )
}
}));
if(options.repeatPassword) {
children.push(dm("input",{
attributes: {
type: "password",
name: "password2",
placeholder: $tw.language.getString("Encryption/RepeatPassword")
}
}));
}
if(options.canCancel) {
children.push(dm("button",{
text: $tw.language.getString("Encryption/Cancel"),
attributes: {
type: "button"
},
eventListeners: [{
name: "click",
handlerFunction: function(event) {
self.removePrompt(promptInfo);
options.callback(null);
}
}]
}));
}
children.push(dm("button",{
attributes: {type: "submit"},
text: submitText
}));
var form = dm("form",{
attributes: {autocomplete: "off"},
children: children
});
this.promptWrapper.appendChild(form);
window.setTimeout(function() {
form.elements[0].focus();
},10);
// Add a submit event handler
var self = this;
form.addEventListener("submit",function(event) {
// Collect the form data
var data = {},t;
$tw.utils.each(form.elements,function(element) {
if(element.name && element.value) {
data[element.name] = element.value;
}
});
// Check that the passwords match
if(options.repeatPassword && data.password !== data.password2) {
alert($tw.language.getString("Encryption/PasswordNoMatch"));
} else {
// Call the callback
if(options.callback(data)) {
// Remove the prompt if the callback returned true
self.removePrompt(promptInfo);
} else {
// Clear the password if the callback returned false
$tw.utils.each(form.elements,function(element) {
if(element.name === "password" || element.name === "password2") {
element.value = "";
}
});
}
}
event.preventDefault();
return false;
},true);
// Add the prompt to the list
var promptInfo = {
serviceName: options.serviceName,
callback: options.callback,
form: form,
owner: this
2020-07-28 12:10:58 +02:00
};
this.passwordPrompts.push(promptInfo);
// Make sure the wrapper is displayed
this.setWrapperDisplay();
return promptInfo;
2020-07-28 12:10:58 +02:00
};
$tw.utils.PasswordPrompt.prototype.removePrompt = function(promptInfo) {
var i = this.passwordPrompts.indexOf(promptInfo);
if(i !== -1) {
this.passwordPrompts.splice(i,1);
promptInfo.form.parentNode.removeChild(promptInfo.form);
this.setWrapperDisplay();
}
}
/*
Crypto helper object for encrypted content. It maintains the password text in a closure, and provides methods to change
the password, and to encrypt/decrypt a block of text
*/
$tw.utils.Crypto = function() {
var sjcl = $tw.node ? (global.sjcl || require("./sjcl.js")) : window.sjcl,
currentPassword = null,
callSjcl = function(method,inputText,password) {
password = password || currentPassword;
var outputText;
try {
if(password) {
outputText = sjcl[method](password,inputText);
}
} catch(ex) {
console.log("Crypto error:" + ex);
outputText = null;
}
return outputText;
};
this.setPassword = function(newPassword) {
currentPassword = newPassword;
this.updateCryptoStateTiddler();
};
this.updateCryptoStateTiddler = function() {
if($tw.wiki) {
var state = currentPassword ? "yes" : "no",
tiddler = $tw.wiki.getTiddler("$:/isEncrypted");
if(!tiddler || tiddler.fields.text !== state) {
$tw.wiki.addTiddler(new $tw.Tiddler({title: "$:/isEncrypted", text: state}));
}
}
};
this.hasPassword = function() {
return !!currentPassword;
}
this.encrypt = function(text,password) {
return callSjcl("encrypt",text,password);
};
this.decrypt = function(text,password) {
return callSjcl("decrypt",text,password);
};
};
/////////////////////////// Module mechanism
/*
Execute the module named 'moduleName'. The name can optionally be relative to the module named 'moduleRoot'
*/
$tw.modules.execute = function(moduleName,moduleRoot) {
var name = moduleName;
if(moduleName.charAt(0) === ".") {
name = $tw.utils.resolvePath(moduleName,moduleRoot)
}
if(!$tw.modules.titles[name]) {
if($tw.modules.titles[name + ".js"]) {
name = name + ".js";
} else if($tw.modules.titles[name + "/index.js"]) {
name = name + "/index.js";
} else if($tw.modules.titles[moduleName]) {
name = moduleName;
} else if($tw.modules.titles[moduleName + ".js"]) {
name = moduleName + ".js";
} else if($tw.modules.titles[moduleName + "/index.js"]) {
name = moduleName + "/index.js";
}
}
var moduleInfo = $tw.modules.titles[name],
tiddler = $tw.wiki.getTiddler(name),
_exports = {},
sandbox = {
module: {exports: _exports},
//moduleInfo: moduleInfo,
exports: _exports,
console: console,
setInterval: setInterval,
clearInterval: clearInterval,
setTimeout: setTimeout,
clearTimeout: clearTimeout,
Buffer: $tw.browser ? undefined : Buffer,
$tw: $tw,
require: function(title) {
return $tw.modules.execute(title, name);
}
};
Object.defineProperty(sandbox.module, "id", {
value: name,
writable: false,
enumerable: true,
configurable: false
});
if(!$tw.browser) {
$tw.utils.extend(sandbox,{
process: process
});
} else {
/*
CommonJS optional require.main property:
In a browser we offer a fake main module which points back to the boot function
(Theoretically, this may allow TW to eventually load itself as a module in the browser)
*/
Object.defineProperty(sandbox.require, "main", {
value: (typeof(require) !== "undefined") ? require.main : {TiddlyWiki: _boot},
writable: false,
enumerable: true,
configurable: false
});
}
if(!moduleInfo) {
// We could not find the module on this path
// Try to defer to browserify etc, or node
var deferredModule;
if($tw.browser) {
if(window.require) {
try {
return window.require(moduleName);
} catch(e) {}
}
throw "Cannot find module named '" + moduleName + "' required by module '" + moduleRoot + "', resolved to " + name;
} else {
// If we don't have a module with that name, let node.js try to find it
return require(moduleName);
}
}
// Execute the module if we haven't already done so
if(!moduleInfo.exports) {
try {
// Check the type of the definition
if(typeof moduleInfo.definition === "function") { // Function
moduleInfo.exports = _exports;
moduleInfo.definition(moduleInfo,moduleInfo.exports,sandbox.require);
} else if(typeof moduleInfo.definition === "string") { // String
moduleInfo.exports = _exports;
$tw.utils.evalSandboxed(moduleInfo.definition,sandbox,tiddler.fields.title);
if(sandbox.module.exports) {
moduleInfo.exports = sandbox.module.exports; //more codemirror workaround
}
} else { // Object
moduleInfo.exports = moduleInfo.definition;
}
} catch(e) {
if (e instanceof SyntaxError) {
var line = e.lineNumber || e.line; // Firefox || Safari
if (typeof(line) != "undefined" && line !== null) {
$tw.utils.error("Syntax error in boot module " + name + ":" + line + ":\n" + e.stack);
} else if(!$tw.browser) {
// this is the only way to get node.js to display the line at which the syntax error appeared,
// and $tw.utils.error would exit anyway
// cf. https://bugs.chromium.org/p/v8/issues/detail?id=2589
throw e;
} else {
// Opera: line number is included in e.message
// Chrome/IE: there's currently no way to get the line number
$tw.utils.error("Syntax error in boot module " + name + ": " + e.message + "\n" + e.stack);
}
} else {
// line number should be included in e.stack for runtime errors
$tw.utils.error("Error executing boot module " + name + ": " + String(e) + "\n\n" + e.stack);
2020-07-28 12:10:58 +02:00
}
}
}
// Return the exports of the module
return moduleInfo.exports;
};
/*
Apply a callback to each module of a particular type
moduleType: type of modules to enumerate
callback: function called as callback(title,moduleExports) for each module
*/
$tw.modules.forEachModuleOfType = function(moduleType,callback) {
var modules = $tw.modules.types[moduleType];
$tw.utils.each(modules,function(element,title) {
callback(title,$tw.modules.execute(title));
});
};
/*
Get all the modules of a particular type in a hashmap by their `name` field
*/
$tw.modules.getModulesByTypeAsHashmap = function(moduleType,nameField) {
nameField = nameField || "name";
var results = Object.create(null);
$tw.modules.forEachModuleOfType(moduleType,function(title,module) {
results[module[nameField]] = module;
});
return results;
};
/*
Apply the exports of the modules of a particular type to a target object
*/
$tw.modules.applyMethods = function(moduleType,targetObject) {
if(!targetObject) {
targetObject = Object.create(null);
}
$tw.modules.forEachModuleOfType(moduleType,function(title,module) {
$tw.utils.each(module,function(element,title,object) {
targetObject[title] = module[title];
});
});
return targetObject;
};
/*
Return a class created from a modules. The module should export the properties to be added to those of the optional base class
*/
$tw.modules.createClassFromModule = function(moduleExports,baseClass) {
var newClass = function() {};
if(baseClass) {
newClass.prototype = new baseClass();
newClass.prototype.constructor = baseClass;
}
$tw.utils.extend(newClass.prototype,moduleExports);
return newClass;
};
2020-07-28 12:10:58 +02:00
/*
Return an array of classes created from the modules of a specified type. Each module should export the properties to be added to those of the optional base class
*/
$tw.modules.createClassesFromModules = function(moduleType,subType,baseClass) {
var classes = Object.create(null);
$tw.modules.forEachModuleOfType(moduleType,function(title,moduleExports) {
if(!subType || moduleExports.types[subType]) {
classes[moduleExports.name] = $tw.modules.createClassFromModule(moduleExports,baseClass);
2020-07-28 12:10:58 +02:00
}
});
return classes;
};
/////////////////////////// Barebones tiddler object
/*
Construct a tiddler object from a hashmap of tiddler fields. If multiple hasmaps are provided they are merged,
taking precedence to the right
*/
$tw.Tiddler = function(/* [fields,] fields */) {
this.fields = Object.create(null);
this.cache = Object.create(null);
for(var c=0; c<arguments.length; c++) {
var arg = arguments[c],
src = (arg instanceof $tw.Tiddler) ? arg.fields : arg;
for(var t in src) {
if(src[t] === undefined || src[t] === null) {
if(t in this.fields) {
delete this.fields[t]; // If we get a field that's undefined, delete any previous field value
}
} else {
// Parse the field with the associated field module (if any)
var fieldModule = $tw.Tiddler.fieldModules[t],
value;
if(fieldModule && fieldModule.parse) {
value = fieldModule.parse.call(this,src[t]);
} else {
value = src[t];
}
// Freeze the field to keep it immutable
if(value != null && typeof value === "object") {
Object.freeze(value);
}
this.fields[t] = value;
}
}
}
// Freeze the tiddler against modification
Object.freeze(this.fields);
Object.freeze(this);
};
$tw.Tiddler.prototype.hasField = function(field) {
return $tw.utils.hop(this.fields,field);
};
/*
Compare two tiddlers for equality
tiddler: the tiddler to compare
excludeFields: array of field names to exclude from the comparison
*/
$tw.Tiddler.prototype.isEqual = function(tiddler,excludeFields) {
if(!(tiddler instanceof $tw.Tiddler)) {
return false;
}
excludeFields = excludeFields || [];
var self = this,
differences = []; // Fields that have differences
// Add to the differences array
function addDifference(fieldName) {
// Check for this field being excluded
if(excludeFields.indexOf(fieldName) === -1) {
// Save the field as a difference
$tw.utils.pushTop(differences,fieldName);
}
}
// Returns true if the two values of this field are equal
function isFieldValueEqual(fieldName) {
var valueA = self.fields[fieldName],
valueB = tiddler.fields[fieldName];
// Check for identical string values
if(typeof(valueA) === "string" && typeof(valueB) === "string" && valueA === valueB) {
return true;
}
// Check for identical array values
if($tw.utils.isArray(valueA) && $tw.utils.isArray(valueB) && $tw.utils.isArrayEqual(valueA,valueB)) {
return true;
}
// Check for identical date values
if($tw.utils.isDate(valueA) && $tw.utils.isDate(valueB) && valueA.getTime() === valueB.getTime()) {
return true;
}
// Otherwise the fields must be different
return false;
}
// Compare our fields
for(var fieldName in this.fields) {
if(!isFieldValueEqual(fieldName)) {
addDifference(fieldName);
}
}
// There's a difference for every field in the other tiddler that we don't have
for(fieldName in tiddler.fields) {
if(!(fieldName in this.fields)) {
addDifference(fieldName);
}
}
// Return whether there were any differences
return differences.length === 0;
};
/*
Register and install the built in tiddler field modules
*/
$tw.modules.define("$:/boot/tiddlerfields/modified","tiddlerfield",{
name: "modified",
parse: $tw.utils.parseDate,
stringify: $tw.utils.stringifyDate
});
$tw.modules.define("$:/boot/tiddlerfields/created","tiddlerfield",{
name: "created",
parse: $tw.utils.parseDate,
stringify: $tw.utils.stringifyDate
});
$tw.modules.define("$:/boot/tiddlerfields/color","tiddlerfield",{
name: "color",
editTag: "input",
editType: "color"
});
$tw.modules.define("$:/boot/tiddlerfields/tags","tiddlerfield",{
name: "tags",
parse: $tw.utils.parseStringArray,
stringify: $tw.utils.stringifyList
});
$tw.modules.define("$:/boot/tiddlerfields/list","tiddlerfield",{
name: "list",
parse: $tw.utils.parseStringArray,
stringify: $tw.utils.stringifyList
});
/////////////////////////// Barebones wiki store
/*
Wiki constructor. State is stored in private members that only a small number of privileged accessor methods have direct access. Methods added via the prototype have to use these accessors and cannot access the state data directly.
options include:
enableIndexers - Array of indexer names to enable, or null to use all available indexers
*/
$tw.Wiki = function(options) {
options = options || {};
var self = this,
tiddlers = Object.create(null), // Hashmap of tiddlers
tiddlerTitles = null, // Array of tiddler titles
getTiddlerTitles = function() {
if(!tiddlerTitles) {
tiddlerTitles = Object.keys(tiddlers).sort(function(a,b) {return a.localeCompare(b);});
2020-07-28 12:10:58 +02:00
}
return tiddlerTitles;
},
pluginTiddlers = [], // Array of tiddlers containing registered plugins, ordered by priority
pluginInfo = Object.create(null), // Hashmap of parsed plugin content
shadowTiddlers = Object.create(null), // Hashmap by title of {source:, tiddler:}
shadowTiddlerTitles = null,
getShadowTiddlerTitles = function() {
if(!shadowTiddlerTitles) {
shadowTiddlerTitles = Object.keys(shadowTiddlers).sort(function(a,b) {return a.localeCompare(b);});
2020-07-28 12:10:58 +02:00
}
return shadowTiddlerTitles;
},
enableIndexers = options.enableIndexers || null,
indexers = [],
indexersByName = Object.create(null);
this.addIndexer = function(indexer,name) {
// Bail if this indexer is not enabled
if(enableIndexers && enableIndexers.indexOf(name) === -1) {
return;
}
indexers.push(indexer);
indexersByName[name] = indexer;
indexer.init();
};
this.getIndexer = function(name) {
return indexersByName[name] || null;
};
// Add a tiddler to the store
this.addTiddler = function(tiddler) {
if(!(tiddler instanceof $tw.Tiddler)) {
tiddler = new $tw.Tiddler(tiddler);
}
// Save the tiddler
if(tiddler) {
var title = tiddler.fields.title;
if(title) {
// Uncomment the following line for detailed logs of all tiddler writes
// console.log("Adding",title,tiddler)
// Record the old tiddler state
var updateDescriptor = {
old: {
tiddler: this.getTiddler(title),
shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title)
}
}
// Save the new tiddler
tiddlers[title] = tiddler;
// Check we've got the title
tiddlerTitles = $tw.utils.insertSortedArray(tiddlerTitles || [],title);
2020-07-28 12:10:58 +02:00
// Record the new tiddler state
updateDescriptor["new"] = {
tiddler: tiddler,
shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title)
}
// Update indexes
this.clearCache(title);
this.clearGlobalCache();
$tw.utils.each(indexers,function(indexer) {
indexer.update(updateDescriptor);
});
// Queue a change event
this.enqueueTiddlerEvent(title);
}
}
};
// Delete a tiddler
this.deleteTiddler = function(title) {
// Uncomment the following line for detailed logs of all tiddler deletions
// console.log("Deleting",title)
if($tw.utils.hop(tiddlers,title)) {
// Record the old tiddler state
var updateDescriptor = {
old: {
tiddler: this.getTiddler(title),
shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title)
}
}
// Delete the tiddler
delete tiddlers[title];
// Delete it from the list of titles
if(tiddlerTitles) {
var index = tiddlerTitles.indexOf(title);
if(index !== -1) {
tiddlerTitles.splice(index,1);
}
2020-07-28 12:10:58 +02:00
}
// Record the new tiddler state
updateDescriptor["new"] = {
tiddler: this.getTiddler(title),
shadow: this.isShadowTiddler(title),
exists: this.tiddlerExists(title)
}
// Update indexes
this.clearCache(title);
this.clearGlobalCache();
$tw.utils.each(indexers,function(indexer) {
indexer.update(updateDescriptor);
});
// Queue a change event
this.enqueueTiddlerEvent(title,true);
}
};
// Get a tiddler from the store
this.getTiddler = function(title) {
if(title) {
var t = tiddlers[title];
if(t !== undefined) {
2020-07-28 12:10:58 +02:00
return t;
} else {
var s = shadowTiddlers[title];
if(s !== undefined) {
return s.tiddler;
}
2020-07-28 12:10:58 +02:00
}
}
return undefined;
2020-07-28 12:10:58 +02:00
};
// Get an array of all tiddler titles
this.allTitles = function() {
return getTiddlerTitles().slice(0);
};
// Iterate through all tiddler titles
this.each = function(callback) {
var titles = getTiddlerTitles(),
index,titlesLength,title;
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
callback(tiddlers[title],title);
}
};
// Get an array of all shadow tiddler titles
this.allShadowTitles = function() {
return getShadowTiddlerTitles().slice(0);
};
// Iterate through all shadow tiddler titles
this.eachShadow = function(callback) {
var titles = getShadowTiddlerTitles(),
index,titlesLength,title;
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(tiddlers[title]) {
callback(tiddlers[title],title);
} else {
var shadowInfo = shadowTiddlers[title];
callback(shadowInfo.tiddler,title);
}
2020-07-28 12:10:58 +02:00
}
};
// Iterate through all tiddlers and then the shadows
this.eachTiddlerPlusShadows = function(callback) {
var index,titlesLength,title,
titles = getTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
callback(tiddlers[title],title);
}
titles = getShadowTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(!tiddlers[title]) {
var shadowInfo = shadowTiddlers[title];
callback(shadowInfo.tiddler,title);
}
}
};
// Iterate through all the shadows and then the tiddlers
this.eachShadowPlusTiddlers = function(callback) {
var index,titlesLength,title,
titles = getShadowTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(tiddlers[title]) {
callback(tiddlers[title],title);
} else {
var shadowInfo = shadowTiddlers[title];
callback(shadowInfo.tiddler,title);
}
}
titles = getTiddlerTitles();
for(index = 0, titlesLength = titles.length; index < titlesLength; index++) {
title = titles[index];
if(!shadowTiddlers[title]) {
callback(tiddlers[title],title);
}
}
};
// Test for the existence of a tiddler (excludes shadow tiddlers)
this.tiddlerExists = function(title) {
return !!$tw.utils.hop(tiddlers,title);
};
// Determines if a tiddler is a shadow tiddler, regardless of whether it has been overridden by a real tiddler
this.isShadowTiddler = function(title) {
return $tw.utils.hop(shadowTiddlers,title);
};
this.getShadowSource = function(title) {
if($tw.utils.hop(shadowTiddlers,title)) {
return shadowTiddlers[title].source;
}
return null;
};
// Get an array of all the currently recognised plugin types
this.getPluginTypes = function() {
var types = [];
$tw.utils.each(pluginTiddlers,function(pluginTiddler) {
var pluginType = pluginTiddler.fields["plugin-type"];
if(pluginType && types.indexOf(pluginType) === -1) {
types.push(pluginType);
}
});
return types;
};
// Read plugin info for all plugins, or just an array of titles. Returns the number of plugins updated or deleted
this.readPluginInfo = function(titles) {
var results = {
modifiedPlugins: [],
deletedPlugins: []
};
$tw.utils.each(titles || getTiddlerTitles(),function(title) {
var tiddler = tiddlers[title];
if(tiddler) {
if(tiddler.fields.type === "application/json" && tiddler.hasField("plugin-type") && tiddler.fields.text) {
pluginInfo[tiddler.fields.title] = $tw.utils.parseJSONSafe(tiddler.fields.text);
2020-07-28 12:10:58 +02:00
results.modifiedPlugins.push(tiddler.fields.title);
}
} else {
if(pluginInfo[title]) {
delete pluginInfo[title];
2020-07-28 12:10:58 +02:00
results.deletedPlugins.push(title);
}
}
});
return results;
};
// Get plugin info for a plugin
this.getPluginInfo = function(title) {
return pluginInfo[title];
};
// Register the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting registration to an array of tiddler titles. Return the array of titles affected
this.registerPluginTiddlers = function(pluginType,titles) {
var self = this,
registeredTitles = [],
checkTiddler = function(tiddler,title) {
if(tiddler && tiddler.fields.type === "application/json" && tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType)) {
var disablingTiddler = self.getTiddler("$:/config/Plugins/Disabled/" + title);
if(title === "$:/core" || !disablingTiddler || (disablingTiddler.fields.text || "").trim() !== "yes") {
self.unregisterPluginTiddlers(null,[title]); // Unregister the plugin if it's already registered
pluginTiddlers.push(tiddler);
registeredTitles.push(tiddler.fields.title);
}
}
};
if(titles) {
$tw.utils.each(titles,function(title) {
checkTiddler(self.getTiddler(title),title);
});
} else {
this.each(function(tiddler,title) {
checkTiddler(tiddler,title);
});
}
return registeredTitles;
};
// Unregister the plugin tiddlers of a particular type, or null/undefined for any type, optionally restricting unregistering to an array of tiddler titles. Returns an array of the titles affected
this.unregisterPluginTiddlers = function(pluginType,titles) {
var self = this,
unregisteredTitles = [];
// Remove any previous registered plugins of this type
for(var t=pluginTiddlers.length-1; t>=0; t--) {
var tiddler = pluginTiddlers[t];
if(tiddler.fields["plugin-type"] && (!pluginType || tiddler.fields["plugin-type"] === pluginType) && (!titles || titles.indexOf(tiddler.fields.title) !== -1)) {
unregisteredTitles.push(tiddler.fields.title);
pluginTiddlers.splice(t,1);
}
}
return unregisteredTitles;
};
// Unpack the currently registered plugins, creating shadow tiddlers for their constituent tiddlers
this.unpackPluginTiddlers = function() {
var self = this;
// Sort the plugin titles by the `plugin-priority` field
pluginTiddlers.sort(function(a,b) {
if("plugin-priority" in a.fields && "plugin-priority" in b.fields) {
return a.fields["plugin-priority"] - b.fields["plugin-priority"];
} else if("plugin-priority" in a.fields) {
return -1;
} else if("plugin-priority" in b.fields) {
return +1;
} else if(a.fields.title < b.fields.title) {
return -1;
} else if(a.fields.title === b.fields.title) {
return 0;
} else {
return +1;
}
});
// Now go through the plugins in ascending order and assign the shadows
shadowTiddlers = Object.create(null);
$tw.utils.each(pluginTiddlers,function(tiddler) {
// Extract the constituent tiddlers
if($tw.utils.hop(pluginInfo,tiddler.fields.title)) {
$tw.utils.each(pluginInfo[tiddler.fields.title].tiddlers,function(constituentTiddler,constituentTitle) {
// Save the tiddler object
if(constituentTitle) {
shadowTiddlers[constituentTitle] = {
source: tiddler.fields.title,
tiddler: new $tw.Tiddler(constituentTiddler,{title: constituentTitle})
};
}
});
}
});
shadowTiddlerTitles = null;
this.clearCache(null);
this.clearGlobalCache();
$tw.utils.each(indexers,function(indexer) {
indexer.rebuild();
});
};
if(this.addIndexersToWiki) {
this.addIndexersToWiki();
}
};
// Dummy methods that will be filled in after boot
$tw.Wiki.prototype.clearCache =
$tw.Wiki.prototype.clearGlobalCache =
$tw.Wiki.prototype.enqueueTiddlerEvent = function() {};
// Add an array of tiddlers
$tw.Wiki.prototype.addTiddlers = function(tiddlers) {
for(var t=0; t<tiddlers.length; t++) {
this.addTiddler(tiddlers[t]);
}
};
/*
Define all modules stored in ordinary tiddlers
*/
$tw.Wiki.prototype.defineTiddlerModules = function() {
this.each(function(tiddler,title) {
if(tiddler.hasField("module-type")) {
switch (tiddler.fields.type) {
case "application/javascript":
// We only define modules that haven't already been defined, because in the browser modules in system tiddlers are defined in inline script
if(!$tw.utils.hop($tw.modules.titles,tiddler.fields.title)) {
$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],tiddler.fields.text);
}
break;
case "application/json":
$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],$tw.utils.parseJSONSafe(tiddler.fields.text));
2020-07-28 12:10:58 +02:00
break;
case "application/x-tiddler-dictionary":
$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],$tw.utils.parseFields(tiddler.fields.text));
break;
}
}
});
};
/*
Register all the module tiddlers that have a module type
*/
$tw.Wiki.prototype.defineShadowModules = function() {
var self = this;
this.eachShadow(function(tiddler,title) {
// Don't define the module if it is overidden by an ordinary tiddler
if(!self.tiddlerExists(title) && tiddler.hasField("module-type")) {
// Define the module
$tw.modules.define(tiddler.fields.title,tiddler.fields["module-type"],tiddler.fields.text);
}
});
};
/*
Enable safe mode by deleting any tiddlers that override a shadow tiddler
*/
$tw.Wiki.prototype.processSafeMode = function() {
var self = this,
overrides = [];
// Find the overriding tiddlers
this.each(function(tiddler,title) {
if(self.isShadowTiddler(title)) {
console.log(title);
overrides.push(title);
}
});
// Assemble a report tiddler
var titleReportTiddler = "TiddlyWiki Safe Mode",
report = [];
report.push("TiddlyWiki has been started in [[safe mode|https://tiddlywiki.com/static/SafeMode.html]]. All plugins are temporarily disabled. Most customisations have been disabled by renaming the following tiddlers:")
// Delete the overrides
overrides.forEach(function(title) {
var tiddler = self.getTiddler(title),
newTitle = "SAFE: " + title;
self.deleteTiddler(title);
self.addTiddler(new $tw.Tiddler(tiddler, {title: newTitle}));
report.push("* [[" + title + "|" + newTitle + "]]");
});
report.push()
this.addTiddler(new $tw.Tiddler({title: titleReportTiddler, text: report.join("\n\n")}));
// Set $:/DefaultTiddlers to point to our report
this.addTiddler(new $tw.Tiddler({title: "$:/DefaultTiddlers", text: "[[" + titleReportTiddler + "]]"}));
};
/*
Extracts tiddlers from a typed block of text, specifying default field values
*/
$tw.Wiki.prototype.deserializeTiddlers = function(type,text,srcFields,options) {
srcFields = srcFields || Object.create(null);
options = options || {};
var deserializer = $tw.Wiki.tiddlerDeserializerModules[options.deserializer],
fields = Object.create(null);
if(!deserializer) {
deserializer = $tw.Wiki.tiddlerDeserializerModules[type];
}
if(!deserializer && $tw.utils.getFileExtensionInfo(type)) {
// If we didn't find the serializer, try converting it from an extension to a content type
type = $tw.utils.getFileExtensionInfo(type).type;
deserializer = $tw.Wiki.tiddlerDeserializerModules[type];
}
if(!deserializer && $tw.config.contentTypeInfo[type]) {
// see if this type has a different deserializer registered with it
type = $tw.config.contentTypeInfo[type].deserializerType;
deserializer = $tw.Wiki.tiddlerDeserializerModules[type];
}
if(!deserializer) {
// If we still don't have a deserializer, treat it as plain text
deserializer = $tw.Wiki.tiddlerDeserializerModules["text/plain"];
}
for(var f in srcFields) {
fields[f] = srcFields[f];
}
if(deserializer) {
return deserializer.call(this,text,fields,type);
} else {
// Return a raw tiddler for unknown types
fields.text = text;
return [fields];
}
};
/*
Register the built in tiddler deserializer modules
*/
var deserializeHeaderComment = function(text,fields) {
var headerCommentRegExp = new RegExp($tw.config.jsModuleHeaderRegExpString,"mg"),
match = headerCommentRegExp.exec(text);
fields.text = text;
if(match) {
fields = $tw.utils.parseFields(match[1].split(/\r?\n\r?\n/mg)[0],fields);
}
return [fields];
};
$tw.modules.define("$:/boot/tiddlerdeserializer/js","tiddlerdeserializer",{
"application/javascript": deserializeHeaderComment
});
$tw.modules.define("$:/boot/tiddlerdeserializer/css","tiddlerdeserializer",{
"text/css": deserializeHeaderComment
});
$tw.modules.define("$:/boot/tiddlerdeserializer/tid","tiddlerdeserializer",{
"application/x-tiddler": function(text,fields) {
var split = text.split(/\r?\n\r?\n/mg);
if(split.length >= 1) {
fields = $tw.utils.parseFields(split[0],fields);
}
if(split.length >= 2) {
fields.text = split.slice(1).join("\n\n");
}
return [fields];
}
});
$tw.modules.define("$:/boot/tiddlerdeserializer/tids","tiddlerdeserializer",{
"application/x-tiddlers": function(text,fields) {
var titles = [],
tiddlers = [],
match = /\r?\n\r?\n/mg.exec(text);
if(match) {
fields = $tw.utils.parseFields(text.substr(0,match.index),fields);
var lines = text.substr(match.index + match[0].length).split(/\r?\n/mg);
for(var t=0; t<lines.length; t++) {
var line = lines[t];
if(line.charAt(0) !== "#") {
var colonPos= line.indexOf(":");
if(colonPos !== -1) {
var tiddler = $tw.utils.extend(Object.create(null),fields);
tiddler.title = (tiddler.title || "") + line.substr(0,colonPos).trim();
if(titles.indexOf(tiddler.title) !== -1) {
console.log("Warning: .multids file contains multiple definitions for " + tiddler.title);
}
titles.push(tiddler.title);
tiddler.text = line.substr(colonPos + 2).trim();
tiddlers.push(tiddler);
}
}
}
}
return tiddlers;
}
});
$tw.modules.define("$:/boot/tiddlerdeserializer/txt","tiddlerdeserializer",{
"text/plain": function(text,fields,type) {
fields.text = text;
fields.type = type || "text/plain";
return [fields];
}
});
$tw.modules.define("$:/boot/tiddlerdeserializer/html","tiddlerdeserializer",{
"text/html": function(text,fields) {
fields.text = text;
fields.type = "text/html";
return [fields];
}
});
$tw.modules.define("$:/boot/tiddlerdeserializer/json","tiddlerdeserializer",{
"application/json": function(text,fields) {
var isTiddlerValid = function(data) {
// Not valid if it's not an object with a title property
if(typeof(data) !== "object" || !$tw.utils.hop(data,"title")) {
return false;
}
for(var f in data) {
if($tw.utils.hop(data,f)) {
// Check field name doesn't contain control characters
if(typeof(data[f]) !== "string" || /[\x00-\x1F]/.test(f)) {
2020-07-28 12:10:58 +02:00
return false;
}
}
}
return true;
},
isTiddlerArrayValid = function(data) {
for(var t=0; t<data.length; t++) {
if(!isTiddlerValid(data[t])) {
return false;
}
}
return true;
},
data = $tw.utils.parseJSONSafe(text);
2020-07-28 12:10:58 +02:00
if($tw.utils.isArray(data) && isTiddlerArrayValid(data)) {
return data;
} else if(isTiddlerValid(data)) {
return [data];
} else {
// Plain JSON file
fields.text = text;
fields.type = "application/json";
return [fields];
}
}
});
/////////////////////////// Browser definitions
if($tw.browser && !$tw.node) {
/*
Decrypt any tiddlers stored within the element with the ID "encryptedArea". The function is asynchronous to allow the user to be prompted for a password
callback: function to be called the decryption is complete
*/
$tw.boot.decryptEncryptedTiddlers = function(callback) {
var encryptedArea = document.getElementById("encryptedStoreArea");
if(encryptedArea) {
var encryptedText = encryptedArea.innerHTML,
prompt = "Enter a password to decrypt this TiddlyWiki";
// Prompt for the password
if($tw.utils.hop($tw.boot,"encryptionPrompts")) {
prompt = $tw.boot.encryptionPrompts.decrypt;
}
$tw.passwordPrompt.createPrompt({
serviceName: prompt,
noUserName: true,
submitText: "Decrypt",
callback: function(data) {
// Attempt to decrypt the tiddlers
$tw.crypto.setPassword(data.password);
var decryptedText = $tw.crypto.decrypt(encryptedText);
if(decryptedText) {
var json = $tw.utils.parseJSONSafe(decryptedText);
2020-07-28 12:10:58 +02:00
for(var title in json) {
$tw.preloadTiddler(json[title]);
}
// Call the callback
callback();
// Exit and remove the password prompt
return true;
} else {
// We didn't decrypt everything, so continue to prompt for password
return false;
}
}
});
} else {
// Just invoke the callback straight away if there weren't any encrypted tiddlers
callback();
}
};
/*
Register a deserializer that can extract tiddlers from the DOM
*/
$tw.modules.define("$:/boot/tiddlerdeserializer/dom","tiddlerdeserializer",{
"(DOM)": function(node) {
var extractTextTiddlers = function(node) {
var e = node.firstChild;
while(e && e.nodeName.toLowerCase() !== "pre") {
e = e.nextSibling;
}
var title = node.getAttribute ? node.getAttribute("title") : null;
if(e && title) {
var attrs = node.attributes,
tiddler = {
text: $tw.utils.htmlDecode(e.innerHTML)
};
for(var i=attrs.length-1; i >= 0; i--) {
tiddler[attrs[i].name] = attrs[i].value;
}
return [tiddler];
} else {
return null;
}
},
extractModuleTiddlers = function(node) {
if(node.hasAttribute && node.hasAttribute("data-tiddler-title")) {
var text = node.innerHTML,
s = text.indexOf("{"),
e = text.lastIndexOf("}");
if(node.hasAttribute("data-module") && s !== -1 && e !== -1) {
text = text.substring(s+1,e);
}
var fields = {text: text},
attributes = node.attributes;
for(var a=0; a<attributes.length; a++) {
if(attributes[a].nodeName.substr(0,13) === "data-tiddler-") {
fields[attributes[a].nodeName.substr(13)] = attributes[a].value;
}
}
return [fields];
} else {
return null;
}
},
t,result = [];
if(node) {
var type = (node.getAttribute && node.getAttribute("type")) || null;
if(type) {
// A new-style container with an explicit deserialization type
result = $tw.wiki.deserializeTiddlers(type,node.textContent);
} else {
// An old-style container of classic DIV-based tiddlers
for(t = 0; t < node.childNodes.length; t++) {
2020-07-28 12:10:58 +02:00
var childNode = node.childNodes[t],
tiddlers = extractTextTiddlers(childNode);
tiddlers = tiddlers || extractModuleTiddlers(childNode);
if(tiddlers) {
result.push.apply(result,tiddlers);
}
}
2020-07-28 12:10:58 +02:00
}
}
return result;
}
});
$tw.loadTiddlersBrowser = function() {
// In the browser, we load tiddlers from certain elements
var containerSelectors = [
// IDs for old-style v5.1.x tiddler stores
"#libraryModules",
"#modules",
"#bootKernelPrefix",
"#bootKernel",
"#styleArea",
"#storeArea",
"#systemArea",
// Classes for new-style v5.2.x JSON tiddler stores
"script.tiddlywiki-tiddler-store"
2020-07-28 12:10:58 +02:00
];
for(var t=0; t<containerSelectors.length; t++) {
var nodes = document.querySelectorAll(containerSelectors[t]);
for(var n=0; n<nodes.length; n++) {
$tw.wiki.addTiddlers($tw.wiki.deserializeTiddlers("(DOM)",nodes[n]));
}
2020-07-28 12:10:58 +02:00
}
};
} else {
/////////////////////////// Server definitions
/*
Get any encrypted tiddlers
*/
$tw.boot.decryptEncryptedTiddlers = function(callback) {
// Storing encrypted tiddlers on the server isn't supported yet
callback();
};
} // End of if($tw.browser && !$tw.node)
/////////////////////////// Node definitions
if($tw.node) {
/*
Load the tiddlers contained in a particular file (and optionally extract fields from the accompanying .meta file) returned as {filepath:,type:,tiddlers:[],hasMetaFile:}
*/
$tw.loadTiddlersFromFile = function(filepath,fields) {
var ext = path.extname(filepath),
extensionInfo = $tw.utils.getFileExtensionInfo(ext),
type = extensionInfo ? extensionInfo.type : null,
typeInfo = type ? $tw.config.contentTypeInfo[type] : null,
data = fs.readFileSync(filepath,typeInfo ? typeInfo.encoding : "utf8"),
tiddlers = $tw.wiki.deserializeTiddlers(ext,data,fields),
metadata = $tw.loadMetadataForFile(filepath);
if(metadata) {
if(type === "application/json") {
tiddlers = [{text: data, type: "application/json"}];
}
tiddlers = [$tw.utils.extend({},tiddlers[0],metadata)];
}
return {filepath: filepath, type: type, tiddlers: tiddlers, hasMetaFile: !!metadata};
};
/*
Load the metadata fields in the .meta file corresponding to a particular file
*/
$tw.loadMetadataForFile = function(filepath) {
var metafilename = filepath + ".meta";
if(fs.existsSync(metafilename)) {
return $tw.utils.parseFields(fs.readFileSync(metafilename,"utf8") || "");
} else {
return null;
}
};
/*
A default set of files for TiddlyWiki to ignore during load.
This matches what NPM ignores, and adds "*.meta" to ignore tiddler
metadata files.
*/
$tw.boot.excludeRegExp = /^\.DS_Store$|^.*\.meta$|^\..*\.swp$|^\._.*$|^\.git$|^\.github$|^\.vscode$|^\.hg$|^\.lock-wscript$|^\.svn$|^\.wafpickle-.*$|^CVS$|^npm-debug\.log$/;
2020-07-28 12:10:58 +02:00
/*
Load all the tiddlers recursively from a directory, including honouring `tiddlywiki.files` files for drawing in external files. Returns an array of {filepath:,type:,tiddlers: [{..fields...}],hasMetaFile:}. Note that no file information is returned for externally loaded tiddlers, just the `tiddlers` property.
*/
$tw.loadTiddlersFromPath = function(filepath,excludeRegExp) {
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
var tiddlers = [];
if(fs.existsSync(filepath)) {
var stat = fs.statSync(filepath);
if(stat.isDirectory()) {
var files = fs.readdirSync(filepath);
// Look for a tiddlywiki.files file
if(files.indexOf("tiddlywiki.files") !== -1) {
Array.prototype.push.apply(tiddlers,$tw.loadTiddlersFromSpecification(filepath,excludeRegExp));
} else {
// If not, read all the files in the directory
$tw.utils.each(files,function(file) {
if(!excludeRegExp.test(file) && file !== "plugin.info") {
tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(filepath + path.sep + file,excludeRegExp));
}
});
}
} else if(stat.isFile()) {
tiddlers.push($tw.loadTiddlersFromFile(filepath,{title: filepath}));
}
}
return tiddlers;
};
/*
Load all the tiddlers defined by a `tiddlywiki.files` specification file
filepath: pathname of the directory containing the specification file
*/
$tw.loadTiddlersFromSpecification = function(filepath,excludeRegExp) {
var tiddlers = [];
// Read the specification
var filesInfo = $tw.utils.parseJSONSafe(fs.readFileSync(filepath + path.sep + "tiddlywiki.files","utf8"));
2020-07-28 12:10:58 +02:00
// Helper to process a file
var processFile = function(filename,isTiddlerFile,fields,isEditableFile,rootPath) {
2020-07-28 12:10:58 +02:00
var extInfo = $tw.config.fileExtensionInfo[path.extname(filename)],
type = (extInfo || {}).type || fields.type || "text/plain",
typeInfo = $tw.config.contentTypeInfo[type] || {},
pathname = path.resolve(filepath,filename),
text = fs.readFileSync(pathname,typeInfo.encoding || "utf8"),
metadata = $tw.loadMetadataForFile(pathname) || {},
fileTiddlers;
if(isTiddlerFile) {
fileTiddlers = $tw.wiki.deserializeTiddlers(path.extname(pathname),text,metadata) || [];
} else {
fileTiddlers = [$tw.utils.extend({text: text},metadata)];
}
var combinedFields = $tw.utils.extend({},fields,metadata);
$tw.utils.each(fileTiddlers,function(tiddler) {
$tw.utils.each(combinedFields,function(fieldInfo,name) {
if(typeof fieldInfo === "string" || $tw.utils.isArray(fieldInfo)) {
tiddler[name] = fieldInfo;
} else {
var value = tiddler[name];
switch(fieldInfo.source) {
case "subdirectories":
value = path.relative(rootPath, filename).split('/').slice(0, -1);
break;
case "filepath":
value = path.relative(rootPath, filename);
break;
2020-07-28 12:10:58 +02:00
case "filename":
value = path.basename(filename);
break;
case "filename-uri-decoded":
value = $tw.utils.decodeURIComponentSafe(path.basename(filename));
2020-07-28 12:10:58 +02:00
break;
case "basename":
value = path.basename(filename,path.extname(filename));
break;
case "basename-uri-decoded":
value = $tw.utils.decodeURIComponentSafe(path.basename(filename,path.extname(filename)));
2020-07-28 12:10:58 +02:00
break;
case "extname":
value = path.extname(filename);
break;
case "created":
value = new Date(fs.statSync(pathname).birthtime);
break;
case "modified":
value = new Date(fs.statSync(pathname).mtime);
break;
}
if(fieldInfo.prefix) {
value = fieldInfo.prefix + value;
}
if(fieldInfo.suffix) {
value = value + fieldInfo.suffix;
}
tiddler[name] = value;
}
});
});
if(isEditableFile) {
tiddlers.push({filepath: pathname, hasMetaFile: !!metadata && !isTiddlerFile, isEditableFile: true, tiddlers: fileTiddlers});
} else {
tiddlers.push({tiddlers: fileTiddlers});
}
2020-07-28 12:10:58 +02:00
};
// Helper to recursively search subdirectories
var getAllFiles = function(dirPath, recurse, arrayOfFiles) {
recurse = recurse || false;
arrayOfFiles = arrayOfFiles || [];
var files = fs.readdirSync(dirPath);
files.forEach(function(file) {
if (recurse && fs.statSync(dirPath + path.sep + file).isDirectory()) {
arrayOfFiles = getAllFiles(dirPath + path.sep + file, recurse, arrayOfFiles);
} else if(fs.statSync(dirPath + path.sep + file).isFile()){
arrayOfFiles.push(path.join(dirPath, path.sep, file));
}
});
return arrayOfFiles;
}
2020-07-28 12:10:58 +02:00
// Process the listed tiddlers
$tw.utils.each(filesInfo.tiddlers,function(tidInfo) {
if(tidInfo.prefix && tidInfo.suffix) {
tidInfo.fields.text = {prefix: tidInfo.prefix,suffix: tidInfo.suffix};
} else if(tidInfo.prefix) {
tidInfo.fields.text = {prefix: tidInfo.prefix};
} else if(tidInfo.suffix) {
tidInfo.fields.text = {suffix: tidInfo.suffix};
}
processFile(tidInfo.file,tidInfo.isTiddlerFile,tidInfo.fields);
});
// Process any listed directories
$tw.utils.each(filesInfo.directories,function(dirSpec) {
// Read literal directories directly
if(typeof dirSpec === "string") {
var pathname = path.resolve(filepath,dirSpec);
if(fs.existsSync(pathname) && fs.statSync(pathname).isDirectory()) {
tiddlers.push.apply(tiddlers,$tw.loadTiddlersFromPath(pathname,excludeRegExp));
}
} else {
// Process directory specifier
var dirPath = path.resolve(filepath,dirSpec.path);
if(fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
var files = getAllFiles(dirPath, dirSpec.searchSubdirectories),
fileRegExp = new RegExp(dirSpec.filesRegExp || "^.*$"),
metaRegExp = /^.*\.meta$/;
for(var t=0; t<files.length; t++) {
var thisPath = path.relative(filepath, files[t]),
filename = path.basename(thisPath);
if(filename !== "tiddlywiki.files" && !metaRegExp.test(filename) && fileRegExp.test(filename)) {
processFile(thisPath,dirSpec.isTiddlerFile,dirSpec.fields,dirSpec.isEditableFile,dirSpec.path);
}
2020-07-28 12:10:58 +02:00
}
} else {
console.log("Warning: a directory in a tiddlywiki.files file does not exist.");
console.log("dirPath: " + dirPath);
console.log("tiddlywiki.files location: " + filepath);
2020-07-28 12:10:58 +02:00
}
}
});
return tiddlers;
};
/*
Load the tiddlers from a plugin folder, and package them up into a proper JSON plugin tiddler
*/
$tw.loadPluginFolder = function(filepath,excludeRegExp) {
excludeRegExp = excludeRegExp || $tw.boot.excludeRegExp;
var infoPath = filepath + path.sep + "plugin.info";
if(fs.existsSync(filepath) && fs.statSync(filepath).isDirectory()) {
// Read the plugin information
if(!fs.existsSync(infoPath) || !fs.statSync(infoPath).isFile()) {
console.log("Warning: missing plugin.info file in " + filepath);
return null;
}
var pluginInfo = $tw.utils.parseJSONSafe(fs.readFileSync(infoPath,"utf8"),function() {return null;});
if(!pluginInfo) {
console.log("warning: invalid JSON in plugin.info file at " + infoPath);
pluginInfo = {};
}
2020-07-28 12:10:58 +02:00
// Read the plugin files
var pluginFiles = $tw.loadTiddlersFromPath(filepath,excludeRegExp);
// Save the plugin tiddlers into the plugin info
pluginInfo.tiddlers = pluginInfo.tiddlers || Object.create(null);
for(var f=0; f<pluginFiles.length; f++) {
var tiddlers = pluginFiles[f].tiddlers;
for(var t=0; t<tiddlers.length; t++) {
var tiddler= tiddlers[t];
if(tiddler.title) {
pluginInfo.tiddlers[tiddler.title] = tiddler;
}
}
}
// Give the plugin the same version number as the core if it doesn't have one
if(!("version" in pluginInfo)) {
pluginInfo.version = $tw.packageInfo.version;
}
// Use "plugin" as the plugin-type if we don't have one
if(!("plugin-type" in pluginInfo)) {
pluginInfo["plugin-type"] = "plugin";
}
pluginInfo.dependents = pluginInfo.dependents || [];
pluginInfo.type = "application/json";
// Set plugin text
pluginInfo.text = JSON.stringify({tiddlers: pluginInfo.tiddlers});
2020-07-28 12:10:58 +02:00
delete pluginInfo.tiddlers;
// Deserialise array fields (currently required for the dependents field)
for(var field in pluginInfo) {
if($tw.utils.isArray(pluginInfo[field])) {
pluginInfo[field] = $tw.utils.stringifyList(pluginInfo[field]);
}
}
return pluginInfo;
} else {
return null;
}
};
/*
name: Name of the plugin to find
paths: array of file paths to search for it
Returns the path of the plugin folder
*/
$tw.findLibraryItem = function(name,paths) {
var pathIndex = 0;
do {
var pluginPath = path.resolve(paths[pathIndex],"./" + name)
if(fs.existsSync(pluginPath) && fs.statSync(pluginPath).isDirectory()) {
return pluginPath;
}
} while(++pathIndex < paths.length);
return null;
};
/*
name: Name of the plugin to load
paths: array of file paths to search for it
*/
$tw.loadPlugin = function(name,paths) {
var pluginPath = $tw.findLibraryItem(name,paths);
if(pluginPath) {
var pluginFields = $tw.loadPluginFolder(pluginPath);
if(pluginFields) {
$tw.wiki.addTiddler(pluginFields);
return;
}
}
console.log("Warning: Cannot find plugin '" + name + "'");
};
/*
libraryPath: Path of library folder for these plugins (relative to core path)
envVar: Environment variable name for these plugins
Returns an array of search paths
*/
$tw.getLibraryItemSearchPaths = function(libraryPath,envVar) {
var pluginPaths = [path.resolve($tw.boot.corePath,libraryPath)],
env = process.env[envVar];
if(env) {
env.split(path.delimiter).map(function(item) {
if(item) {
pluginPaths.push(item);
}
});
}
return pluginPaths;
};
/*
plugins: Array of names of plugins (eg, "tiddlywiki/filesystemadaptor")
libraryPath: Path of library folder for these plugins (relative to core path)
envVar: Environment variable name for these plugins
*/
$tw.loadPlugins = function(plugins,libraryPath,envVar) {
if(plugins) {
var pluginPaths = $tw.getLibraryItemSearchPaths(libraryPath,envVar);
for(var t=0; t<plugins.length; t++) {
$tw.loadPlugin(plugins[t],pluginPaths);
}
}
};
/*
path: path of wiki directory
options:
parentPaths: array of parent paths that we mustn't recurse into
readOnly: true if the tiddler file paths should not be retained
*/
$tw.loadWikiTiddlers = function(wikiPath,options) {
options = options || {};
var parentPaths = options.parentPaths || [],
wikiInfoPath = path.resolve(wikiPath,$tw.config.wikiInfo),
wikiInfo,
pluginFields;
// Bail if we don't have a wiki info file
if(fs.existsSync(wikiInfoPath)) {
wikiInfo = $tw.utils.parseJSONSafe(fs.readFileSync(wikiInfoPath,"utf8"),function() {return null;});
if(!wikiInfo) {
console.log("warning: invalid JSON in tiddlywiki.info file at " + wikiInfoPath);
wikiInfo = {};
}
2020-07-28 12:10:58 +02:00
} else {
return null;
}
// Save the path to the tiddlers folder for the filesystemadaptor
var config = wikiInfo.config || {};
if($tw.boot.wikiPath == wikiPath) {
$tw.boot.wikiTiddlersPath = path.resolve($tw.boot.wikiPath,config["default-tiddler-location"] || $tw.config.wikiTiddlersSubDir);
}
2020-07-28 12:10:58 +02:00
// Load any parent wikis
if(wikiInfo.includeWikis) {
parentPaths = parentPaths.slice(0);
parentPaths.push(wikiPath);
$tw.utils.each(wikiInfo.includeWikis,function(info) {
if(typeof info === "string") {
info = {path: info};
}
var resolvedIncludedWikiPath = path.resolve(wikiPath,info.path);
if(parentPaths.indexOf(resolvedIncludedWikiPath) === -1) {
var subWikiInfo = $tw.loadWikiTiddlers(resolvedIncludedWikiPath,{
parentPaths: parentPaths,
readOnly: info["read-only"]
});
// Merge the build targets
wikiInfo.build = $tw.utils.extend([],subWikiInfo.build,wikiInfo.build);
} else {
$tw.utils.error("Cannot recursively include wiki " + resolvedIncludedWikiPath);
}
});
}
// Load any plugins, themes and languages listed in the wiki info file
$tw.loadPlugins(wikiInfo.plugins,$tw.config.pluginsPath,$tw.config.pluginsEnvVar);
$tw.loadPlugins(wikiInfo.themes,$tw.config.themesPath,$tw.config.themesEnvVar);
$tw.loadPlugins(wikiInfo.languages,$tw.config.languagesPath,$tw.config.languagesEnvVar);
// Load the wiki files, registering them as writable
var resolvedWikiPath = path.resolve(wikiPath,$tw.config.wikiTiddlersSubDir);
$tw.utils.each($tw.loadTiddlersFromPath(resolvedWikiPath),function(tiddlerFile) {
if(!options.readOnly && tiddlerFile.filepath) {
$tw.utils.each(tiddlerFile.tiddlers,function(tiddler) {
$tw.boot.files[tiddler.title] = {
filepath: tiddlerFile.filepath,
type: tiddlerFile.type,
hasMetaFile: tiddlerFile.hasMetaFile,
isEditableFile: config["retain-original-tiddler-path"] || tiddlerFile.isEditableFile || tiddlerFile.filepath.indexOf($tw.boot.wikiTiddlersPath) !== 0
2020-07-28 12:10:58 +02:00
};
});
}
$tw.wiki.addTiddlers(tiddlerFile.tiddlers);
});
if ($tw.boot.wikiPath == wikiPath) {
// Save the original tiddler file locations if requested
var output = {}, relativePath, fileInfo;
2020-07-28 12:10:58 +02:00
for(var title in $tw.boot.files) {
fileInfo = $tw.boot.files[title];
if(fileInfo.isEditableFile) {
relativePath = path.relative($tw.boot.wikiTiddlersPath,fileInfo.filepath);
fileInfo.originalpath = relativePath;
output[title] =
path.sep === "/" ?
relativePath :
relativePath.split(path.sep).join("/");
}
}
if(Object.keys(output).length > 0){
$tw.wiki.addTiddler({title: "$:/config/OriginalTiddlerPaths", type: "application/json", text: JSON.stringify(output)});
2020-07-28 12:10:58 +02:00
}
}
// Load any plugins within the wiki folder
var wikiPluginsPath = path.resolve(wikiPath,$tw.config.wikiPluginsSubDir);
if(fs.existsSync(wikiPluginsPath)) {
var pluginFolders = fs.readdirSync(wikiPluginsPath);
for(var t=0; t<pluginFolders.length; t++) {
pluginFields = $tw.loadPluginFolder(path.resolve(wikiPluginsPath,"./" + pluginFolders[t]));
if(pluginFields) {
$tw.wiki.addTiddler(pluginFields);
}
}
}
// Load any themes within the wiki folder
var wikiThemesPath = path.resolve(wikiPath,$tw.config.wikiThemesSubDir);
if(fs.existsSync(wikiThemesPath)) {
var themeFolders = fs.readdirSync(wikiThemesPath);
for(var t=0; t<themeFolders.length; t++) {
pluginFields = $tw.loadPluginFolder(path.resolve(wikiThemesPath,"./" + themeFolders[t]));
if(pluginFields) {
$tw.wiki.addTiddler(pluginFields);
}
}
}
// Load any languages within the wiki folder
var wikiLanguagesPath = path.resolve(wikiPath,$tw.config.wikiLanguagesSubDir);
if(fs.existsSync(wikiLanguagesPath)) {
var languageFolders = fs.readdirSync(wikiLanguagesPath);
for(var t=0; t<languageFolders.length; t++) {
pluginFields = $tw.loadPluginFolder(path.resolve(wikiLanguagesPath,"./" + languageFolders[t]));
if(pluginFields) {
$tw.wiki.addTiddler(pluginFields);
}
}
}
return wikiInfo;
};
$tw.loadTiddlersNode = function() {
// Load the boot tiddlers
$tw.utils.each($tw.loadTiddlersFromPath($tw.boot.bootPath),function(tiddlerFile) {
$tw.wiki.addTiddlers(tiddlerFile.tiddlers);
});
// Load the core tiddlers
$tw.wiki.addTiddler($tw.loadPluginFolder($tw.boot.corePath));
// Load any extra plugins
$tw.utils.each($tw.boot.extraPlugins,function(name) {
if(name.charAt(0) === "+") { // Relative path to plugin
var pluginFields = $tw.loadPluginFolder(name.substring(1));
2020-07-28 12:10:58 +02:00
if(pluginFields) {
$tw.wiki.addTiddler(pluginFields);
}
} else {
var parts = name.split("/"),
type = parts[0];
if(parts.length === 3 && ["plugins","themes","languages"].indexOf(type) !== -1) {
$tw.loadPlugins([parts[1] + "/" + parts[2]],$tw.config[type + "Path"],$tw.config[type + "EnvVar"]);
}
2020-07-28 12:10:58 +02:00
}
});
// Load the tiddlers from the wiki directory
if($tw.boot.wikiPath) {
$tw.boot.wikiInfo = $tw.loadWikiTiddlers($tw.boot.wikiPath);
}
};
// End of if($tw.node)
}
/////////////////////////// Main startup function called once tiddlers have been decrypted
/*
Startup TiddlyWiki
*/
$tw.boot.initStartup = function(options) {
2020-07-28 12:10:58 +02:00
// Get the URL hash and check for safe mode
$tw.locationHash = "#";
if($tw.browser && !$tw.node) {
if(location.hash === "#:safe") {
$tw.safeMode = true;
} else {
$tw.locationHash = $tw.utils.getLocationHash();
}
}
// Initialise some more $tw properties
$tw.utils.deepDefaults($tw,{
modules: { // Information about each module
titles: Object.create(null), // hashmap by module title of {fn:, exports:, moduleType:}
types: {} // hashmap by module type of hashmap of exports
},
config: { // Configuration overridables
pluginsPath: "../plugins/",
themesPath: "../themes/",
languagesPath: "../languages/",
editionsPath: "../editions/",
wikiInfo: "./tiddlywiki.info",
wikiPluginsSubDir: "./plugins",
wikiThemesSubDir: "./themes",
wikiLanguagesSubDir: "./languages",
wikiTiddlersSubDir: "./tiddlers",
wikiOutputSubDir: "./output",
jsModuleHeaderRegExpString: "^\\/\\*\\\\(?:\\r?\\n)((?:^[^\\r\\n]*(?:\\r?\\n))+?)(^\\\\\\*\\/$(?:\\r?\\n)?)",
fileExtensionInfo: Object.create(null), // Map file extension to {type:}
contentTypeInfo: Object.create(null), // Map type to {encoding:,extension:}
pluginsEnvVar: "TIDDLYWIKI_PLUGIN_PATH",
themesEnvVar: "TIDDLYWIKI_THEME_PATH",
languagesEnvVar: "TIDDLYWIKI_LANGUAGE_PATH",
editionsEnvVar: "TIDDLYWIKI_EDITION_PATH"
},
log: {}, // Log flags
unloadTasks: []
});
if(!$tw.boot.tasks.readBrowserTiddlers) {
// For writable tiddler files, a hashmap of title to {filepath:,type:,hasMetaFile:}
$tw.boot.files = Object.create(null);
// System paths and filenames
$tw.boot.bootPath = options.bootPath || path.dirname(module.filename);
$tw.boot.corePath = path.resolve($tw.boot.bootPath,"../core");
// If there's no arguments then default to `--help`
if($tw.boot.argv.length === 0) {
$tw.boot.argv = ["--help"];
}
// Parse any extra plugin references
$tw.boot.extraPlugins = $tw.boot.extraPlugins || [];
while($tw.boot.argv[0] && $tw.boot.argv[0].indexOf("+") === 0) {
$tw.boot.extraPlugins.push($tw.boot.argv[0].substring(1));
$tw.boot.argv.splice(0,1);
}
// If the first command line argument doesn't start with `--` then we
// interpret it as the path to the wiki folder, which will otherwise default
// to the current folder
if($tw.boot.argv[0] && $tw.boot.argv[0].indexOf("--") !== 0) {
$tw.boot.wikiPath = $tw.boot.argv[0];
$tw.boot.argv = $tw.boot.argv.slice(1);
} else {
$tw.boot.wikiPath = process.cwd();
}
// Read package info
$tw.packageInfo = $tw.packageInfo || require("../package.json");
// Check node version number
if(!$tw.utils.checkVersions(process.version.substr(1),$tw.packageInfo.engines.node.substr(2))) {
$tw.utils.error("TiddlyWiki5 requires node.js version " + $tw.packageInfo.engines.node);
}
}
// Add file extension information
$tw.utils.registerFileType("text/vnd.tiddlywiki","utf8",".tid");
$tw.utils.registerFileType("application/x-tiddler","utf8",".tid");
$tw.utils.registerFileType("application/x-tiddlers","utf8",".multids");
$tw.utils.registerFileType("application/x-tiddler-html-div","utf8",".tiddler");
$tw.utils.registerFileType("text/vnd.tiddlywiki2-recipe","utf8",".recipe");
$tw.utils.registerFileType("text/plain","utf8",".txt");
$tw.utils.registerFileType("text/css","utf8",".css");
$tw.utils.registerFileType("text/html","utf8",[".html",".htm"]);
$tw.utils.registerFileType("application/hta","utf16le",".hta",{deserializerType:"text/html"});
$tw.utils.registerFileType("application/javascript","utf8",".js");
$tw.utils.registerFileType("application/json","utf8",".json");
$tw.utils.registerFileType("application/pdf","base64",".pdf",{flags:["image"]});
$tw.utils.registerFileType("application/zip","base64",".zip");
$tw.utils.registerFileType("application/x-zip-compressed","base64",".zip");
$tw.utils.registerFileType("image/jpeg","base64",[".jpg",".jpeg"],{flags:["image"]});
$tw.utils.registerFileType("image/jpg","base64",[".jpg",".jpeg"],{flags:["image"]});
2020-07-28 12:10:58 +02:00
$tw.utils.registerFileType("image/png","base64",".png",{flags:["image"]});
$tw.utils.registerFileType("image/gif","base64",".gif",{flags:["image"]});
$tw.utils.registerFileType("image/webp","base64",".webp",{flags:["image"]});
$tw.utils.registerFileType("image/heic","base64",".heic",{flags:["image"]});
$tw.utils.registerFileType("image/heif","base64",".heif",{flags:["image"]});
$tw.utils.registerFileType("image/svg+xml","utf8",".svg",{flags:["image"]});
$tw.utils.registerFileType("image/vnd.microsoft.icon","base64",".ico",{flags:["image"]});
2020-07-28 12:10:58 +02:00
$tw.utils.registerFileType("image/x-icon","base64",".ico",{flags:["image"]});
$tw.utils.registerFileType("application/font-woff","base64",".woff");
$tw.utils.registerFileType("application/x-font-ttf","base64",".woff");
$tw.utils.registerFileType("application/font-woff2","base64",".woff2");
$tw.utils.registerFileType("audio/ogg","base64",".ogg");
$tw.utils.registerFileType("audio/mp4","base64",[".mp4",".m4a"]);
2020-07-28 12:10:58 +02:00
$tw.utils.registerFileType("video/ogg","base64",[".ogm",".ogv",".ogg"]);
$tw.utils.registerFileType("video/webm","base64",".webm");
$tw.utils.registerFileType("video/mp4","base64",".mp4");
$tw.utils.registerFileType("audio/mp3","base64",".mp3");
$tw.utils.registerFileType("audio/mpeg","base64",[".mp3",".m2a",".mp2",".mpa",".mpg",".mpga"]);
2020-07-28 12:10:58 +02:00
$tw.utils.registerFileType("text/markdown","utf8",[".md",".markdown"],{deserializerType:"text/x-markdown"});
$tw.utils.registerFileType("text/x-markdown","utf8",[".md",".markdown"]);
$tw.utils.registerFileType("application/enex+xml","utf8",".enex");
$tw.utils.registerFileType("application/vnd.openxmlformats-officedocument.wordprocessingml.document","base64",".docx");
$tw.utils.registerFileType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet","base64",".xlsx");
$tw.utils.registerFileType("application/vnd.openxmlformats-officedocument.presentationml.presentation","base64",".pptx");
$tw.utils.registerFileType("text/x-bibtex","utf8",".bib",{deserializerType:"application/x-bibtex"});
$tw.utils.registerFileType("application/x-bibtex","utf8",".bib");
$tw.utils.registerFileType("application/epub+zip","base64",".epub");
$tw.utils.registerFileType("application/octet-stream","base64",".octet-stream");
// Create the wiki store for the app
$tw.wiki = new $tw.Wiki($tw.safeMode && {enableIndexers: []});
2020-07-28 12:10:58 +02:00
// Install built in tiddler fields modules
$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap("tiddlerfield");
// Install the tiddler deserializer modules
$tw.Wiki.tiddlerDeserializerModules = Object.create(null);
$tw.modules.applyMethods("tiddlerdeserializer",$tw.Wiki.tiddlerDeserializerModules);
// Call unload handlers in the browser
if($tw.browser) {
window.onbeforeunload = function(event) {
event = event || {};
var result;
$tw.utils.each($tw.unloadTasks,function(task) {
var r = task(event);
if(r) {
result = r;
}
});
return result;
}
}
};
$tw.boot.loadStartup = function(options){
2020-07-28 12:10:58 +02:00
// Load tiddlers
if($tw.boot.tasks.readBrowserTiddlers) {
$tw.loadTiddlersBrowser();
} else {
$tw.loadTiddlersNode();
}
// Load any preloaded tiddlers
if($tw.preloadTiddlers) {
$tw.wiki.addTiddlers($tw.preloadTiddlers);
}
// Give hooks a chance to modify the store
$tw.hooks.invokeHook("th-boot-tiddlers-loaded");
}
$tw.boot.execStartup = function(options){
2020-07-28 12:10:58 +02:00
// Unpack plugin tiddlers
$tw.wiki.readPluginInfo();
$tw.wiki.registerPluginTiddlers("plugin",$tw.safeMode ? ["$:/core"] : undefined);
$tw.wiki.unpackPluginTiddlers();
// Process "safe mode"
if($tw.safeMode) {
$tw.wiki.processSafeMode();
}
// Register typed modules from the tiddlers we've just loaded
$tw.wiki.defineTiddlerModules();
// And any modules within plugins
$tw.wiki.defineShadowModules();
// Make sure the crypto state tiddler is up to date
if($tw.crypto) {
$tw.crypto.updateCryptoStateTiddler();
}
// Gather up any startup modules
$tw.boot.remainingStartupModules = []; // Array of startup modules
$tw.modules.forEachModuleOfType("startup",function(title,module) {
if(module.startup) {
$tw.boot.remainingStartupModules.push(module);
}
});
// Keep track of the startup tasks that have been executed
$tw.boot.executedStartupModules = Object.create(null);
$tw.boot.disabledStartupModules = $tw.boot.disabledStartupModules || [];
// Repeatedly execute the next eligible task
$tw.boot.executeNextStartupTask(options.callback);
}
/*
Startup TiddlyWiki
*/
$tw.boot.startup = function(options) {
options = options || {};
// Get the URL hash and check for safe mode
$tw.boot.initStartup(options);
$tw.boot.loadStartup(options);
$tw.boot.execStartup(options);
2020-07-28 12:10:58 +02:00
};
/*
Add another unload task
*/
$tw.addUnloadTask = function(task) {
if($tw.unloadTasks.indexOf(task) === -1) {
$tw.unloadTasks.push(task);
}
}
/*
Execute the remaining eligible startup tasks
*/
$tw.boot.executeNextStartupTask = function(callback) {
// Find the next eligible task
var taskIndex = 0, task,
asyncTaskCallback = function() {
if(task.name) {
$tw.boot.executedStartupModules[task.name] = true;
}
return $tw.boot.executeNextStartupTask(callback);
};
while(taskIndex < $tw.boot.remainingStartupModules.length) {
task = $tw.boot.remainingStartupModules[taskIndex];
if($tw.boot.isStartupTaskEligible(task)) {
// Remove this task from the list
$tw.boot.remainingStartupModules.splice(taskIndex,1);
// Assemble log message
var s = ["Startup task:",task.name];
if(task.platforms) {
s.push("platforms:",task.platforms.join(","));
}
if(task.after) {
s.push("after:",task.after.join(","));
}
if(task.before) {
s.push("before:",task.before.join(","));
}
$tw.boot.log(s.join(" "));
// Execute task
if(!$tw.utils.hop(task,"synchronous") || task.synchronous) {
task.startup();
if(task.name) {
$tw.boot.executedStartupModules[task.name] = true;
}
return $tw.boot.executeNextStartupTask(callback);
} else {
task.startup(asyncTaskCallback);
return true;
}
}
taskIndex++;
}
if(typeof callback === 'function') {
callback();
}
return false;
};
/*
Returns true if we are running on one of the platforms specified in taskModule's
`platforms` array; or if `platforms` property is not defined.
2020-07-28 12:10:58 +02:00
*/
$tw.boot.doesTaskMatchPlatform = function(taskModule) {
var platforms = taskModule.platforms;
if(platforms) {
for(var t=0; t<platforms.length; t++) {
switch (platforms[t]) {
case "browser":
if ($tw.browser) {
return true;
}
break;
case "node":
if ($tw.node) {
return true;
}
break;
default:
$tw.utils.error("Module " + taskModule.name + ": '" + platforms[t] + "' in export.platforms invalid");
2020-07-28 12:10:58 +02:00
}
}
return false;
2020-07-28 12:10:58 +02:00
}
return true;
};
$tw.boot.isStartupTaskEligible = function(taskModule) {
var t;
// Check that the platform is correct
if(!$tw.boot.doesTaskMatchPlatform(taskModule)) {
return false;
}
var name = taskModule.name,
remaining = $tw.boot.remainingStartupModules;
if(name) {
// Fail if this module is disabled
if($tw.boot.disabledStartupModules.indexOf(name) !== -1) {
return false;
}
// Check that no other outstanding tasks must be executed before this one
for(t=0; t<remaining.length; t++) {
var task = remaining[t];
if(task.before && task.before.indexOf(name) !== -1) {
if($tw.boot.doesTaskMatchPlatform(task) && (!task.name || $tw.boot.disabledStartupModules.indexOf(task.name) === -1)) {
2020-07-28 12:10:58 +02:00
return false;
}
}
}
}
// Check that all of the tasks that we must be performed after has been done
var after = taskModule.after;
if(after) {
for(t=0; t<after.length; t++) {
if(!$tw.boot.executedStartupModules[after[t]]) {
return false;
}
}
}
return true;
};
/*
Global Hooks mechanism which allows plugins to modify default functionality
*/
$tw.hooks = $tw.hooks || { names: {}};
/*
Add hooks to the hashmap
*/
$tw.hooks.addHook = function(hookName,definition) {
if($tw.utils.hop($tw.hooks.names,hookName)) {
$tw.hooks.names[hookName].push(definition);
}
else {
$tw.hooks.names[hookName] = [definition];
}
};
/*
Invoke the hook by key
*/
$tw.hooks.invokeHook = function(hookName /*, value,... */) {
var args = Array.prototype.slice.call(arguments,1);
if($tw.utils.hop($tw.hooks.names,hookName)) {
for (var i = 0; i < $tw.hooks.names[hookName].length; i++) {
args[0] = $tw.hooks.names[hookName][i].apply(null,args);
}
}
return args[0];
};
/////////////////////////// Main boot function to decrypt tiddlers and then startup
$tw.boot.boot = function(callback) {
// Initialise crypto object
$tw.crypto = new $tw.utils.Crypto();
// Initialise password prompter
if($tw.browser && !$tw.node) {
$tw.passwordPrompt = new $tw.utils.PasswordPrompt();
}
// Preload any encrypted tiddlers
$tw.boot.decryptEncryptedTiddlers(function() {
// Startup
$tw.boot.startup({callback: callback});
});
};
/////////////////////////// Autoboot in the browser
if($tw.browser && !$tw.boot.suppressBoot) {
$tw.boot.boot();
}
return $tw;
});
if(typeof(exports) !== "undefined") {
exports.TiddlyWiki = _boot;
} else {
_boot(window.$tw);
}
//# sourceURL=$:/boot/boot.js
2020-07-28 12:10:58 +02:00
</script>
</div>
<!--~~ Raw markup for the bottom of the body section ~~-->
</body>
</html>